diff --git a/.github/alternate_byond_versions.txt b/.github/alternate_byond_versions.txt index 7b50af46885..111e573827e 100644 --- a/.github/alternate_byond_versions.txt +++ b/.github/alternate_byond_versions.txt @@ -5,3 +5,4 @@ # Format is version: map # Example: # 500.1337: runtimestation +515.1621: runtimestation diff --git a/.tgs.yml b/.tgs.yml index bb6077faaab..880ca67a61b 100644 --- a/.tgs.yml +++ b/.tgs.yml @@ -3,7 +3,7 @@ version: 1 # The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job) # Must be interpreted as a string, keep quoted -byond: "515.1620" +byond: "515.1630" # Folders to create in "/Configuration/GameStaticFiles/" static_files: # Config directory should be static diff --git a/SQL/database_changelog.md b/SQL/database_changelog.md index 5e8317a8f85..48090d7f212 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -2,19 +2,32 @@ Any time you make a change to the schema files, remember to increment the databa Make sure to also update `DB_MAJOR_VERSION` and `DB_MINOR_VERSION`, which can be found in `code/__DEFINES/subsystem.dm`. -The latest database version is 5.28 (5.26 for /tg/); The query to update the schema revision table is: +The latest database version is 5.29 (5.26 for /tg/); The query to update the schema revision table is: ```sql -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 28); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 29); ``` or ```sql -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 28); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 29); ``` In any query remember to add a prefix to the table names if you use one. +----------------------------------------------------- +Version 5.29, 08 January 2024, by distributivgesetz +Add a new table for age-checking purposes. Optional if you don't ever intend to use the age prompt. + +```sql +CREATE TABLE `player_dob` ( + `ckey` VARCHAR(32) NOT NULL, + `dob_year` smallint(5) NOT NULL, + `dob_month` smallint(5) NOT NULL, + PRIMARY KEY (`ckey`) +); +``` + ----------------------------------------------------- Version 5.28, 03 December 2023, by distributivgesetz Set the default value of cloneloss to 0, as it's obsolete and it won't be set by blackbox anymore. diff --git a/SQL/skyrat_schema.sql b/SQL/skyrat_schema.sql index 4eb4ac4f68d..eef8adb9ca9 100644 --- a/SQL/skyrat_schema.sql +++ b/SQL/skyrat_schema.sql @@ -9,6 +9,22 @@ /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `player_dob`. +-- +DROP TABLE IF EXISTS `player_dob`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `player_dob` ( + `ckey` VARCHAR(32) NOT NULL, + `dob_year` smallint(5) NOT NULL, + `dob_month` smallint(5) NOT NULL, + PRIMARY KEY (`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + + -- -- Table structure for table `player_rank`. -- diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm new file mode 100644 index 00000000000..51584f90f86 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm @@ -0,0 +1,27 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"l" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"L" = ( +/obj/structure/ore_vent/random/icebox, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) + +(1,1,1) = {" +a +l +a +"} +(2,1,1) = {" +l +L +l +"} +(3,1,1) = {" +a +l +a +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm new file mode 100644 index 00000000000..db409d08c8c --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm @@ -0,0 +1,27 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"l" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored) +"L" = ( +/obj/structure/ore_vent/random/icebox/lower, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored) + +(1,1,1) = {" +a +l +a +"} +(2,1,1) = {" +l +L +l +"} +(3,1,1) = {" +a +l +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index ef650913f14..bcc82db11fd 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -333,7 +333,7 @@ /area/ruin/powered/clownplanet) "bZ" = ( /obj/machinery/door/airlock/bananium, -/turf/open/indestructible/honk, +/turf/open/floor/carpet, /area/ruin/powered/clownplanet) "ca" = ( /obj/item/bikehorn, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ore_vent.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ore_vent.dmm new file mode 100644 index 00000000000..6379b7f084b --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ore_vent.dmm @@ -0,0 +1,27 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"l" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"L" = ( +/obj/structure/ore_vent/random, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +a +l +a +"} +(2,1,1) = {" +l +L +l +"} +(3,1,1) = {" +a +l +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 7497b5bb907..53e68125e29 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -62,9 +62,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"aL" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/testlab) "aM" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -5700,7 +5697,7 @@ pa pa ae ae -aL +ae ae ae ae @@ -5999,7 +5996,7 @@ ab ab as as -as +PW dI NE ew diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm index 8aa85a7e153..5528fe4aeac 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm @@ -1069,12 +1069,11 @@ pixel_y = 8 }, /obj/machinery/light/warm, -/obj/machinery/power/apc{ - cell_type = /obj/item/stock_parts/cell/lead; - locked = 0; - pixel_y = -25; - start_charge = 0 +/obj/machinery/power/apc/auto_name/directional/south{ + cell_type = /obj/item/stock_parts/cell/lead }, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/unlocked, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/foodwaste) diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm index 9813823daeb..61b0ee1aca8 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm @@ -536,12 +536,11 @@ pixel_y = 8 }, /obj/machinery/light/warm, -/obj/machinery/power/apc{ - cell_type = /obj/item/stock_parts/cell/lead; - locked = 0; - pixel_y = -25; - start_charge = 0 +/obj/machinery/power/apc/auto_name/directional/south{ + cell_type = /obj/item/stock_parts/cell/lead }, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/unlocked, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/medicalwaste) diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm index c2da1e7646c..502401361ae 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm @@ -469,12 +469,11 @@ pixel_y = 8 }, /obj/machinery/light/warm, -/obj/machinery/power/apc{ - cell_type = /obj/item/stock_parts/cell/lead; - locked = 0; - pixel_y = -25; - start_charge = 0 +/obj/machinery/power/apc/auto_name/directional/south{ + cell_type = /obj/item/stock_parts/cell/lead }, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/unlocked, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/squat) diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm index a636b7220ca..2123b838f94 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm @@ -652,12 +652,11 @@ pixel_y = 8 }, /obj/machinery/light/warm, -/obj/machinery/power/apc{ - cell_type = /obj/item/stock_parts/cell/lead; - locked = 0; - pixel_y = -25; - start_charge = 0 +/obj/machinery/power/apc/auto_name/directional/south{ + cell_type = /obj/item/stock_parts/cell/lead }, +/obj/effect/mapping_helpers/apc/no_charge, +/obj/effect/mapping_helpers/apc/unlocked, /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/ruin/space/has_grav/garbagetruck/toystore) diff --git a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm index 86ea8c855cc..71074aa4451 100644 --- a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm +++ b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm @@ -74,7 +74,7 @@ /turf/open/floor/oldshuttle, /area/ruin/space/has_grav/powered) "t" = ( -/obj/machinery/power/generator, +/obj/machinery/power/thermoelectric_generator, /turf/open/floor/oldshuttle, /area/ruin/space/has_grav/powered) "u" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm index 99ba6f32bc0..c9759f23446 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm @@ -1177,6 +1177,7 @@ /obj/effect/turf_decal/siding/dark{ dir = 10 }, +/obj/machinery/recharger, /turf/open/floor/plating, /area/ruin/space/has_grav/skyrat/interdynefob/engineering) "eU" = ( @@ -8113,6 +8114,7 @@ pixel_x = 2; pixel_y = 5 }, +/obj/machinery/recharger, /turf/open/floor/wood/large, /area/ruin/space/has_grav/skyrat/interdynefob/bridge/cl) "LT" = ( @@ -11173,6 +11175,7 @@ c_tag = "DS-2 Research"; network = list("ds2") }, +/obj/machinery/recharger, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/skyrat/interdynefob/research) "YU" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm index 4b47dae5a74..15bea6e9660 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm @@ -1,108 +1,7494 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"cw" = ( +"ab" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"ae" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"af" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"ah" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"ai" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"ak" = ( +/obj/machinery/atmospherics/miner/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"al" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/paper/fluff/ruins/oldstation/generator_manual, +/obj/item/wirecutters, +/obj/item/wrench, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"am" = ( +/obj/structure/closet, +/obj/item/clothing/under/tarkon/eng, +/obj/item/clothing/under/tarkon/eng, +/obj/item/clothing/under/tarkon/eng, +/obj/item/clothing/under/tarkon/eng, +/obj/item/clothing/under/tarkon/eng, +/obj/item/clothing/under/tarkon/eng, +/obj/item/storage/backpack/duffelbag/engineering, +/obj/item/storage/backpack/industrial, +/obj/item/storage/backpack/messenger/eng, +/obj/item/storage/backpack/satchel/eng, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"aq" = ( +/obj/structure/cable, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"ar" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"at" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"av" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/weeds/node, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"ax" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"aD" = ( +/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/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"aG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"aI" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/developement) +"aJ" = ( +/obj/structure/fence/corner, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"aM" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/structure/cable, +/obj/structure/closet/crate/radiation, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"aR" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"aT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"aY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"bb" = ( +/obj/structure/alien/resin/wall, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"be" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/module_duplicator, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"bf" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/machinery/button/polarizer{ + id = "tarkondisects"; + pixel_x = 31 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"bg" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/half, +/obj/effect/mob_spawn/ghost_role/human/tarkon/cargo{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"bj" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/item/storage/toolbox/mechanical, +/obj/item/experi_scanner, +/obj/item/experi_scanner, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"bk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"bl" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + req_access = list("tarkon") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters{ + id = "ptcell1" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"bp" = ( +/obj/machinery/cryopod, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"br" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/machinery/door/window/left/directional/west{ + opacity = 1 + }, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"bt" = ( +/turf/closed/mineral/random/high_chance, +/area/ruin/space/has_grav) +"bA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"bB" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/observ) +"bD" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"bF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"bH" = ( +/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/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"bL" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Public Observatory" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"bM" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/pink/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"bO" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Engineering" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor/solid, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"bS" = ( +/obj/machinery/modular_computer/console{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"bT" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"bU" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/twenty, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"bY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"cl" = ( +/obj/machinery/biogenerator/food_replicator, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"cm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"cn" = ( +/obj/structure/closet, +/obj/item/clothing/under/tarkon/sec, +/obj/item/clothing/under/tarkon/sec, +/obj/item/clothing/under/tarkon/sec, +/obj/item/clothing/under/tarkon/sec, +/obj/item/clothing/under/tarkon/sec, +/obj/item/clothing/under/tarkon/sec, +/obj/item/storage/backpack/duffelbag/sec/redsec, +/obj/item/storage/backpack/satchel/sec/redsec, +/obj/item/storage/backpack/security/redsec, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"ct" = ( +/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/tile/purple/half, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"cu" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/obj/machinery/computer/order_console/mining{ + express_cost_multiplier = 1; + forced_express = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"cv" = ( +/obj/item/stack/tile/carpet/neon/simple/teal/nodots/sixty, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/cargo) +"cy" = ( +/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/half{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"cz" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"cC" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"cD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"cH" = ( +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"cI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"cK" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"cL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"cM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"cQ" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/door/poddoor/shutters{ + id = "ptcomms" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/comms) +"cU" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/door/poddoor/shutters{ + id = "ptobservatory" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"cX" = ( +/obj/machinery/atmospherics/miner/plasma, +/turf/open/floor/engine/plasma, +/area/ruin/space/has_grav/port_tarkon/atmos) +"dd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"dg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"dj" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"dm" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"dn" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"do" = ( +/obj/structure/closet, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/storage/backpack/duffelbag/blueshield, +/obj/item/storage/backpack/messenger/blueshield, +/obj/item/storage/backpack/satchel/blueshield, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) -"cZ" = ( -/obj/structure/fluff/empty_sleeper{ +"dp" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"ds" = ( +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"dv" = ( +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"dz" = ( +/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/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"dB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"dC" = ( +/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/tile/neutral/anticorner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"dE" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"dF" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"dG" = ( +/obj/machinery/power/turbine/core_rotor{ + dir = 4; + mapping_id = "tarkon_turbine" + }, +/obj/structure/cable, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"dJ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"dN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"dO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/obj/machinery/meter, +/obj/structure/cable, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"dS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"dU" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/empty, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"dV" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"dW" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"eu" = ( +/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/ruin/space/has_grav/port_tarkon/forehall) +"ev" = ( +/obj/structure/table/reinforced, +/obj/machinery/vending/boozeomat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ex" = ( +/obj/effect/turf_decal/tile/brown/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"ey" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/anticorner, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"eA" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"eC" = ( +/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/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"eF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"eG" = ( +/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/neutral/anticorner{ + dir = 4 + }, +/obj/structure/closet/firecloset, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"eH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"eL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/weeds/node, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"eM" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/gun/energy/recharge/resonant_system; + req_access = list("tarkon") + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"eN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"eP" = ( +/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/ruin/space/has_grav/port_tarkon/mining) +"eQ" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"eS" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"eT" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/forehall) +"fc" = ( +/obj/structure/trash_pile, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"fe" = ( +/obj/machinery/computer/atmos_control/tarkon/incinerator{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/ruin/space/has_grav/port_tarkon/atmos) +"fg" = ( +/obj/structure/table/reinforced, +/obj/item/card/id/advanced/tarkon{ + pixel_y = -6 + }, +/obj/item/card/id/advanced/tarkon, +/obj/item/card/id/advanced/tarkon{ + pixel_y = 6 + }, +/obj/item/folder/red, +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"fk" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"fr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"fu" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/porthall) +"fy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"fA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"fD" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/purple/half, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"fI" = ( +/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/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"fJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"fM" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 1 + }, +/obj/structure/chair/comfy/black, +/obj/effect/mob_spawn/ghost_role/human/tarkon/sci, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"fP" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"fS" = ( +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"fW" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"fX" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/north, +/obj/item/storage/pouch/ammo{ + pixel_x = 7; + pixel_y = -6 + }, +/obj/item/storage/pouch/ammo{ + pixel_x = 7 + }, +/obj/item/storage/pouch/ammo{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"fZ" = ( +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"gb" = ( +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"gc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "ptxeno" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"gd" = ( +/obj/structure/table/reinforced, +/obj/item/kitchen/rollingpin, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"gm" = ( +/obj/machinery/door/airlock/engineering{ + name = "Backup Generator Room" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"gq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/mining) +"gv" = ( +/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/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"gy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"gz" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"gB" = ( +/obj/effect/spawner/structure/window{ + polarizer_id = "tarkondisect" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/developement) +"gD" = ( +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"gE" = ( +/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/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"gF" = ( +/obj/machinery/door/airlock/research/glass, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/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/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"gG" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"gR" = ( +/obj/machinery/power/smes/engineering{ + charge = 0 + }, +/obj/structure/cable, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"gT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"gV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"gW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"gX" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/structure/table/reinforced, +/obj/item/autopsy_scanner, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"ha" = ( +/obj/machinery/cryopod{ dir = 8 }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) -"jD" = ( -/obj/machinery/light/warm/directional/north, +"hb" = ( +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"hc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"he" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav) +"hf" = ( +/obj/machinery/chem_dispenser, +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"hh" = ( +/obj/effect/turf_decal/sand, +/obj/structure/closet/emcloset, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"hm" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_tarkon{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"ho" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/rnd/production/circuit_imprinter, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"hp" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"hv" = ( +/obj/machinery/door/poddoor/shutters/window{ + id = "tarkoninner"; + name = "Interior Bay Shutter" + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"hB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"hD" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/computer/camera_advanced/xenobio{ + networks = list("tarkon") + }, +/obj/machinery/button/door{ + id = "ptxeno"; + name = "shutter controls"; + pixel_y = 32 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"hG" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"hH" = ( +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"hM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"hO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/incinerator_atmos_aux, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"hP" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/shower/directional/east, +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/obj/machinery/button/door{ + id = "ptatmos"; + name = "shutter controls"; + pixel_x = -39; + pixel_y = -10 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"hQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"hS" = ( +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/structure/table, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) -"kV" = ( -/obj/structure/fluff/metalpole, -/turf/open/misc/asteroid/airless, -/area/space) -"mn" = ( -/turf/open/misc/asteroid/airless, -/area/space) -"qo" = ( +"hX" = ( +/obj/effect/turf_decal/vg_decals/atmos/mix, +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"id" = ( +/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/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"ie" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"if" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ig" = ( /obj/machinery/computer{ desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" + dir = 8; + name = "Financing Console" + }, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"ii" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"ix" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"iB" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/machinery/light_switch/directional/west, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"iD" = ( +/obj/structure/alien/resin/membrane, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"iF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"iG" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/hydroponics/constructable, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"iL" = ( +/mob/living/basic/carp, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"iR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/alien/weeds/node, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"iU" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"iW" = ( +/obj/effect/turf_decal/vg_decals/atmos/plasma, +/obj/machinery/light/small/directional/east, +/obj/machinery/air_sensor/tarkon/plasma_tank{ + pixel_x = 26 + }, +/turf/open/floor/engine/plasma, +/area/ruin/space/has_grav/port_tarkon/atmos) +"iX" = ( +/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/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"iZ" = ( +/obj/machinery/door/airlock/research, +/obj/machinery/door/firedoor/solid, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/effect/turf_decal/tile/purple/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/developement) +"jb" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"jd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/grass/lavaland{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/space/has_grav/port_tarkon/garden) +"jh" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"jq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/secoff) +"jr" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"jt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters{ + id = "ptatmos" + }, +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"jx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"jA" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"jB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door{ + id = "ptporthall"; + name = "shutter controls"; + pixel_x = -31 + }, +/obj/structure/alien/resin/membrane, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"jE" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/noticeboard/directional/east, +/obj/item/paper/fluff/ruins/tarkon/goals, +/obj/item/paper/fluff/ruins/tarkon/vaulter, +/obj/item/paper/fluff/ruins/tarkon/driverpitch, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/item/paper/fluff/ruins/tarkon/comsafe, +/obj/item/paper/fluff/ruins/tarkon/arcs, +/obj/item/paper/fluff/ruins/tarkon/trcd, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"jH" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"jL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"jO" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/item/wirecutters, +/obj/item/wrench, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"jQ" = ( +/obj/machinery/biogenerator, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"jV" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/solars/tarkon) +"jX" = ( +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"jY" = ( +/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/tile/blue/half, +/obj/machinery/door/airlock/medical, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"jZ" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"kc" = ( +/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/tile/brown{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"kh" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"kk" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"kl" = ( +/obj/structure/table, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"kn" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"kp" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"ku" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"kA" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"kC" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"kD" = ( +/obj/effect/spawner/structure/window{ + polarizer_id = "tarkondisect" + }, +/obj/effect/turf_decal/tile/purple/half, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"kE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"kF" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "ptcomms"; + name = "shutter controls" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"kG" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"kN" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/south, +/obj/machinery/door/window/brigdoor/left/directional/north, +/obj/item/paper_bin{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"kR" = ( +/obj/structure/closet, +/obj/machinery/firealarm/directional/east, +/obj/item/clothing/under/tarkon/sci, +/obj/item/clothing/under/tarkon/sci, +/obj/item/clothing/under/tarkon/sci, +/obj/item/clothing/under/tarkon/sci, +/obj/item/clothing/under/tarkon/sci, +/obj/item/clothing/under/tarkon/sci, +/obj/item/storage/backpack/duffelbag/science/robo, +/obj/item/storage/backpack/duffelbag/science, +/obj/item/storage/backpack/messenger/science, +/obj/item/storage/backpack/messenger/science/robo, +/obj/item/storage/backpack/satchel/science, +/obj/item/storage/backpack/satchel/science/robo, +/obj/item/storage/backpack/science, +/obj/item/storage/backpack/science/robo, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"kS" = ( +/obj/machinery/button/door{ + id = "tarkonouter"; + name = "Exterior Shutter Control"; + pixel_x = -6 + }, +/obj/machinery/button/door{ + id = "tarkoninner"; + name = "Inner Shutter Control"; + pixel_x = 6 + }, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/storage) +"kU" = ( +/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/neutral/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"kV" = ( +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"kX" = ( +/obj/effect/turf_decal/stripes/asteroid/corner, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"kY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/storage) +"lh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"lk" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/emergency_bed, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"lm" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/research/anomaly_refinery, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"lq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"lt" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"lu" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"lv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"lz" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"lA" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"lB" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"lC" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"lD" = ( +/obj/structure/fence, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"lE" = ( +/obj/machinery/power/smes/engineering{ + charge = 0 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"lG" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"lM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"lN" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"lO" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/effect/mob_spawn/ghost_role/human/tarkon, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"lS" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "ptxeno" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"lU" = ( +/obj/machinery/door/airlock/public/glass/incinerator/tarkon_exterior, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"ma" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/light/directional/east, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"mc" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/tile/brown, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"md" = ( +/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/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"me" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"mf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/purple/half, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"mh" = ( +/obj/structure/cable, +/obj/machinery/door/window/brigdoor/right/directional/south{ + req_access = list("tarkon") + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"mi" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"mj" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/tile/neutral/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ml" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"mm" = ( +/obj/item/electronics/apc, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/item/electronics/airlock, +/obj/item/electronics/airalarm, +/obj/item/electronics/airalarm, +/obj/structure/closet/crate/engineering/electrical{ + name = "electronics crate" + }, +/obj/item/electronics/tracker, +/obj/item/stack/cable_coil, +/obj/item/clothing/gloves/color/yellow, +/obj/item/circuitboard/computer/atmos_control/tarkon/carbon_tank, +/obj/item/circuitboard/computer/atmos_control/tarkon/mix_tank, +/obj/item/circuitboard/computer/atmos_control/tarkon/nitrogen_tank, +/obj/item/circuitboard/computer/atmos_control/tarkon/incinerator, +/obj/item/circuitboard/computer/atmos_control/tarkon/oxygen_tank, +/obj/item/circuitboard/computer/atmos_control/tarkon/plasma_tank, +/obj/item/circuitboard/computer/tarkon_driver, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/item/circuitboard/machine/thermoelectric_generator, +/obj/item/circuitboard/machine/circulator, +/obj/item/circuitboard/machine/circulator, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"mn" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"mo" = ( +/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/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Public Observatory" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"mp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"mq" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"ms" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/power1) +"mt" = ( +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"mC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/incinerator_atmos_main, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"mD" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/mining) +"mG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/modular_map_root/port_tarkon{ + key = "xeno" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"mJ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/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/solid, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"mK" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/signaler, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"mM" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"mO" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/obj/modular_map_root/port_tarkon{ + key = "cargo" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"mQ" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"mS" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"mX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"nb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"ne" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"nh" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Public Observatory" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/observ) +"nj" = ( +/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/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"nq" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 6 + }, +/obj/structure/closet/radiation, +/obj/item/clothing/head/utility/radiation, +/obj/item/clothing/suit/utility/radiation, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"nr" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/part_replacer/cargo, +/obj/structure/noticeboard/directional/east, +/obj/item/paper/fluff/ruins/tarkon/scisafe, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"ns" = ( +/obj/structure/table/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"nw" = ( +/obj/machinery/door/airlock/research, +/obj/machinery/door/firedoor/solid, +/obj/structure/cable, +/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/tarkon/general, +/obj/effect/turf_decal/tile/purple/full, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/developement) +"nC" = ( +/obj/structure/safe/floor, +/obj/item/stack/sheet/bluespace_crystal{ + amount = 5 + }, +/obj/item/stack/sheet/mineral/diamond{ + amount = 10 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"nE" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"nJ" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/light/directional/north, +/obj/structure/table/reinforced, +/obj/item/circuitboard/machine/tank_compressor, +/obj/item/circuitboard/machine/rtg/advanced, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"nK" = ( +/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{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"nQ" = ( +/obj/structure/spawner/tarkon_xenos/common, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"nR" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"nT" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 10 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"nU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"nW" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"nZ" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/mining/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"oh" = ( +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"om" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/flask/gold, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"os" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"ou" = ( +/obj/structure/rack, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/item/ammo_box/magazine/c35sol_pistol, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"ov" = ( +/obj/machinery/griddle, +/obj/structure/noticeboard/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"oy" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/effect/turf_decal/tile/brown/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"oE" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/obj/item/stack/spacecash/c10000, +/obj/item/stack/spacecash/c10000, +/obj/item/stack/spacecash/c10000, +/obj/item/stack/spacecash/c10000, +/obj/item/stack/spacecash/c10000, +/obj/structure/safe/floor, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"oG" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/fence/door/opened{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav) +"oH" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/item/folder/red, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"oJ" = ( +/obj/structure/fireaxecabinet/directional/north, +/obj/machinery/pipedispenser, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"oL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/resin/membrane, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"oN" = ( +/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{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"oQ" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 8 + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"oV" = ( +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"oX" = ( +/obj/machinery/power/turbine/inlet_compressor{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"oZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"pb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/grass/lavaland{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/space/has_grav/port_tarkon/garden) +"pe" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/machinery/computer/rdconsole{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"pf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/grass/lavaland{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/space/has_grav/port_tarkon/garden) +"ph" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/closet, +/obj/item/clothing/gloves/color/plasmaman/black, +/obj/item/clothing/gloves/color/plasmaman/black, +/obj/item/clothing/gloves/color/plasmaman/black, +/obj/item/clothing/gloves/color/plasmaman/black, +/obj/item/clothing/gloves/color/plasmaman/chief_engineer, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/head/helmet/space/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/clothing/under/plasmaman, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/item/tank/internals/nitrogen/belt/full, +/obj/item/tank/internals/nitrogen/belt/full, +/obj/item/tank/internals/nitrogen/belt/full, +/obj/item/tank/internals/nitrogen/belt/full, +/obj/item/tank/internals/nitrogen/belt/full, +/obj/item/clothing/mask/breath/vox, +/obj/item/clothing/mask/breath/vox, +/obj/item/clothing/mask/breath/vox, +/obj/item/clothing/mask/breath/vox, +/obj/item/clothing/mask/breath/vox, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"pi" = ( +/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/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"pk" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/porthall) +"pq" = ( +/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/blue, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"pr" = ( +/obj/structure/chair/greyscale{ + dir = 1 + }, +/obj/effect/mob_spawn/ghost_role/human/tarkon/sec{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"py" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"pA" = ( +/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/anticorner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"pC" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -2 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -2 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"pF" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"pJ" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"pK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"pN" = ( +/obj/structure/closet, +/obj/item/clothing/under/tarkon/cargo, +/obj/item/clothing/under/tarkon/cargo, +/obj/item/clothing/under/tarkon/cargo, +/obj/item/clothing/under/tarkon/cargo, +/obj/item/clothing/under/tarkon/cargo, +/obj/item/clothing/under/tarkon/cargo, +/obj/item/storage/backpack/duffelbag/explorer, +/obj/item/storage/backpack/messenger/explorer, +/obj/item/storage/backpack/satchel/explorer, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"pP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"pR" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/no_charge, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"pS" = ( +/obj/effect/turf_decal/tile/red/real_red/half, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"pT" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav) +"pY" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"qc" = ( +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"qd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/air_sensor/tarkon/incinerator_tank{ + pixel_x = -26 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"qe" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"qf" = ( +/obj/machinery/light/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/computer/atmos_control/tarkon/nitrous_tank{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"qg" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"qh" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/tile/yellow/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"qk" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"qm" = ( +/obj/structure/alien/resin/membrane, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"qo" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"qr" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"qt" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"qv" = ( +/obj/machinery/door/airlock/mining, +/obj/machinery/door/firedoor/solid, +/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/ruin/space/has_grav/port_tarkon/cargo) +"qx" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"qz" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"qB" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"qE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"qF" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/reagent_containers/condiment/sugar, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"qG" = ( +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/engine, +/area/ruin/space/has_grav/port_tarkon/atmos) +"qL" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/dark/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"qM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/table, +/obj/item/defibrillator, +/obj/item/stock_parts/cell/super, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"qP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/west{ + req_access = list("tarkon") + }, +/obj/item/mod/module/springlock, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"qR" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"qS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"qT" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"qX" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"qZ" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/component_printer, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"ra" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"rb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"rc" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/cable, +/obj/machinery/computer/atmos_control/tarkon/plasma_tank{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rg" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rh" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"rj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"rk" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rl" = ( +/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/tile/neutral/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"rp" = ( +/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/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"rq" = ( +/obj/machinery/button/door{ + id = "ptcell2"; + name = "shutter controls"; + pixel_x = 8 + }, +/obj/machinery/button/door{ + id = "ptcell1"; + name = "shutter controls"; + pixel_x = -8 + }, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/secoff) +"rr" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rs" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"rt" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"rC" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"rD" = ( +/obj/structure/alien/resin/membrane, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"rG" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/table/wood/fancy/blue, +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/item/coin, +/obj/item/coin, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"rL" = ( +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rM" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rN" = ( +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"rO" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"rP" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"rS" = ( +/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/security/old, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/machinery/door/firedoor/solid, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"sa" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"sc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"sf" = ( +/obj/structure/sign/warning/no_smoking, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"sh" = ( +/obj/machinery/autolathe, +/obj/effect/turf_decal/tile/yellow/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"sj" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/comms) +"sk" = ( +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"so" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/afthall) +"sp" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/forehall) +"sq" = ( +/obj/machinery/power/smes/engineering{ + charge = 0; + name = "backup power storage unit" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"su" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/utility, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"sv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"sx" = ( +/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/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"sA" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/cable, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"sG" = ( +/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/tile/brown/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"sI" = ( +/obj/structure/mop_bucket, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/item/soap/nanotrasen, +/obj/item/tape/ruins/tarkon/celebration, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"sO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output/tarkon{ + dir = 4 + }, +/turf/open/floor/engine/o2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"sS" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/transfer_valve, +/obj/item/transfer_valve, +/obj/item/pipe_dispenser, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"sU" = ( +/obj/structure/fluff/metalpole/end/right, +/turf/template_noop, +/area/template_noop) +"sX" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"tc" = ( +/obj/structure/cable, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/solars/tarkon) +"tg" = ( +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 8 + }, +/obj/machinery/rnd/production/colony_lathe, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"tj" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"tk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"tm" = ( +/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/red/real_red/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"tn" = ( +/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, +/obj/machinery/light/small/directional/east, +/obj/machinery/air_sensor/tarkon/nitrous_tank{ + pixel_x = 26 + }, +/turf/open/floor/engine/n2o, +/area/ruin/space/has_grav/port_tarkon/atmos) +"tx" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"tz" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"tA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light_switch/directional/south, +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"tC" = ( +/obj/machinery/door/airlock/public{ + name = "Kitchen Freezer" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"tE" = ( +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"tG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"tL" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav) +"tN" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"tR" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"tS" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"tT" = ( +/obj/machinery/hydroponics/constructable, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"tZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"ud" = ( +/obj/effect/turf_decal/tile/brown/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"ug" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/alien/resin/membrane, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav) +"uh" = ( +/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/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"uj" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"us" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"uu" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 8 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"uB" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/fourcorners{ + color = "#DE3A3A" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"uC" = ( +/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/red/real_red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"uE" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/glass/fifty, +/obj/effect/turf_decal/tile/yellow/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"uF" = ( +/obj/structure/trash_pile, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"uJ" = ( +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"uO" = ( +/obj/structure/closet, +/obj/item/storage/backpack/satchel/explorer, +/obj/item/clothing/mask/gas/explorer, +/obj/item/gps/mining, +/obj/item/storage/bag/ore, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"uQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"uS" = ( +/turf/closed/mineral/random/high_chance, +/area/solars/tarkon) +"uT" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"uW" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"va" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/red/real_red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"vb" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"ve" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/co2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"vg" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/n2o, +/area/ruin/space/has_grav/port_tarkon/atmos) +"vj" = ( +/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/neutral/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"vl" = ( +/obj/machinery/door/airlock/public/glass/incinerator/tarkon_interior, +/obj/machinery/airlock_controller/incinerator_tarkon{ + pixel_x = 40; + pixel_y = 5 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"vm" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "ptxeno" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"vo" = ( +/obj/machinery/light/directional/north, +/obj/structure/rack, +/obj/item/screwdriver, +/obj/item/wrench, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"vr" = ( +/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/brown/half, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"vw" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/dorms) +"vx" = ( +/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/ruin/space/has_grav/port_tarkon/observ) +"vG" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/holosign_creator/atmos, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"vO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"vP" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"vR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"vS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"vX" = ( +/obj/machinery/light/warm/directional/west, +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"wa" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/obj/machinery/door/firedoor/solid, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"wb" = ( +/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/tile/neutral/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"wc" = ( +/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/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"we" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"wf" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"wj" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"wk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"wm" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"wo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/autolathe, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"wp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"wq" = ( +/obj/machinery/processor, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"wr" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"wu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"wv" = ( +/obj/structure/table/wood/fancy/blue, +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/item/dice, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"wx" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/cargo) +"wA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"wF" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"wH" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"wK" = ( +/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/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"wP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"wT" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"wV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"wW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/membrane, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"wZ" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/port_tarkon/mining) +"xa" = ( +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"xb" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/machinery/computer/atmos_control/tarkon/carbon_tank{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"xc" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"xd" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"xe" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 6; + height = 16; + name = "Port Tarkon"; + roundstart_template = /datum/map_template/shuttle/ruin/tarkon_driver; + shuttle_id = "port_tarkon"; + width = 14 + }, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"xm" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"xn" = ( +/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/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"xo" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/effect/spawner/structure/window{ + polarizer_id = "tarkondisect" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"xp" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"xr" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"xs" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/forehall) +"xu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"xw" = ( +/mob/living/basic/carp, +/turf/template_noop, +/area/template_noop) +"xx" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon) +"xB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"xC" = ( +/obj/structure/alien/resin/wall, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"xD" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"xE" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/structure/table/reinforced, +/obj/item/surgery_tray/full, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"xG" = ( +/obj/effect/turf_decal/tile/purple/anticorner, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"xI" = ( +/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/tile/brown/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"xK" = ( +/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/brown/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"xO" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"xT" = ( +/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/tile/neutral/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ya" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/power1) +"yb" = ( +/obj/structure/sign/warning/explosives, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/developement) +"yc" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/cargo) +"yf" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/machinery/door/firedoor/solid, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"yj" = ( +/obj/machinery/door/airlock/mining/glass, +/obj/effect/turf_decal/sand/plating, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/machinery/door/firedoor/solid, +/obj/structure/cable, +/obj/structure/fans/tiny, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"yk" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/obj/machinery/door/window/left/directional/west{ + opacity = 1 + }, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ym" = ( +/obj/machinery/light/directional/north, +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"yo" = ( +/obj/machinery/door/airlock/research, +/obj/machinery/door/firedoor/solid, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/developement) +"yq" = ( +/obj/machinery/door/firedoor/solid, +/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/multi_tile/metal, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"ys" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"yy" = ( +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 4 + }, +/obj/item/gps/computer/space{ + gpstag = "Port Tarkon" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"yD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/structure/safe/floor, +/obj/item/mod/module/armor_booster/retractplates{ + desc = "A complex set of actuators, micro-seals and a simple guide on how to install it, This... \"Modification\" allows the plating around the joints to retract, giving minor protection and a bit better mobility. There also seems to be a small, wireless microphone... how odd." + }, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"yG" = ( +/obj/effect/turf_decal/tile/purple/half, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"yH" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"yO" = ( +/obj/machinery/light/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/atmos_control/tarkon/mix_tank{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"yP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"yT" = ( +/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/tile/brown, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"yU" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"yV" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"yY" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"yZ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"za" = ( +/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/yellow/half, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"zf" = ( +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"zg" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/comms) +"zk" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"zm" = ( +/obj/structure/cable, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"zn" = ( +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"zp" = ( +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/structure/table, +/obj/machinery/light/warm/directional/south, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/cell_10k, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"zz" = ( +/mob/living/basic/carp/mega, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"zA" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"zB" = ( +/obj/machinery/door/poddoor/shutters/window{ + id = "tarkoninner"; + name = "Interior Bay Shutter" + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"zC" = ( +/obj/machinery/door/poddoor/shutters/window{ + id = "tarkoninner"; + name = "Interior Bay Shutter" + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"zE" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon) +"zH" = ( +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"zL" = ( +/obj/effect/spawner/structure/window{ + polarizer_id = "tarkondisect" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"zM" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"zQ" = ( +/obj/machinery/shower/directional/east, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/obj/machinery/door/window/right/directional/north{ + opacity = 1 + }, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"zR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"zT" = ( +/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/tile/brown/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"zV" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"zY" = ( +/turf/closed/mineral/random, +/area/ruin/space/has_grav) +"zZ" = ( +/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/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"Ab" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Ad" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Ae" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"Ah" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/computer/atmos_control/tarkon/oxygen_tank{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Ai" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/safe/floor, +/obj/item/circuitboard/machine/circuit_imprinter, +/obj/item/circuitboard/machine/protolathe/tarkon, +/obj/item/circuitboard/computer/tarkon_driver, +/obj/item/circuitboard/machine/rdserver/tarkon, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Ao" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/structure/table, +/obj/item/storage/medkit/surgery, +/obj/item/storage/medkit/advanced, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"At" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/tile/purple/half, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"AA" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + id = "tarkonouter"; + name = "External Bay Shutters" + }, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"AG" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"AH" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/engine, +/area/ruin/space/has_grav/port_tarkon/atmos) +"AP" = ( +/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/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"AQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"AR" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/storage) +"AS" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/doppler_array, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"AW" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"AZ" = ( +/obj/effect/turf_decal/tile/blue/anticorner, +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Bb" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"Bd" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Bj" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + desc = "Cooks and boils stuff, somehow."; + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Bk" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Bl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Bp" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Bt" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"Bu" = ( +/obj/structure/table, +/obj/machinery/light/warm/directional/south, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Bv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/medical, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"BB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input/tarkon{ + dir = 4 + }, +/turf/open/floor/engine/o2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"BE" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/directional/east{ + network = list("tarkon") + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"BI" = ( +/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/tile/purple/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"BL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/forehall) +"BN" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"BO" = ( +/obj/structure/alien/resin/membrane, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"BS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"BW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"BZ" = ( +/obj/structure/closet, +/obj/item/pickaxe/silver, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/glasses/meson, +/obj/item/t_scanner/adv_mining_scanner/lesser, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Ca" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Cc" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Cf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Cg" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 4 + }, +/obj/machinery/cryo_cell{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Ch" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Ci" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Cm" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/structure/sink/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Cn" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/effect/spawner/structure/window{ + polarizer_id = "tarkondisect" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Cp" = ( +/obj/machinery/computer/records{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Cq" = ( +/obj/machinery/button/door{ + id = "ptafthall"; + name = "shutter controls"; + pixel_x = -26 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Cu" = ( +/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/neutral/anticorner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"CA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"CC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"CF" = ( +/obj/effect/spawner/structure/window{ + polarizer_id = "tarkondisect" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"CN" = ( +/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/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"CS" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"CY" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Db" = ( +/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, +/area/ruin/space/has_grav/port_tarkon) +"Dc" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/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/neutral/anticorner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Dg" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Di" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "ptcell2" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Dj" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Do" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Dq" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/purple/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Dr" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Dt" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Du" = ( +/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/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Public Observatory" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/observ) +"Dv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Dz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/resin/wall, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"DA" = ( +/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/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"DB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/button/door{ + id = "ptobservatory"; + name = "shutter controls"; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"DD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"DE" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"DG" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder/constructed, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"DH" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"DI" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/tank_compressor, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"DL" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/noticeboard/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"DM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"DN" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/west, +/obj/item/paper_bin, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/obj/item/pen/survival, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"DQ" = ( +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/purple/half, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"DS" = ( +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"DT" = ( +/obj/machinery/airlock_sensor/incinerator_tarkon{ + pixel_x = 6; + pixel_y = 23 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"DW" = ( +/obj/machinery/light/directional/south, +/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/yellow/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"DZ" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Eb" = ( +/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/blue{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Eg" = ( +/obj/machinery/power/turbine/turbine_outlet{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Ei" = ( +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"Ej" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Em" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"En" = ( +/obj/machinery/atmospherics/miner/nitrogen, +/turf/open/floor/engine/n2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Eo" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/power1) +"Eq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Ex" = ( +/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/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"EE" = ( +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"EG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/real_red/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"EH" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/trauma) +"EN" = ( +/obj/structure/alien/weeds/node, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"EQ" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/cargo) +"ER" = ( +/obj/machinery/atmospherics/miner/oxygen, +/turf/open/floor/engine/o2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"ET" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = -8; + pixel_y = -24; + req_one_access = list("tarkon") + }, +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = -8; + pixel_y = -36; + req_one_access = list("tarkon") + }, +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"EU" = ( +/obj/effect/turf_decal/vg_decals/atmos/oxygen, +/obj/machinery/light/small/directional/west, +/obj/machinery/air_sensor/tarkon/oxygen_tank{ + pixel_x = -26 + }, +/turf/open/floor/engine/o2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"EW" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"EX" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Fa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Fb" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Fc" = ( +/obj/machinery/power/port_gen/pacman/super{ + name = "\improper emergency power generator"; + time_per_sheet = 40 + }, +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"Fd" = ( +/obj/structure/table/reinforced, +/obj/machinery/coffeemaker, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"FB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"FF" = ( +/obj/structure/table/reinforced, +/obj/item/stamp/denied, +/obj/item/stamp/granted, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"FG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) -"sU" = ( -/obj/structure/fluff/metalpole/end/right, -/turf/open/space/basic, -/area/space) -"tD" = ( -/obj/structure/fluff/empty_sleeper{ +"FI" = ( +/obj/machinery/door/airlock/mining/glass, +/obj/structure/cable, +/obj/machinery/door/firedoor/solid, +/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/ruin/space/has_grav/port_tarkon/mining) +"FO" = ( +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"FR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"FS" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"FW" = ( +/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/tile/neutral/anticorner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"FY" = ( +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"FZ" = ( +/obj/structure/fluff/metalpole, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"Gj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Gk" = ( +/obj/structure/closet, +/obj/item/pickaxe/mini, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/mask/gas/explorer, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/gps/mining, +/obj/item/storage/bag/ore, +/obj/item/storage/belt/mining, +/obj/effect/turf_decal/tile/brown/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Gr" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Gu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/modular_computer/preset/command{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Gz" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"GA" = ( +/obj/effect/spawner/structure/window, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"GD" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/co2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"GF" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Engineering External Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"GH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"GJ" = ( +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"GK" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"GL" = ( +/obj/structure/table/reinforced, +/obj/item/pipe_dispenser, +/obj/item/storage/belt/utility/full, +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 8 + }, +/obj/item/construction/rcd/arcd/tarkon, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"GN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"GQ" = ( +/obj/machinery/igniter/incinerator_tarkon, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ + dir = 5 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"GV" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Hc" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/engine, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Hf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Hg" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Hh" = ( +/obj/item/stack/sheet/mineral/silver{ + amount = 25 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/purple/anticorner, +/obj/item/stack/sheet/mineral/titanium{ + amount = 30 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Hi" = ( +/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, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Hk" = ( +/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/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Hm" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Hn" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 6 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"Ho" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Hq" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Hs" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil, +/obj/item/stack/sheet/glass{ + amount = 25 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Ht" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/item/multitool/circuit, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"HB" = ( +/obj/machinery/door/window/left/directional/west, +/obj/machinery/door/window/right/directional/east, +/obj/machinery/mineral/ore_redemption/offstation, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"HC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/alien/weeds/node, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"HE" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"HH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/office, +/obj/effect/mob_spawn/ghost_role/human/tarkon/director, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"HM" = ( +/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/ruin/space/has_grav/port_tarkon/mining) +"HN" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input/tarkon{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"HP" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"HS" = ( +/obj/machinery/power/solar_control{ + dir = 1; + id = "aftport"; + name = "Station Solar Control" + }, +/obj/structure/cable, +/obj/item/paper/guides/jobs/engi/solars, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"HU" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"HV" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Crew Storage"; + state_open = 1 + }, +/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/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"HX" = ( +/obj/structure/closet/secure_closet/medical2{ + req_access = list("medical") + }, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Ia" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/effect/mapping_helpers/apc/cell_10k, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Ic" = ( +/obj/modular_map_root/port_tarkon{ + key = "dorm" + }, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/port_tarkon/dorms) +"Id" = ( +/obj/machinery/door/window/left/directional/west, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Ie" = ( +/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/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"If" = ( +/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 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Ik" = ( +/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, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"Io" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"Ip" = ( +/obj/structure/closet, +/obj/item/clothing/under/tarkon/med, +/obj/item/clothing/under/tarkon/med, +/obj/item/clothing/under/tarkon/med, +/obj/item/clothing/under/tarkon/med, +/obj/item/clothing/under/tarkon/med, +/obj/item/clothing/under/tarkon/med, +/obj/item/storage/backpack/duffelbag/genetics, +/obj/item/storage/backpack/duffelbag/med, +/obj/item/storage/backpack/duffelbag/coroner, +/obj/item/storage/backpack/duffelbag/chemistry, +/obj/item/storage/backpack/duffelbag/virology, +/obj/item/storage/backpack/medic, +/obj/item/storage/backpack/messenger/chem, +/obj/item/storage/backpack/messenger/coroner, +/obj/item/storage/backpack/messenger/gen, +/obj/item/storage/backpack/messenger/vir, +/obj/item/storage/backpack/satchel/chem, +/obj/item/storage/backpack/satchel/coroner, +/obj/item/storage/backpack/satchel/gen, +/obj/item/storage/backpack/satchel/med, +/obj/item/storage/backpack/satchel/vir, +/obj/item/storage/backpack/virology, +/obj/item/storage/backpack/chemistry, +/obj/item/storage/backpack/coroner, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Iq" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"It" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/mining/glass, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Iv" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Iz" = ( +/obj/machinery/air_sensor/tarkon/mix_tank{ + pixel_x = -26 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"IB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"IJ" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/construction, +/obj/item/pen/edagger, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"IL" = ( +/obj/machinery/door/airlock/research/glass, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters{ + id = "ptxeno" + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"IM" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"IO" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 9 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"IQ" = ( +/obj/structure/sink/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"IT" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"IU" = ( +/obj/machinery/light/warm/directional/west, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"IV" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"IW" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/table/rolling, +/obj/item/surgery_tray/full, +/obj/machinery/button/polarizer{ + id = "tarkon_med1"; + pixel_x = 31 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"IZ" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Jb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Jd" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Je" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output/tarkon{ + dir = 4 + }, +/turf/open/floor/engine/n2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Jf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Jg" = ( +/obj/structure/safe/floor, +/obj/item/areaeditor/blueprints/tarkon, +/obj/item/circuitboard/machine/bluespace_miner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Jq" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Js" = ( +/obj/item/shovel, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"Ju" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Jv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"JA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"JB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"JD" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"JF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/grass/lavaland{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/space/has_grav/port_tarkon/garden) +"JI" = ( +/obj/effect/turf_decal/tile/purple/anticorner, +/obj/machinery/computer/operating/oldstation{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"JL" = ( +/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ + req_access = list("tarkon") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/poddoor/shutters{ + id = "ptcell2" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"JM" = ( +/obj/structure/table/wood/fancy/blue, +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/obj/machinery/recharger, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"JP" = ( +/obj/structure/rack/gunrack, +/obj/machinery/light/directional/north, +/obj/item/gun/ballistic/automatic/m6pdw{ + pixel_x = 4 + }, +/obj/item/gun/ballistic/automatic/m6pdw, +/obj/item/gun/ballistic/automatic/m6pdw{ + pixel_x = -4 + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + req_access = list("tarkon") + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"JQ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/structure/closet/crate/internals, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/clothing/suit/space/eva, +/obj/item/clothing/mask/breath, +/obj/item/tank/internals/oxygen, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"JV" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/door/poddoor/shutters{ + id = "ptporthall" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/porthall) +"JY" = ( +/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/tile/brown/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"JZ" = ( +/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/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Kb" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Kc" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Kf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/n2o, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Kg" = ( +/obj/structure/tank_dispenser, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Kh" = ( +/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{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Km" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"Kn" = ( +/obj/structure/spawner/tarkon_xenos/common, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"Ko" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Kr" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Ks" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"Kt" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Engineering External Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"Kv" = ( +/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/neutral/anticorner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Kx" = ( +/obj/structure/table/wood/fancy/blue, +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/machinery/cell_charger, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"KB" = ( +/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/tile/neutral/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"KE" = ( +/obj/structure/disposalpipe/segment, +/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/ruin/space/has_grav/port_tarkon/porthall) +"KF" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"KG" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"KH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"KJ" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"KP" = ( +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 1 + }, +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/ore_silo, +/obj/item/stack/cable_coil, +/obj/structure/noticeboard/directional/west, +/obj/item/paper/fluff/ruins/tarkon/cargosafe, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"KQ" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/solars/tarkon) +"KR" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"KU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"KZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/red/real_red/anticorner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Lj" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Lk" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/curtain/cloth, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Ll" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/light_switch/directional/south, +/obj/structure/sink/directional/north, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"Lt" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Lu" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 4 + }, +/obj/machinery/rnd/production/protolathe/tarkon, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Lv" = ( +/obj/structure/table, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/effect/turf_decal/tile/brown/half, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c200, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Lw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/engineering/glass{ + name = "P-T Tool Storage" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"Ly" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight, +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"Lz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"LL" = ( +/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/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"LQ" = ( +/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/tile/neutral, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"LR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"LS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"LV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"LW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"LY" = ( +/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/solid, +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Ma" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Mf" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Mg" = ( +/obj/structure/table/reinforced, +/obj/item/crowbar, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Mp" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Mq" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/machinery/mecha_part_fabricator{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Ms" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Mw" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/door/poddoor/shutters{ + id = "ptafthall" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Mx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Mz" = ( +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"MD" = ( +/obj/machinery/door/airlock{ + name = "Bathroom" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"MG" = ( +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"MH" = ( +/obj/structure/table, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner, +/obj/item/clothing/head/utility/welding, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"MJ" = ( +/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/tile/brown/half{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"MM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/south, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"MQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"MT" = ( +/obj/machinery/vending/hydroseeds, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"MV" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input/tarkon{ + dir = 4 + }, +/turf/open/floor/engine/n2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"MX" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/port_tarkon/mining) +"MY" = ( +/obj/effect/turf_decal/vg_decals/atmos/mix, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"MZ" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 1 + }, +/obj/machinery/recharge_station, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Na" = ( +/obj/machinery/atmospherics/components/tank/air, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Nc" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/north, +/obj/item/assembly/flash, +/obj/item/assembly/flash, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Nd" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 8 + }, +/obj/machinery/rnd/server/tarkon, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Nf" = ( +/obj/machinery/door/airlock/mining/glass, +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/sand/plating, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/structure/fans/tiny, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Nh" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Nj" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Nn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/east, +/obj/structure/noticeboard/directional/east, +/obj/item/paper/fluff/ruins/tarkon/detain, +/obj/effect/turf_decal/tile/red/real_red/anticorner, +/obj/item/paper/fluff/ruins/tarkon/sop, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Np" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor/solid, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Ns" = ( +/obj/structure/table, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/storage/box/nif_ghost_box/ghost_role, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Nv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/garden) +"Nx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Nz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/purple/half, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"NA" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"NB" = ( +/obj/machinery/vending/dorms, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/cargo) +"NC" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4; + name = "killroom vent" + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav) +"NE" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"NI" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"NO" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/computer, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"NS" = ( +/obj/structure/closet/crate/radiation, +/obj/structure/cable, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"NT" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/machinery/door/firedoor/solid, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"NU" = ( +/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/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"NV" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"NX" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/machinery/door/poddoor/shutters{ + id = "tarkonouter"; + name = "External Bay Shutters" + }, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"NY" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/engineering/glass{ + name = "P-T Tool Storage" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"Oa" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker/large, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Ob" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Of" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/full, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Og" = ( +/obj/effect/turf_decal/tile/purple/anticorner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Ol" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/obj/structure/displaycase{ + start_showpiece_type = /obj/item/gun/energy/recharge/resonant_system; + req_access = list("tarkon") + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Om" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"Op" = ( +/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/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Ot" = ( +/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/solid, +/obj/machinery/door/airlock/atmos/glass, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Oz" = ( +/obj/structure/cable, +/turf/open/floor/engine, +/area/ruin/space/has_grav/port_tarkon/atmos) +"OA" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"OC" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/plasma, +/area/ruin/space/has_grav/port_tarkon/atmos) +"OG" = ( +/obj/effect/turf_decal/vg_decals/atmos/nitrogen, +/obj/machinery/light/small/directional/west, +/obj/machinery/air_sensor/tarkon/nitrogen_tank{ + pixel_x = -26 + }, +/turf/open/floor/engine/n2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"OI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"OM" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/yellow/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"OP" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"OQ" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 8 + }, +/obj/structure/closet/secure_closet/medical1, +/obj/item/gun/medbeam/afad, +/obj/item/clothing/suit/toggle/labcoat/medical, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"OS" = ( +/mob/living/basic/carp/mega, +/turf/template_noop, +/area/template_noop) +"OU" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/fourcorners{ + color = "#DE3A3A" + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"OV" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/secoff) +"OW" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"OZ" = ( +/turf/open/floor/grass/lavaland{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/space/has_grav/port_tarkon/garden) +"Pa" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"Pb" = ( +/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/tile/neutral/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Pc" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Pe" = ( +/obj/machinery/door/window/left/directional/east, +/obj/machinery/door/window/right/directional/west, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Pf" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/external/glass{ + name = "Turbine Maintenance Door" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Ph" = ( +/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/ruin/space/has_grav/port_tarkon/starboardhall) +"Pj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Pk" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Pl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/broken{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"Po" = ( +/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, +/obj/machinery/light/small/directional/east, +/obj/machinery/air_sensor/tarkon/carbon_tank{ + pixel_x = 26 + }, +/turf/open/floor/engine/co2, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Pq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Pt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Pw" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Px" = ( +/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/ruin/space/has_grav/port_tarkon/centerhall) +"Py" = ( +/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/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Pz" = ( +/obj/machinery/door/poddoor/shutters{ + id = "tarkonouter"; + name = "External Bay Shutters" + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"PA" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"PD" = ( +/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{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"PG" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"PK" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/developement) +"PL" = ( +/obj/effect/mob_spawn/ghost_role/human/tarkon/engi, +/obj/effect/turf_decal/tile/yellow/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"PW" = ( +/obj/effect/turf_decal/tile/yellow/anticorner, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Qa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Qb" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/structure/table/optable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Qc" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue, +/obj/item/folder, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Qi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Qm" = ( +/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/blue/half{ + dir = 1 + }, +/obj/machinery/door/firedoor/solid, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/comms) +"Qo" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"Qq" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/industrial/hauler, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Qx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Qy" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"QE" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"QF" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"QG" = ( +/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/tile/brown/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"QH" = ( +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"QK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"QL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"QM" = ( +/obj/structure/closet, +/obj/item/storage/backpack/satchel/explorer, +/obj/item/clothing/shoes/workboots/mining, +/obj/item/t_scanner/adv_mining_scanner/lesser, +/obj/item/storage/bag/ore, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"QO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"QP" = ( +/obj/machinery/cryopod{ dir = 1 }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) -"ux" = ( +"QS" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"QV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"QZ" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/condiment/enzyme, +/obj/item/reagent_containers/condiment/sugar, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Re" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Ri" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Rp" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Rs" = ( +/obj/machinery/door/window/left/directional/north, +/obj/machinery/door/window/left/directional/south, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Rv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Rx" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/half, +/obj/item/reagent_containers/cup/glass/coffee/no_lid, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"RA" = ( +/obj/machinery/computer/turbine_computer{ + dir = 1; + mapping_id = "tarkon_turbine" + }, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/ruin/space/has_grav/port_tarkon/atmos) +"RC" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"RE" = ( +/obj/structure/alien/resin/membrane, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"RF" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"RG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "ptcell1" + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/secoff) +"RJ" = ( +/obj/effect/turf_decal/tile/neutral/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"RL" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"RS" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"RV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"RW" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 4 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"RY" = ( +/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 = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"RZ" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Se" = ( +/obj/structure/bed/maint, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Sg" = ( +/obj/structure/table/reinforced, +/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 = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Sl" = ( +/obj/structure/spawner/tarkon_xenos, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"Sm" = ( +/obj/structure/fluff/metalpole, +/turf/template_noop, +/area/template_noop) +"Sn" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Sq" = ( +/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, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Su" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/obj/machinery/rnd/destructive_analyzer, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Sw" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Sx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Sy" = ( +/obj/item/stack/spacecash/c100, +/obj/item/stack/spacecash/c100{ + pixel_x = 4; + pixel_y = 7 + }, +/obj/item/stack/spacecash/c100{ + pixel_x = 4; + pixel_y = -8 + }, +/obj/item/stack/spacecash/c20{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/stack/spacecash/c20{ + pixel_y = 10 + }, +/obj/item/stack/spacecash/c20{ + pixel_x = 5 + }, +/obj/item/stack/spacecash/c10{ + pixel_x = -4; + pixel_y = -5 + }, +/obj/item/stack/spacecash/c10{ + pixel_x = -6; + pixel_y = 12 + }, +/obj/item/stack/spacecash/c10{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/mod/module/visor/rave, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Sz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"SA" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/brown/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"SD" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"SM" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/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/ruin/space/has_grav/port_tarkon/centerhall) +"SN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"SR" = ( +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"SW" = ( +/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 = 5 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"SZ" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/storage) +"Tc" = ( +/obj/structure/rack, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/suit/armor/vest, +/obj/machinery/airalarm/directional/north, +/obj/item/clothing/suit/armor/vest, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Td" = ( +/obj/structure/window/reinforced/tinted/spawner/directional/north, +/obj/machinery/door/window/left/directional/east{ + opacity = 1 + }, +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Tg" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/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/solid, +/obj/effect/turf_decal/tile/brown/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"Ti" = ( +/obj/machinery/door/airlock/mining/glass, +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Tj" = ( +/obj/effect/turf_decal/sand, +/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, +/area/ruin/space/has_grav/port_tarkon/mining) +"Tk" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/purple/half{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Tl" = ( +/obj/machinery/atmospherics/miner/n2o, +/turf/open/floor/engine/n2o, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Tm" = ( +/obj/structure/closet, +/obj/item/clothing/under/tarkon, +/obj/item/clothing/under/tarkon, +/obj/item/clothing/under/tarkon, +/obj/item/clothing/under/tarkon, +/obj/item/clothing/under/tarkon, +/obj/item/clothing/under/tarkon, +/obj/item/storage/backpack/messenger/hyd, +/obj/item/storage/backpack/duffelbag/hydroponics, +/obj/item/storage/backpack/satchel, +/obj/item/storage/backpack/satchel/hyd, +/obj/item/storage/backpack/satchel/leather/withwallet, +/obj/item/storage/backpack, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Tn" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/power1) +"Tt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"Tv" = ( +/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/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Tw" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Tx" = ( +/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, +/obj/structure/disposalpipe/junction/yjunction, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Tz" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) +"TD" = ( +/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/yellow/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"TE" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"TF" = ( +/obj/machinery/cell_charger, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"TG" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 5 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"TO" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"TP" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"TQ" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"TT" = ( +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/airless, +/area/ruin/space/has_grav/port_tarkon/storage) +"TV" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"TX" = ( +/obj/machinery/power/port_gen/pacman/super{ + name = "\improper emergency power generator"; + time_per_sheet = 40 + }, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"TZ" = ( +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Uc" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Uf" = ( +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Uj" = ( +/obj/structure/alien/resin/wall, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Uk" = ( +/obj/machinery/modular_computer/console{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Um" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/knife/combat/survival, +/obj/item/tape/ruins/tarkon/safe, +/obj/effect/turf_decal/tile/red/real_red/anticorner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Uo" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Up" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Ur" = ( +/obj/structure/closet, +/obj/item/storage/backpack/duffelbag/captain, +/obj/item/storage/backpack/messenger/cap, +/obj/item/storage/backpack/satchel/cap, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/under/tarkon/com, +/obj/item/clothing/head/utility/welding/hat, +/obj/item/clothing/head/utility/welding/hat, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Ut" = ( +/obj/structure/closet/secure_closet/freezer/meat/open, +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Uu" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/mining) +"UD" = ( +/obj/machinery/ammo_workbench/unlocked, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"UH" = ( +/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/tile/neutral, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"UI" = ( +/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/ruin/space/has_grav/port_tarkon/mining) +"UN" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/oven/range, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"UO" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"UP" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"Va" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Vb" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Vc" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenics Room" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Vh" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Vi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Vj" = ( +/obj/machinery/computer/cryopod/tarkon/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"Vl" = ( +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/neutral/half, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Vo" = ( +/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/north, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/effect/mapping_helpers/apc/cell_10k, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Vs" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/structure/noticeboard/directional/north, +/obj/item/paper/fluff/ruins/oldstation/generator_manual, +/obj/item/paper/fluff/ruins/tarkon, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Vv" = ( +/obj/item/wrench, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Vw" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Crew Storage" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) +"VA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"VB" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"VC" = ( +/obj/machinery/light/directional/west, +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/yellow, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"VE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output/tarkon{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"VH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"VJ" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/storage) +"VK" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"VN" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow/half, +/obj/item/multitool, +/obj/item/storage/belt/utility/full, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"VO" = ( +/turf/open/floor/engine/vacuum, +/area/ruin/space/has_grav/port_tarkon/atmos) +"VQ" = ( +/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/tile/neutral/anticorner, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"VR" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"VU" = ( +/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/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"VV" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"VY" = ( +/obj/structure/cable, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"VZ" = ( +/turf/open/floor/iron/freezer, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Wd" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/machinery/light/directional/south, +/obj/structure/closet/secure_closet/medical1, +/obj/item/circuitboard/machine/sleeper, +/obj/item/clothing/suit/toggle/labcoat/medical, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"We" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/yellow/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"Wi" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/mob_spawn/ghost_role/human/tarkon/ensign, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Wj" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/mining) +"Wk" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"Wr" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Ws" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Wt" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen" + }, +/obj/machinery/door/firedoor/solid, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Wx" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder/constructed, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Wy" = ( +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"WA" = ( +/obj/machinery/button/ignition/incinerator/tarkon, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) +"WC" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"WG" = ( +/obj/structure/mirror/directional/west, +/obj/structure/sink/directional/east, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"WI" = ( +/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/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"WL" = ( +/obj/structure/rack, +/obj/item/clothing/head/helmet, +/obj/item/clothing/head/helmet, +/obj/item/clothing/head/helmet, +/obj/effect/turf_decal/tile/red/real_red/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) +"WS" = ( +/obj/structure/sign/warning/deathsposal, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/power1) +"WT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output/tarkon{ + dir = 8 + }, +/turf/open/floor/engine/plasma, +/area/ruin/space/has_grav/port_tarkon/atmos) +"WX" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) +"Xa" = ( +/obj/machinery/firealarm/directional/south{ + pixel_y = -31 + }, +/turf/open/floor/grass, +/area/ruin/space/has_grav/port_tarkon/garden) +"Xf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"Xi" = ( +/obj/structure/closet/crate/bin{ + pixel_y = 8 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/item/reagent_containers/cup/rag, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Xo" = ( +/obj/effect/turf_decal/tile/yellow/full, +/obj/structure/rack/shelf, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"Xr" = ( +/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/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Xs" = ( +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/port_tarkon/dorms) +"Xu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"XE" = ( +/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/tile/brown/half{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"XH" = ( +/obj/machinery/light/directional/west, +/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, +/area/ruin/space/has_grav/port_tarkon/porthall) +"XJ" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/machinery/iv_drip, +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"XL" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/green/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"XO" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"XW" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"XX" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"Yc" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/atmospherics/pipe/layer_manifold/brown/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Ye" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/port_tarkon/kitchen) +"Yj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Yk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Yl" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/coffee_condi_display{ + pixel_x = 6 + }, +/obj/item/storage/fancy/coffee_cart_rack{ + pixel_x = -9; + pixel_y = -3 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"Yn" = ( +/obj/structure/alien/resin/membrane, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) +"Yr" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/developement) +"Ys" = ( +/obj/machinery/door/firedoor/solid, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Yv" = ( +/obj/item/stack/tile/carpet/neon/simple/purple/nodots/sixty, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/cargo) +"Yw" = ( +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/power1) +"Yx" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"Yy" = ( +/obj/machinery/vending/hydronutrients, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/garden) +"YD" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/item/areaeditor/blueprints/slime, +/obj/item/slime_extract/grey, +/obj/item/slime_extract/grey, +/obj/item/slime_extract/grey, +/obj/structure/closet/crate/secure/science, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"YL" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) +"YM" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/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/red/real_red/half{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/starboardhall) +"YO" = ( +/obj/effect/mob_spawn/ghost_role/human/tarkon/med, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"YP" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/structure/closet/crate/secure/science, +/obj/item/raw_anomaly_core/random, +/obj/item/raw_anomaly_core/random, +/obj/item/raw_anomaly_core/random, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"YT" = ( +/obj/machinery/door/airlock/research/glass, +/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/tarkon/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"YW" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 4 + }, +/turf/open/misc/asteroid/airless, +/area/ruin/space/has_grav) +"YX" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"YY" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/red/fourcorners{ + color = "#DE3A3A" + }, +/obj/machinery/computer/atmos_control/tarkon/nitrogen_tank{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/atmos) +"YZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) +"Za" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/toolstorage) +"Zb" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/comms) +"Zs" = ( +/obj/effect/turf_decal/tile/blue/half, +/obj/structure/table/optable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/trauma) +"Zt" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/atmos) +"Zw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"Zx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/storage) +"Zy" = ( +/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/tile/neutral/anticorner, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ZC" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/misc/asteroid/airless, +/area/solars/tarkon) +"ZF" = ( +/obj/structure/table, +/obj/item/encryptionkey/headset_cargo/tarkon, +/obj/item/encryptionkey/headset_cargo/tarkon, +/obj/item/encryptionkey/headset_cargo/tarkon, +/obj/item/encryptionkey/headset_cargo/tarkon, +/obj/item/encryptionkey/headset_cargo/tarkon, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/cargo) +"ZH" = ( +/obj/structure/curtain/cloth, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) +"ZL" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) +"ZR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/layer_manifold/supply{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) +"ZV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) -"Bx" = ( -/obj/structure/fluff/metalpole, -/turf/open/space/basic, -/area/space) -"Fi" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/ensign, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Ge" = ( -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"IC" = ( -/obj/machinery/light_switch/directional/east, -/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, -/area/ruin/space/has_grav/port_tarkon) -"IX" = ( -/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, -/area/ruin/space/has_grav/port_tarkon) -"Nk" = ( -/obj/structure/fluff/empty_sleeper{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"QR" = ( -/obj/item/crowbar, -/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, -/area/ruin/space/has_grav/port_tarkon) -"Up" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vb" = ( -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vj" = ( -/obj/structure/fluff/empty_sleeper, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) "ZX" = ( -/obj/modular_map_root/port_tarkon{ - key = "port" +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenics Room" }, -/turf/open/misc/asteroid/airless, -/area/space) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor/solid, +/obj/structure/cable, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) "ZY" = ( -/turf/open/space/basic, -/area/space) +/turf/template_noop, +/area/template_noop) +"ZZ" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/port_tarkon/atmos) (1,1,1) = {" ZY @@ -295,6 +7681,16 @@ ZY ZY ZY ZY +xw +ZY +ZY +ZY +ZY +xw +ZY +ZY +ZY +OS ZY ZY ZY @@ -302,24 +7698,14 @@ ZY ZY ZY ZY +xw ZY ZY ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +xw ZY ZY "} @@ -423,14 +7809,14 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +kV +kV +kV +kV +kV ZY ZY ZY @@ -487,55 +7873,55 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +iL +kV +kV +kV +zY +zY +bt +zY +zY +bt +zY +zY +zY +zY +zY +zY +zY +zY +zY +zY ZY ZY ZY ZY ZY ZY +xw ZY ZY ZY @@ -557,53 +7943,53 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +YW +kV +zY +zY +zY +bt +zY +bt +zY +zY +zY +zY +zY +bt +zY +bt +zY +bt +bt +bt +bt +zY ZY ZY ZY @@ -628,57 +8014,57 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +XX +QK +zY +zY +bt +zY +zY +zY +zY +bt +zY +zY +bt +zY +bt +bt +zY +zY +zY +bt +zY +zY +zY +zY +zY ZY ZY ZY @@ -699,60 +8085,60 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +kV +kV +cU +cU +cU +fu +fu +fu +fu +fu +fu +fu +fu +fu +fu +fu +fu +JV +JV +JV +JV +fu +fu +fu +Sn +Sn +jt +sf +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +bt +bt +zY +bt +zY +zY +zY +bt +bt +zY +zY +bt +zY ZY ZY ZY @@ -771,61 +8157,61 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +kV +cU +cU +cU +Yn +oL +mo +nj +nj +nj +nj +nj +Dz +Dz +ax +Hi +Hi +jB +Hi +Hi +Hi +Hi +XH +cI +oN +lt +hP +aY +GL +lN +hX +Iz +lN +OG +En +lN +EU +ER +lN +bt +bt +bt +kV +kV +zY +bt +zY +zY +zY +zY +zY +zY ZY ZY ZY @@ -843,63 +8229,63 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +cU +cU +cU +Yn +Yn +QS +Pl +fu +TO +wk +FS +HC +Do +FS +iR +FY +FS +FS +FY +FS +FS +xu +FS +FS +wk +Tx +Ot +xn +GH +GJ +lN +VE +HN +lN +Je +MV +lN +sO +BB +lN +bt +NC +yU +kV +kV +kV +bt +bt +bt +bt +bt +bt +zY +zY ZY ZY ZY @@ -916,63 +8302,63 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +cU +cU +Yn +Yn +QS +QS +VA +eL +bL +ie +YL +BO +iD +rD +Pc +Dt +Dt +Dt +bb +Dt +Dt +Dt +qz +Pc +RF +FS +LL +lt +dp +wF +lC +lN +Dq +qL +lN +XL +qL +lN +ii +qL +lN +Sn +Gr +Sn +kV +ZY +kV +Sn +bt +zY +bt +bt +zY +zY +zY ZY ZY ZY @@ -988,66 +8374,66 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +kV +kV +kV +cU +Yn +cm +QS +QS +QS +QS +DB +Yr +Yr +Yr +Yr +iZ +yb +Yr +Yr +Yr +Yr +Yr +Yr +Yr +Yr +Yr +Yr +zA +pk +AQ +Sn +NE +lM +rL +yO +rr +RL +YY +uB +OU +Ah +dW +VH +nq +tS +tR +Sn +Sn +hO +ZZ +Sn +zY +bt +zY +bt +bt +zY +zY +zY +xw ZY ZY ZY @@ -1061,65 +8447,65 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +cU +cU +Yn +jx +QS +QS +Io +QS +MM +Yr +fM +Tk +dF +mi +OW +DI +Ho +PK +MZ +Ia +Tk +Su +pe +Nd +Yr +AG +FS +TD +Sn +nJ +wA +rL +vb +vb +vb +vb +vb +vb +vb +vb +vb +rP +vl +hm +lU +qd +MY +GQ +Sn +zY +zY +bt +zY +bt +zY +zY +kV ZY ZY ZY @@ -1133,66 +8519,66 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +cU +Yn +QS +QS +QS +nQ +QS +QS +qE +Yr +AS +jX +os +jX +jX +jX +yG +PK +qZ +Yx +jX +jX +jX +yG +Yr +TE +dd +TD +Sn +oJ +wA +QV +wu +vb +vb +vb +vb +vb +vb +vb +vb +ET +Sn +DT +Sn +wH +VO +jL +Sn +kV +bt +zY +bt +bt +zY +kV +kV ZY ZY ZY @@ -1206,69 +8592,69 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +kV +kV +cU +cU +Yn +LR +Ks +jx +Ks +LR +jx +vx +Yr +lm +jX +sc +jX +jX +jX +yG +PK +Ht +vS +jX +jX +Ws +yG +Yr +AG +mp +TD +Sn +TX +nW +rL +vb +vb +vb +vb +vb +vb +vb +vb +Vv +we +WA +Uo +Sn +Sn +oX +Sn +Sn +kV +kV +zY +bt +zY +zY +kV +kV ZY ZY +xw ZY ZY "} @@ -1279,66 +8665,66 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +cU +Yn +mQ +QS +QS +Io +QS +QS +eH +Om +Yr +NO +hp +sc +jX +jX +Ws +yG +PK +be +yP +jX +jX +Qa +yG +yo +AG +FS +DW +Sn +jO +nW +rL +vb +vb +vb +vb +vb +vb +vb +vb +vb +jb +MG +AH +Oz +Pf +dG +Pk +kV +zY +tL +bt +bt +zY +kV +kV +kV ZY ZY ZY @@ -1351,67 +8737,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +cU +Yn +QS +QS +Pa +dV +pR +Om +lB +vx +Yr +YP +Fa +CC +tk +JB +JB +Nz +PK +Dj +yP +jX +jX +Qa +yG +Yr +AG +FS +TD +Sn +aM +nW +rL +vb +vb +vb +vb +vb +vb +vb +vb +vb +jb +Kr +Hc +RA +Sn +Eg +Sn +kV +tL +kV +pT +zY +zY +kV +kV +kV ZY ZY ZY @@ -1424,67 +8810,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +bB +bB +bB +bB +bB +bB +bB +nh +bB +Du +Yr +sS +jX +jX +Ex +jX +uQ +mf +YT +lq +wK +wK +wK +SW +fD +Yr +Ad +FS +TD +Sn +mm +nW +rL +vb +vb +vb +vb +vb +vb +vb +vb +vb +jb +vG +qG +fe +Sn +mC +ZZ +kV +tL +kV +kV +kV +kp +kV +kV +kV ZY ZY ZY @@ -1497,67 +8883,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +kV +zY +bt +bt +zY +zY +zY +eT +xr +xr +Sq +Yr +GA +EW +EW +gF +zL +zL +kD +gB +sX +Qa +jX +jX +eC +DQ +Yr +AG +FS +TD +Sn +Vs +nW +FR +rg +rg +rg +rg +rg +rg +rg +vb +vb +DH +pJ +NV +xO +Sn +ZY +kV +kV +bt +Js +pT +pT +zY +kV +kV +kV ZY ZY ZY @@ -1570,67 +8956,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +zY +zY +bt +zY +bt +zY +bt +eT +xr +xr +Sq +Yr +Wx +yZ +GV +bF +ZH +nC +xE +gB +Hs +wo +jX +jX +gE +ct +nw +BI +KE +za +Sn +PL +rM +PW +qf +Vh +Hm +xb +rt +yH +rc +sA +Pw +Ob +Zt +Zt +Sn +Sn +kV +kV +bt +zY +zY +oG +lD +aJ +kV +kV +kV ZY ZY ZY @@ -1641,69 +9027,69 @@ ZY ZY ZY ZY +xw ZY -ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +zY +zY +zY +zY +zY +bt +zY +eT +jh +qm +Sq +Yr +xd +jX +jX +cM +ZH +jX +gX +gB +ho +Mx +jX +jX +Hf +Tw +Yr +AG +FS +DW +Sn +bD +Id +bD +lN +qL +pY +lN +qL +Yc +lN +qL +bM +lN +Sn +Sn +Sn +bt +bt +bt +bt +zY +gb +KQ +KQ +kX +ZC +RW +gb ZY ZY ZY @@ -1716,67 +9102,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +zY +zY +zY +bt +bt +bt +bt +bt +eT +Uj +IB +Sq +Yr +hD +hp +cM +cM +ZH +jX +Qb +gB +Dj +Jd +jX +jX +jX +bj +Yr +AG +FS +TD +Sn +vb +Iv +vb +lN +vg +Kf +lN +GD +ve +lN +OC +WT +lN +bt +bt +bt +bt +zY +uS +gb +kX +ZC +RW +KQ +Bt +KQ +Iq +gb ZY ZY ZY @@ -1789,67 +9175,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +bt +zY +bt +bt +zY +zY +eT +dj +xr +wW +Yr +YD +jX +cM +jX +Lk +bf +JI +gB +Lu +Mq +nr +TF +EE +Hh +Yr +AG +dd +TD +Sn +vb +vb +vb +lN +tn +Tl +lN +Po +ak +lN +iW +cX +lN +bt +bt +bt +bt +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -1862,67 +9248,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +zY +zY +bt +bt +zY +zY +eT +Qy +qm +Sq +aI +lS +gc +IL +gc +vm +jr +zM +vP +vP +vP +vP +vP +vP +vP +fu +TE +FS +TD +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +rk +Sn +Sn +Sn +xp +bt +bt +bt +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -1935,67 +9321,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +bt +zY +bt +zY +zY +bt +eT +jh +sp +Sq +aI +Dj +Fa +mG +wm +yG +jr +Ly +su +dU +VC +lz +GK +eA +Xo +fu +AG +mp +We +fu +Xi +WG +WG +mt +zQ +Td +ms +cK +aq +SD +JQ +Ma +tg +ms +kV +kV +kV +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -2008,70 +9394,70 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +zY +bt +bt +zY +zY +bt +zY +zY +zY +eT +xr +xr +Sq +aI +uj +jX +cM +jX +At +jr +mK +Ae +Ae +Ae +Za +vR +QE +vP +fu +yf +pk +Xu +fu +rh +sa +mt +mt +mt +mt +ms +lE +Jg +gR +eN +gW +Lt +WS +kV +kV +kV +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY +xw ZY ZY "} @@ -2081,67 +9467,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +bt +zY +bt +zY +zY +bt +eT +RZ +OI +av +aI +Dj +uQ +cM +DD +ku +jr +JD +Ae +uT +TP +uE +qg +Lw +qg +Mz +rN +eF +wb +oV +rh +MD +rh +mt +mt +mt +ms +VY +Qi +mh +eN +Yw +Lt +ah +ah +ah +ah +ZC +ZC +ZC +Hn +KQ +TG +ZC +Hn +KQ +TG +ZC ZY ZY ZY @@ -2154,67 +9540,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +bt +zY +xC +xC +bt +bt +zY +eT +xr +xr +Sq +aI +Dj +jX +cM +jX +yG +jr +vo +rb +TP +sh +qg +qg +dC +KB +Py +uh +uh +PD +cD +rN +oV +rh +rh +br +yk +ms +hb +Cc +cy +nK +SN +Lt +Kt +Tn +Tn +GF +tc +jV +jV +jV +KQ +KQ +KQ +KQ +KQ +KQ +KQ ZY ZY ZY @@ -2227,67 +9613,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +xC +kV +kV +xC +bt +zY +eT +qm +qm +Sq +aI +sX +Fa +cM +jX +yG +jr +VR +TP +qh +qg +qg +Mz +kk +zf +zf +Kb +Jq +rl +Pb +Pb +NU +FW +rh +rh +ms +ms +ms +ms +ms +CN +Yw +HS +ah +ah +ah +ah +Bb +Bb +Bb +nT +KQ +IO +Bb +nT +KQ +IO +Bb ZY ZY ZY @@ -2297,70 +9683,70 @@ ZY (31,1,1) = {" ZY ZY +xw ZY ZY -ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +xC +kV +EN +kV +EN +xC +zY +eT +xr +xr +lv +aI +Dj +jX +cM +wm +yG +jr +lO +zn +qg +qg +iF +vO +NA +xx +xx +xx +xx +xx +xx +zE +oh +kC +FW +Of +ya +al +NS +sq +ms +xa +Yw +xD +ah +kV +kV +kV +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -2373,67 +9759,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -Nk +zY +zY +xC +kV +Kn +EN +kV +xC +bt +eT +jh +Qy +Sq +aI +uj +jX +sc +jX +ku +jr +gD +OM +NY +Mz +Pq +RJ +xx +xx +pN +Tm +xx Vb -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +Vb +zE +zE +Uf +Nh +FW +gm +Tn +ne +IV +ms +Vo +Lz +VN +ah +kV +kV +kV +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -2446,67 +9832,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -Ge -Vb -tD -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +xC +kV +EN +kV +kV +xC +zY +eT +xr +IB +Sq +aI +Og +nR +BE +me +xG +jr +Xo +vP +qg +cL +Nx +mj +xx +do +Up +Up +xx +TV +Up +QP +zE +Ej +Yk +xT +Eo +ms +AW +Fc +ms +DM +WI +MH +ms +kV +kV +kV +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -2519,67 +9905,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -Fi -Vb -Vb -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +xC +kV +kV +kV +kV +xC +zY +eT +cH +cH +LY +aI +aI +aI +aI +aI +aI +xs +eT +eT +iF +Pq +Vl +xx +xx +am +Up +Ns +xx +bp +Up +QP +xx +xx +IT +if +oV +ms +ms +ms +ms +ms +bO +ms +ms +so +Mw +Mw +gb +gb +gb +Bt +KQ +Iq +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -2592,67 +9978,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -jD -ux -Vb -Vb -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +xC +kV +kV +kV +EN +xC +zY +eT +dj +Uj +xB +Ys +xr +xr +iU +xr +HP +EX +xr +gz +cL +kA +RJ +Vw +Up +Up +ZV +Bu +xx +Vj +Up +Up +Up +Vc +Uf +Px +RJ +Np +wr +wr +OP +aR +Kh +RC +RC +Cq +Tz +Mw +Mw +gb +gb +uu +Bb +kh +gb +Bt +KQ +Iq +gb ZY ZY ZY @@ -2665,67 +10051,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -QR -IX -IX +zY +zY +xC +EN +kV +kV +kV +xC +bt +eT +xr +Uj +xB +BL +xr +xr +xr +xr +xr +xr +xr +BL +wV +pK +RJ +xx +ph +Up +nU +Db +HV +Db +Up +Up qo -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +xx +lG +Px +bY +dS +RC +RC +LS +RC +If +RC +RC +RV +RC +Tz +Mw +Mw +gb +gb +gb +gb +gb +uu +Bb +kh +gb ZY ZY ZY @@ -2737,68 +10123,68 @@ ZY ZY ZY ZY -ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -jD +xw +zY +bt +bt +xC +kV +kV +xC +bt +zY +eT +xr +bk +xB +sx +Sq +Sq +eu +pq +wc +Op +Op +QF +kU +kA +RJ +Vw Up -IX -IC +Up +FG +zp +xx +Db +Db +Db +Db ZX -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +Tv +LQ +Kv +mJ +bH +bH +Sw +bH +pi +JZ +JZ +JZ +dz +qx +tx +Mw +kV +kV +kV +kV +kV +kV +kV +kV +kV ZY ZY ZY @@ -2811,70 +10197,70 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -Vj -Vb -Vb -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +zY +zY +zY +xC +kV +xC +zY +bt +zY +eT +jh +xr +tA +EH +EH +EH +EH +jY +EH +EH +EH +EH +Cu +VU +RJ +xx +xx +Ip +Up +hS +xx +bp +Up +QP +xx +xx +Uf +xT +Fd +hG +hG +hG +hG +hG +Bd +so +zg +zg +Qm +sj +zg +zg +cQ +cQ +cQ +kV +kV +kV +kV +kV +kV ZY ZY +xw ZY ZY "} @@ -2884,67 +10270,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -cw -Vb -tD -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +xC +EN +xC +bt +bt +bt +eT +Qy +xr +Sq +EH +hf +fS +iB +XO +zV +DL +KF +EH +rh +vj +cD +pF +xx +kR +Up +Up +xx +TV +Up +QP +zE +vX +Dv +xT +Yl +BN +DG +pC +wq +hG +Ab +uF +zg +JM +Eb +bT +xc +rC +kF +bS +cQ +cQ +cQ +kV +kV +kV +kV ZY ZY ZY @@ -2957,67 +10343,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -cZ -Vb -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +bt +xC +kV +xC +bt +zY +zY +eT +xr +dn +Sq +EH +Ri +Bk +Jv +qS +Bk +Bk +KU +OQ +rh +Dc +VU +fA +xx +xx +cn +Ur +xx +ha +ha +zE +zE +Uf +iX +Zy +Sg +DA +DA +DA +Ye +hG +WX +WX +zg +wv +RY +Rv +TZ +TZ +TZ +Dr +wT +Uk +cQ +kV +kV +kV +kV ZY ZY ZY @@ -3030,67 +10416,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +xC +kV +xC +zY +bt +zY +eT +xr +xr +Sq +EH +af +YO +Bk +qS +BW +Bk +Bk +Wd +rh +Of +eG +AP +oV +xx +xx +xx +xx +xx +xx +zE +Mz +Dv +xT +dJ +ns +tE +tE +zR +ov +hG +qr +sI +zg +rG +RY +TZ +TZ +TZ +TZ +TZ +TZ +Rx +cQ +cQ +kV +kV +kV ZY ZY ZY @@ -3103,67 +10489,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +xC +kV +xC +bt +zY +zY +eT +xr +xr +Sq +EH +Oa +kl +Bk +qS +Bk +Bk +Bk +us +rh +rh +rh +Cu +AP +rN +rN +mS +IU +rN +IM +rN +Dv +ra +xT +dJ +Pt +tE +JA +zR +gd +hG +Uc +Wr +zg +Kx +RY +TZ +jA +tN +IJ +TZ +BS +Wi +Uk +cQ +kV +kV +kV ZY ZY ZY @@ -3176,67 +10562,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +xC +kV +xC +xC +bt +bt +eT +xr +IB +xB +EH +Cm +Gj +Bk +qS +Yj +Yj +qM +Ao +rh +fc +rh +rh +hQ +Pb +Ie +uh +uh +UH +Pb +Pb +Pb +Pb +VQ +ev +Hq +UN +tE +Sz +QZ +hG +wx +Ko +zg +rs +RY +Vi +Vi +HH +Gu +Vi +Vi +fr +HE +cQ +cQ +kV +kV ZY ZY ZY @@ -3249,67 +10635,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +bt +xC +kV +kV +kV +xC +zY +eT +RZ +Uj +xB +NT +fk +qS +qS +qS +CF +Bv +CF +Cn +rh +KR +KR +rh +SM +rh +oh +zf +ix +pA +Nv +Nv +Nv +aD +oQ +Nv +cl +hG +XW +Sz +Bp +hG +NB +Sy +zg +Mf +MQ +lh +TZ +TZ +FF +TZ +TZ +lh +qX +Uk +cQ +kV +kV ZY ZY ZY @@ -3322,67 +10708,67 @@ ZY ZY ZY ZY +zY +bt +bt +xC +EN mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +xC +zY +eT +jh +bk +xB +yV +Qx +Cf +Bk +Bk +CF +Yj +qS +XJ +rh +ym +bA +LV +aT +rh +rh +wa +VB +Tg +Nv +VV +hH +jd +OZ +hH +Ll +hG +IQ +Sz +Bj +hG +cv +Yv +zg +Zb +jE +eQ +xm +eQ +om +eQ +eQ +Kc +Ai +ey +cQ +kV +kV ZY ZY ZY @@ -3395,67 +10781,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +bt +xC +kV +kV +EN +xC +zY +eT +cH +cH +Ch +EH +lk +Ci +Ci +Ci +CF +Bk +Ju +Zs +rh +at +KR +rA +ZR +OA +rh +PG +fP +xK +Nv +VV +pb +jd +JF +JF +hH +yY +tE +hM +Bj +hG +wx +Ko +EQ +EQ +EQ +EQ +SZ +SZ +SZ +SZ +SZ +SZ +SZ +SZ +SZ +kV +kV ZY ZY ZY @@ -3466,69 +10852,69 @@ ZY ZY ZY ZY +xw ZY -ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +bt +bt +xC +kV +kV +xC +zY +eT +xr +Qy +Ms +EH +Cg +lA +Dg +KJ +xo +HX +IW +AZ +rh +Na +IZ +KH +dO +OA +rh +fZ +LW +xK +Nv +VV +OZ +Yy +kn +JF +hH +Wt +tE +Ca +qF +hG +KP +Qc +oH +DN +Qq +CY +AR +DZ +cC +lu +mO +cC +cC +DS +SZ +kV +kV ZY ZY ZY @@ -3541,70 +10927,70 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +zY +zY +zY +bt +bt +xC +kV +xC +bt +eT +YZ +Fb +tZ +EH +EH +EH +EH +EH +EH +EH +EH +EH +rh +RS +RS +RS +RS +RS +RS +YM +Ik +vr +Nv +VV +OZ +jQ +MT +JF +Km +hG +tC +hG +hG +hG +gG +FB +tj +CS +CS +SR +AR +CA +hc +hc +hc +Em +oE +NI +VJ +kV +kV ZY ZY +xw ZY ZY "} @@ -3614,67 +11000,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +bt +bt +xC +kV +xC +zY +eT +xr +OI +Ms +eT +zY +bt +bt +bt +bt +bt +zY +zY +zY +OV +va +Mg +tm +KZ +rS +uC +wP +xI +Nv +hH +OZ +OZ +OZ +pf +Xa +hG +VZ +VZ +Ut +hG +uW +zT +rp +rp +md +Hk +yq +Xr +dB +VK +VK +nb +AR +kS +SZ +kV +kV ZY ZY ZY @@ -3687,67 +11073,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +bt +zY +xC +kV +xC +zY +eT +kG +IB +Re +eT +zY +zY +bt +xC +xC +xC +xC +bt +bt +OV +Nc +Wk +id +qc +jq +fP +fP +xI +Nv +wj +tT +tT +tT +tT +iG +hG +VZ +VZ +Ut +hG +yc +qv +yc +yc +fJ +SR +zH +Xr +VK +VK +VK +sk +zB +Qo +Pz +kV +kV ZY ZY ZY @@ -3760,67 +11146,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +bt +bt +xC +kV +xC +bt +eT +YZ +Hg +pP +eT +bt +bt +xC +xC +kV +EN +xC +xC +bt +OV +wf +mM +fI +pS +jq +dE +VB +oy +Nv +Nv +Nv +Nv +Nv +Nv +Nv +hG +hG +hG +hG +hG +SA +MJ +uJ +yc +ab +SR +AR +GN +VK +VK +VK +dv +hv +TT +NX +kV +kV ZY ZY ZY @@ -3833,67 +11219,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +bt +zY +bt +bt +xC +EN +xC +zY +xC +ug +ug +ug +xC +bt +xC +xC +kV +kV +kV +kV +xC +zY +OV +JP +Wk +rj +fg +jq +fP +fP +kc +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +ys +fW +Ph +Tt +yc +ab +bg +AR +Zx +VK +VK +VK +sk +hv +Ei +NX +kV +kV ZY ZY ZY @@ -3906,67 +11292,67 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zY +zY +bt +zY +bt +xC +kV +kV +xC +EN +kV +kV +kV +xC +bt +xC +kV +EN +EN +EN +kV +xC +bt +OV +UD +ai +rj +DE +kN +fP +wP +Ph +fP +fP +fP +dN +fP +fP +fP +fP +qe +fP +fP +fP +dN +Ph +QH +Rs +Lj +Lv +AR +QO +VK +VK +VK +sk +hv +Ei +NX +kV +kV ZY ZY ZY @@ -3979,67 +11365,67 @@ ZY ZY ZY ZY +kV +zY +zY +bt +bt +xC mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +EN +kV +kV +kV +kV +xC +bt +bt +xC +kV +EN +Sl +EN +kV +xC +bt +OV +bU +Wk +rj +Cp +OV +UP +fP +gv +Xf +hB +zZ +zZ +zZ +gT +tG +Xf +sG +sG +sG +sG +XE +QG +ud +yc +ig +ZF +AR +Sx +VK +VK +VK +dv +hv +TT +NX +kV +kV ZY ZY ZY @@ -4052,140 +11438,140 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +kV +zY +zY +bt +bt +bt +xC +kV +kV +kV +kV +xC +bt +bt +xC +kV +kV +EN +EN +EN +kV +xC +bt +OV +Tc +Wk +rj +pr +OV +HU +HU +HU +ar +ar +ar +qB +ar +ar +ar +mD +gq +Pe +HB +gq +FI +gq +mD +mD +mD +mD +AR +Sx +VK +VK +VK +sk +zC +wp +AA +kV +kV ZY ZY ZY +xw ZY "} (56,1,1) = {" ZY +xw ZY ZY ZY -ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +zY +zY +zY +bt +xC +kV +EN +kV +xC +bt +bt +xC +kV +kV +EN +kV +kV +kV +kV +xC +bt +OV +WL +Wk +rj +dg +bl +rj +Eq +OV +Xs +Xs +Xs +Ic +Xs +Xs +Xs +mD +FO +ml +ml +ml +JY +cz +zm +WC +rO +uO +AR +Sx +dB +VK +VK +Pj +kY +kY +SZ +kV +kV ZY ZY ZY @@ -4198,67 +11584,67 @@ ZY ZY ZY ZY +kV +kV +zY +bt +zY +bt +xC +kV +kV +kV +xC +bt +bt +xC mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +RE +RE +RE +kV +EN +xC +zY +OV +ou +Wk +rj +qc +RG +kE +Se +OV +Xs +Xs +Xs +Xs +Xs +Xs +Xs +mD +eM +Jf +Zw +Gz +eP +Gz +Gz +Gz +fy +BZ +AR +py +hc +hc +hc +Jb +cC +Mp +VJ +kV +kV ZY ZY ZY @@ -4272,66 +11658,66 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +zY +zY +zY +zY +xC +kV +kV +kV +xC +bt +bt +xC +EN +kV +kV +kV +RE +RE +xC +xC +bt +OV +fX +sv +rj +EG +rq +OV +OV +OV +Xs +Xs +Xs +Xs +Xs +Xs +Xs +mD +Ol +aG +QL +UI +HM +QL +ae +ae +mX +QM +AR +ds +TQ +Rp +YX +TQ +TQ +ex +SZ +kV +kV ZY ZY ZY @@ -4345,66 +11731,66 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +kV +kV +zY +zY +bt +xC +EN +kV +kV +EN +xC +xC +xC +RE +RE +RE +EN +kV +kV +xC +bt +bt +OV +UO +Wk +rj +qc +Di +gy +Se +OV +Xs +Xs +Xs +Xs +Xs +Xs +Xs +mD +yy +dm +PA +yT +qR +eS +cu +dm +eS +Gk +AR +AR +AR +AR +AR +AR +AR +AR +SZ +kV +kV ZY ZY ZY @@ -4418,65 +11804,65 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +zz +kV +zY +zY +zY +xC +Kn +EN +kV +kV +kV +kV +RE +kV +kV +kV +kV +EN +kV +xC +bt +bt +OV +Um +qP +yD +Nn +JL +Va +Eq +OV +Xs +Xs +Xs +Xs +Xs +Xs +Xs +Wj +Wj +Wj +It +nZ +Wj +Wj +Wj +Wj +Wj +Wj +mD +zY +zY +bt +bt +zY +zY +zY +kV +kV ZY ZY ZY @@ -4492,64 +11878,64 @@ ZY ZY ZY ZY +kV +kV +zY +zY +bt +xC +kV +EN +kV +kV +kV +RE +EN +RE +kV +EN mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn +xC +zY +zY +bt +OV +OV +OV +OV +OV +OV +OV +OV +OV +vw +vw +vw +vw +vw +vw +vw +Wj +Kg +rO +Nj +oZ +Wy +mq +Uu +hh +hh +MX +bt +bt +bt +zY +zY +zY +zY +kV +kV +kV ZY ZY ZY @@ -4562,69 +11948,69 @@ ZY ZY ZY ZY -mn +kV ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY +kV +kV +kV +zY +bt +zY +xC +xC +xC +xC +kV +kV +kV +RE +kV +kV +xC +bt +zY +zY +zY +bt +zY +bt +bt +bt +bt +zY +bt +bt +zY +bt +bt +zY +zY +he +zY +MX +jH +Gz +qT +Tj +ae +gV +Ti +nE +ZL +Nf +kV +bt +zY +bt +zY +zY +kV +kV +kV ZY ZY +kV ZY ZY ZY @@ -4634,71 +12020,71 @@ ZY ZY ZY ZY -mn -mn +bt +zY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY -ZY +kV +kV +kV +zY +zY +bt +zY +zY +bt +xC +xC +xC +xC +xC +xC +bt +zY +zY +zY +zY +bt +bt +bt +zY +zY +zY +bt +zY +zY +bt +bt +zY +zY +zY +he +zY +MX +qt +ma +Bl +mc +KG +qk +MX +jZ +tz +MX +kV +bt +zY +zY +zY +kV +kV +kV ZY ZY ZY +bt +kV ZY ZY ZY @@ -4707,155 +12093,155 @@ ZY ZY ZY ZY -mn -mn -ZY -ZY -ZY -ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -ZY -ZY -ZY -ZY -ZY +bt +bt +ZY +ZY +xw +ZY +kV +kV +kV +kV +zY +bt +zY +zY +zY +bt +zY +bt +bt +zY +zY +zY +zY +bt +bt +zY +zY +bt +bt +bt +bt +bt +bt +bt +bt +zY +bt +bt +zY +zY +he +MX +wZ +MX +yj +yj +MX +wZ +MX +MX +MX +MX +kV +bt +bt +zY +kV +kV +kV ZY ZY ZY +kV +zY +bt +kV +xw ZY "} (65,1,1) = {" ZY ZY -mn -mn -mn -mn +zY +bt +bt +zY ZY ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn kV -mn -mn -mn -mn -mn -mn -ZY -ZY -ZY -ZY +kV +kV +kV +zY +bt +bt +zY +bt +zY +zY +zY +bt +bt +zY +bt +zY +zY +bt +zY +zY +zY +zY +bt +zY +zY +zY +zY +zY +zY +kV +kV +kV +kV +kV +kV +kV +xe +kV +kV +kV +kV +kV +FZ +kV +zY +kV +kV +kV +kV ZY ZY ZY ZY +kV +bt +bt +bt ZY ZY "} (66,1,1) = {" ZY ZY -mn -mn -mn -mn +bt +bt +zY +bt ZY ZY ZY @@ -4863,72 +12249,72 @@ ZY ZY ZY ZY -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn -mn kV -mn -mn -mn -mn -ZY -ZY -ZY -ZY -ZY +kV +kV +kV +zY +bt +zY +bt +bt +bt +bt +bt +zY +zY +zY +zY +bt +zY +bt +zY +zY +bt +zY +zY +zY +bt +zY +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +kV +FZ +kV +kV +kV +kV ZY ZY ZY ZY ZY +kV +zY +bt +zY +bt ZY ZY "} (67,1,1) = {" ZY -mn -mn -mn -mn -mn +kV +zY +bt +bt +bt ZY ZY ZY @@ -4977,13 +12363,7 @@ ZY ZY ZY ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY +Sm ZY ZY ZY @@ -4991,7 +12371,13 @@ ZY ZY ZY ZY +xw ZY +kV +zY +zY +zY +bt ZY ZY "} @@ -4999,10 +12385,40 @@ ZY ZY ZY ZY -mn -mn -mn -mn +zY +bt +zY +kV +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +xw +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +xw ZY ZY ZY @@ -5020,6 +12436,7 @@ ZY ZY ZY ZY +Sm ZY ZY ZY @@ -5028,48 +12445,18 @@ ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +bt +bt +zY +bt +bt ZY ZY "} (69,1,1) = {" ZY +xw ZY ZY ZY @@ -5087,6 +12474,7 @@ ZY ZY ZY ZY +kV ZY ZY ZY @@ -5097,6 +12485,11 @@ ZY ZY ZY ZY +kV +zY +zY +bt +kV ZY ZY ZY @@ -5116,6 +12509,7 @@ ZY ZY ZY ZY +Sm ZY ZY ZY @@ -5123,21 +12517,13 @@ ZY ZY ZY ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +bt +bt +bt +bt +zY +bt ZY ZY "} @@ -5146,6 +12532,39 @@ ZY ZY ZY ZY +OS +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +xw +ZY +ZY +zY +zY +ZY +ZY +ZY +ZY +ZY +ZY +kV +kV +kV +zY +zY +zY +bt +zY +kV +kV ZY ZY ZY @@ -5163,54 +12582,21 @@ ZY ZY ZY ZY +Sm ZY ZY ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +bt +zY +zY +bt +zY +zY +bt ZY ZY "} @@ -5222,6 +12608,39 @@ ZY ZY ZY ZY +xw +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +zY +zY +zY +kV +ZY +ZY +ZY +ZY +zY +zY +zY +zY +zY +zY +bt +zY +zY +zY +zY +kV +kV ZY ZY ZY @@ -5236,54 +12655,21 @@ ZY ZY ZY ZY +Sm ZY ZY ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +bt +bt +zY +zY +zY +bt +bt ZY ZY "} @@ -5301,6 +12687,32 @@ ZY ZY ZY ZY +kV +kV +kV +ZY +ZY +kV +zY +zY +zY +zY +kV +ZY +ZY +ZY +zY +bt +zY +bt +bt +zY +zY +zY +zY +bt +bt +kV ZY ZY ZY @@ -5316,47 +12728,21 @@ ZY ZY ZY ZY +Sm ZY ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +bt +zY +bt +bt +zY +zY +bt +bt ZY ZY "} @@ -5370,6 +12756,36 @@ ZY ZY ZY ZY +kV +bt +zY +bt +bt +zY +kV +ZY +ZY +kV +zY +zY +zY +zY +ZY +ZY +ZY +kV +zY +zY +bt +bt +zY +bt +bt +zY +bt +zY +zY +kV ZY ZY ZY @@ -5385,51 +12801,21 @@ ZY ZY ZY ZY +Sm ZY ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +bt +zY +bt +bt +zY +zY +bt +bt +bt ZY ZY "} @@ -5443,6 +12829,35 @@ ZY ZY ZY ZY +zY +bt +bt +zY +zY +zY +ZY +ZY +ZY +ZY +ZY +ZY +zY +zY +ZY +ZY +ZY +kV +zY +bt +bt +zY +zY +bt +bt +bt +zY +zY +kV ZY ZY ZY @@ -5459,50 +12874,21 @@ ZY ZY ZY ZY +Sm ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +zY +zY +bt +bt +zY +bt +zY +bt +bt +kV ZY ZY "} @@ -5513,6 +12899,37 @@ ZY ZY ZY ZY +kV +kV +bt +zY +zY +bt +bt +bt +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +kV +ZY +ZY +ZY +kV +zY +zY +zY +zY +bt +bt +bt +zY +zY +kV ZY ZY ZY @@ -5530,51 +12947,20 @@ ZY ZY ZY ZY +Sm ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +kV +bt +zY +bt +bt +bt +bt +bt +zY +bt +kV ZY ZY ZY @@ -5586,6 +12972,37 @@ ZY ZY ZY ZY +kV +zY +bt +bt +bt +zY +zY +kV +ZY +ZY +OS +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +zY +zY +bt +bt +zY +zY +zY +zY +kV +kV ZY ZY ZY @@ -5603,53 +13020,22 @@ ZY ZY ZY ZY +Sm ZY ZY ZY ZY ZY +kV +bt +bt +bt +bt +bt +kV ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY +xw ZY "} (77,1,1) = {" @@ -5659,6 +13045,34 @@ ZY ZY ZY ZY +zY +zY +zY +bt +zY +zY +kV +kV +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +xw +ZY +ZY +zY +zY +zY +kV +kV +kV +kV ZY ZY ZY @@ -5679,35 +13093,7 @@ ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx +Sm ZY ZY ZY @@ -5731,6 +13117,30 @@ ZY ZY ZY ZY +kV +zY +bt +bt +bt +bt +kV +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +kV +kV ZY ZY ZY @@ -5756,36 +13166,12 @@ ZY ZY ZY ZY +Sm ZY ZY ZY ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -Bx -ZY -ZY -ZY -ZY -ZY +xw ZY ZY ZY @@ -5853,7 +13239,7 @@ ZY ZY ZY ZY -Bx +Sm ZY ZY ZY diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_secure.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_secure.dmm new file mode 100644 index 00000000000..95aab56ab1c --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_secure.dmm @@ -0,0 +1,296 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/rack/shelf, +/turf/template_noop, +/area/template_noop) +"e" = ( +/obj/structure/rack/shelf, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("tarkon") + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + req_access = list("tarkon") + }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/belt/utility, +/turf/template_noop, +/area/template_noop) +"g" = ( +/obj/structure/rack/shelf, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/head/utility/hardhat/orange, +/turf/template_noop, +/area/template_noop) +"h" = ( +/obj/structure/rack/shelf, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo/starts_empty, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo/starts_empty, +/obj/item/ammo_box/magazine/c35sol_pistol/stendo/starts_empty, +/turf/template_noop, +/area/template_noop) +"m" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/sheet/plasteel/fifty, +/turf/template_noop, +/area/template_noop) +"n" = ( +/obj/structure/rack/shelf, +/obj/item/holosign_creator/janibarrier, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/turf/template_noop, +/area/template_noop) +"s" = ( +/obj/structure/rack/shelf, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("tarkon") + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + req_access = list("tarkon") + }, +/obj/item/mod/core/standard, +/obj/item/mod/core/standard, +/obj/item/mod/core/standard, +/obj/item/mod/core/standard, +/obj/item/mod/core/standard, +/turf/template_noop, +/area/template_noop) +"v" = ( +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("tarkon") + }, +/turf/template_noop, +/area/template_noop) +"B" = ( +/obj/structure/rack/shelf, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access = list("tarkon") + }, +/obj/machinery/door/window/brigdoor/left/directional/south{ + req_access = list("tarkon") + }, +/obj/item/construction/rcd/arcd/mattermanipulator, +/turf/template_noop, +/area/template_noop) +"C" = ( +/obj/modular_map_connector, +/obj/structure/rack/shelf, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/turf/template_noop, +/area/template_noop) +"D" = ( +/turf/template_noop, +/area/template_noop) +"E" = ( +/obj/structure/rack/shelf, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/turf/template_noop, +/area/template_noop) +"F" = ( +/obj/structure/rack/shelf, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access = list("tarkon") + }, +/obj/machinery/door/window/brigdoor/left/directional/south{ + req_access = list("tarkon") + }, +/obj/item/storage/medkit/advanced, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular, +/turf/template_noop, +/area/template_noop) +"G" = ( +/obj/structure/rack/shelf, +/obj/effect/spawner/random/decoration/carpet, +/turf/template_noop, +/area/template_noop) +"H" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access = list("tarkon") + }, +/turf/template_noop, +/area/template_noop) +"L" = ( +/obj/item/pizzabox/margherita, +/obj/item/pizzabox/meat, +/obj/item/pizzabox/mushroom, +/obj/item/pizzabox/margherita, +/obj/item/pizzabox/meat, +/obj/item/pizzabox/mushroom, +/obj/structure/closet/crate/freezer, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("tarkon") + }, +/turf/template_noop, +/area/template_noop) +"O" = ( +/obj/structure/rack/shelf, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access = list("tarkon") + }, +/obj/machinery/door/window/brigdoor/left/directional/south{ + req_access = list("tarkon") + }, +/obj/item/stack/sheet/mineral/plasma/thirty, +/turf/template_noop, +/area/template_noop) +"P" = ( +/obj/structure/rack/shelf, +/obj/item/storage/backpack/duffelbag/mining_conscript, +/turf/template_noop, +/area/template_noop) +"T" = ( +/obj/structure/rack/shelf, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("tarkon") + }, +/obj/machinery/door/window/brigdoor/right/directional/south{ + req_access = list("tarkon") + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +m +g +n +C +D +H +h +"} +(2,1,1) = {" +D +D +D +D +D +L +a +"} +(3,1,1) = {" +D +D +D +D +D +D +D +"} +(4,1,1) = {" +D +D +O +D +D +D +D +"} +(5,1,1) = {" +D +D +T +D +D +D +D +"} +(6,1,1) = {" +D +D +F +D +D +D +D +"} +(7,1,1) = {" +D +D +e +D +D +D +D +"} +(8,1,1) = {" +D +D +B +D +D +D +D +"} +(9,1,1) = {" +D +D +s +D +D +D +D +"} +(10,1,1) = {" +D +D +D +D +D +D +D +"} +(11,1,1) = {" +D +D +D +D +D +H +P +"} +(12,1,1) = {" +G +G +G +E +D +v +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_stock.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_stock.dmm new file mode 100644 index 00000000000..a1e289ac154 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_stock.dmm @@ -0,0 +1,218 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/rack/shelf, +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/template_noop, +/area/template_noop) +"e" = ( +/obj/modular_map_connector, +/turf/template_noop, +/area/template_noop) +"f" = ( +/obj/structure/closet/crate/engineering, +/obj/item/stack/sheet/plasteel/fifty, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/sheet/mineral/plasma/thirty, +/turf/template_noop, +/area/template_noop) +"i" = ( +/obj/item/pizzabox/mushroom, +/obj/item/pizzabox/meat, +/obj/item/pizzabox/margherita, +/obj/item/pizzabox/mushroom, +/obj/item/pizzabox/meat, +/obj/item/pizzabox/margherita, +/obj/structure/closet/crate/freezer, +/turf/template_noop, +/area/template_noop) +"q" = ( +/obj/structure/rack/shelf, +/obj/item/crowbar, +/turf/template_noop, +/area/template_noop) +"s" = ( +/obj/structure/closet/crate, +/obj/item/storage/belt/utility, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/head/utility/hardhat/orange, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/gloves/color/yellow, +/turf/template_noop, +/area/template_noop) +"B" = ( +/obj/structure/closet/crate, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/turf/template_noop, +/area/template_noop) +"D" = ( +/obj/structure/closet/crate/secure/science, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/turf/template_noop, +/area/template_noop) +"F" = ( +/obj/structure/rack/shelf, +/obj/effect/spawner/random/decoration/carpet, +/obj/effect/spawner/random/decoration/carpet, +/obj/effect/spawner/random/decoration/carpet, +/turf/template_noop, +/area/template_noop) +"H" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/holosign_creator/janibarrier, +/turf/template_noop, +/area/template_noop) +"J" = ( +/obj/item/construction/rcd/arcd/mattermanipulator, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/structure/closet/crate/secure/engineering, +/turf/template_noop, +/area/template_noop) +"S" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/advanced, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +f +b +b +e +b +b +F +"} +(2,1,1) = {" +b +b +b +b +b +b +a +"} +(3,1,1) = {" +b +b +b +b +b +b +b +"} +(4,1,1) = {" +b +b +b +b +i +b +b +"} +(5,1,1) = {" +b +b +D +b +b +b +b +"} +(6,1,1) = {" +b +b +b +b +b +b +b +"} +(7,1,1) = {" +s +b +b +b +b +b +b +"} +(8,1,1) = {" +b +b +b +b +b +b +b +"} +(9,1,1) = {" +b +b +J +b +b +b +b +"} +(10,1,1) = {" +b +b +b +b +b +b +b +"} +(11,1,1) = {" +b +b +b +b +b +b +q +"} +(12,1,1) = {" +B +H +b +b +S +b +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_warehouse.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_warehouse.dmm new file mode 100644 index 00000000000..d9b150817b3 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/cargo_warehouse.dmm @@ -0,0 +1,296 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/mineral/titanium/fifty, +/turf/template_noop, +/area/template_noop) +"b" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/turf/template_noop, +/area/template_noop) +"g" = ( +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/rack/shelf, +/turf/template_noop, +/area/template_noop) +"i" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/turf/template_noop, +/area/template_noop) +"l" = ( +/obj/structure/rack/shelf, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/obj/item/mod/construction/broken_core, +/turf/template_noop, +/area/template_noop) +"m" = ( +/obj/structure/rack/shelf, +/obj/item/storage/belt/utility, +/turf/template_noop, +/area/template_noop) +"n" = ( +/obj/structure/rack/shelf, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/turf/template_noop, +/area/template_noop) +"p" = ( +/obj/structure/rack/shelf, +/obj/item/pizzabox/mushroom, +/obj/item/pizzabox/meat, +/obj/item/pizzabox/margherita, +/obj/item/pizzabox/mushroom, +/obj/item/pizzabox/meat, +/obj/item/pizzabox/margherita, +/turf/template_noop, +/area/template_noop) +"q" = ( +/obj/item/stack/sheet/plasteel/fifty, +/obj/structure/rack/shelf, +/turf/template_noop, +/area/template_noop) +"r" = ( +/obj/structure/rack/shelf, +/obj/item/clothing/head/utility/hardhat/orange, +/turf/template_noop, +/area/template_noop) +"w" = ( +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/template_noop) +"x" = ( +/obj/structure/rack/shelf, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/black, +/turf/template_noop, +/area/template_noop) +"B" = ( +/obj/structure/rack/shelf, +/obj/item/construction/rcd/arcd/mattermanipulator, +/turf/template_noop, +/area/template_noop) +"D" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/iron/fifty, +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/template_noop) +"E" = ( +/turf/template_noop, +/area/template_noop) +"F" = ( +/obj/structure/rack/shelf, +/obj/item/clothing/suit/hazardvest, +/turf/template_noop, +/area/template_noop) +"J" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/turf/template_noop, +/area/template_noop) +"K" = ( +/obj/structure/rack/shelf, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/mechanical, +/turf/template_noop, +/area/template_noop) +"L" = ( +/obj/structure/rack/shelf, +/obj/item/storage/medkit/advanced, +/turf/template_noop, +/area/template_noop) +"N" = ( +/obj/structure/rack/shelf, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/electrical, +/turf/template_noop, +/area/template_noop) +"O" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/mineral/plasma/thirty, +/turf/template_noop, +/area/template_noop) +"P" = ( +/obj/structure/rack/shelf, +/obj/item/storage/medkit/fire, +/turf/template_noop, +/area/template_noop) +"Q" = ( +/obj/structure/rack/shelf, +/obj/item/storage/medkit/brute, +/turf/template_noop, +/area/template_noop) +"R" = ( +/obj/structure/rack/shelf, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/turf/template_noop, +/area/template_noop) +"S" = ( +/obj/structure/rack/shelf, +/obj/effect/spawner/random/decoration/carpet, +/turf/template_noop, +/area/template_noop) +"T" = ( +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/item/bedsheet/dorms_double, +/obj/structure/rack/shelf, +/turf/template_noop, +/area/template_noop) +"V" = ( +/obj/modular_map_connector, +/obj/structure/rack/shelf, +/turf/template_noop, +/area/template_noop) +"W" = ( +/obj/structure/rack/shelf, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular, +/turf/template_noop, +/area/template_noop) +"X" = ( +/obj/structure/rack/shelf, +/obj/item/holosign_creator/janibarrier, +/turf/template_noop, +/area/template_noop) +"Y" = ( +/obj/structure/rack/shelf, +/obj/item/stack/sheet/glass/fifty, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +q +D +X +V +Y +O +a +"} +(2,1,1) = {" +E +E +E +E +E +E +w +"} +(3,1,1) = {" +E +L +E +J +E +E +E +"} +(4,1,1) = {" +E +Q +E +W +E +E +E +"} +(5,1,1) = {" +E +m +w +S +E +E +E +"} +(6,1,1) = {" +E +l +E +r +E +E +E +"} +(7,1,1) = {" +E +x +E +K +E +E +E +"} +(8,1,1) = {" +w +S +E +N +E +E +E +"} +(9,1,1) = {" +E +p +E +P +E +E +E +"} +(10,1,1) = {" +E +B +E +R +E +w +E +"} +(11,1,1) = {" +E +E +E +E +w +i +E +"} +(12,1,1) = {" +T +g +O +F +S +n +b +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm deleted file mode 100644 index 808950d1caf..00000000000 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm +++ /dev/null @@ -1,14361 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"af" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ah" = ( -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ai" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"aj" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/mining) -"ak" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"al" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 4 - }, -/turf/open/space/basic, -/area/ruin/space/has_grav) -"am" = ( -/obj/structure/mop_bucket, -/obj/item/mop, -/obj/item/reagent_containers/cup/bucket, -/obj/item/soap/nanotrasen, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"an" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"aq" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"as" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"at" = ( -/obj/structure/chair/sofa/corp/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"au" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"av" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aA" = ( -/mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"aF" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"aM" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"aO" = ( -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"aP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/storage) -"aS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"aU" = ( -/obj/structure/table/reinforced, -/obj/item/card/id/away/tarkon{ - pixel_y = -6 - }, -/obj/item/card/id/away/tarkon, -/obj/item/card/id/away/tarkon{ - pixel_y = 6 - }, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"aV" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/power1) -"aX" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"aY" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/item/circuitboard/machine/module_duplicator, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"aZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"ba" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/anticorner, -/obj/effect/mob_spawn/corpse/human/doctor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bb" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"bc" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/margherita, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/margherita, -/obj/structure/closet/crate/freezer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"bg" = ( -/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/security/old, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"bi" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bj" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"bl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"bm" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"bn" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = -24; - req_one_access = list("tarkon") - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -8; - pixel_y = -36; - req_one_access = list("tarkon") - }, -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bo" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"br" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"bt" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"by" = ( -/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/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/solar_assembly, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"bz" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"bA" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"bD" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"bF" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bH" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"bJ" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"bL" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bO" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bS" = ( -/obj/machinery/door/airlock/titanium/glass, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"bX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"bY" = ( -/obj/structure/rack/gunrack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ca" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"cc" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/storage/box/stockparts/basic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"cd" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ci" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ck" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"cn" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"co" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"cp" = ( -/obj/structure/statue/bone/rib, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"cr" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/folder, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"ct" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"cu" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"cv" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"cA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"cE" = ( -/obj/machinery/door/poddoor/shutters/window{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"cK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"cN" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"cQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"cR" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"cT" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"cV" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/trauma) -"cX" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/cult/unruned/glass, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"cY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"db" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/developement) -"de" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"df" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptatmos"; - name = "shutter controls"; - pixel_x = -39; - pixel_y = -10 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"di" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dk" = ( -/obj/structure/closet/crate, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/holosign_creator/janibarrier, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"dl" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"do" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"dq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"dr" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 16; - name = "Port Tarkon"; - roundstart_template = /datum/map_template/shuttle/ruin/tarkon_driver/defcon2; - shuttle_id = "port_tarkon"; - width = 14 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"ds" = ( -/obj/structure/closet/crate/secure/gear, -/obj/item/microfusion_gun_attachment/rail, -/obj/item/flashlight/seclite, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"dt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/sofa/corp{ - dir = 8 - }, -/mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"dw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"dx" = ( -/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/blood/tracks, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"dy" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"dA" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/head/helmet, -/obj/item/bodypart/head, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"dC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dE" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/half, -/obj/structure/rack/shelf, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"dG" = ( -/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/tile/neutral/half, -/obj/effect/decal/cleanable/blood, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/cargo) -"dN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"dP" = ( -/mob/living/simple_animal/hostile/cult/spear{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"dR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"dT" = ( -/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/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dW" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"dX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dZ" = ( -/obj/machinery/autolathe, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ef" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"eg" = ( -/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/blood, -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"eo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"ev" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/garden) -"ew" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"ez" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"eA" = ( -/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/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/cargo) -"eB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"eD" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"eE" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"eG" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eI" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eL" = ( -/obj/machinery/door/airlock/public, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"eM" = ( -/obj/structure/closet, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"eQ" = ( -/obj/machinery/computer/atmos_control/tarkon/incinerator{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"eU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/mob/living/simple_animal/hostile/cult/spear{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"eW" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"eZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fa" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/computer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ff" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"fh" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"fi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"fl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"fm" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"fp" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/closet, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/chief_engineer, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ft" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"fv" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fw" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"fB" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"fG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"fI" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/medbeam/afad, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"fJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/loading_area, -/mob/living/simple_animal/hostile/cult/magic{ - health = 160; - maxHealth = 160 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"fP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"fR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/delivery/blue, -/mob/living/basic/construct/artificer/hostile{ - health = 150; - maxHealth = 150 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fV" = ( -/obj/structure/table/rolling, -/obj/item/scalpel, -/obj/item/hemostat, -/obj/item/cautery, -/obj/item/bonesetter, -/obj/item/stack/medical/suture/medicated, -/obj/item/retractor, -/obj/item/clothing/gloves/latex, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ga" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/simple_animal/hostile/cult/ghost, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"gb" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/garden) -"gd" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ge" = ( -/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/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"gk" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gn" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"go" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gp" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gs" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_interior, -/obj/machinery/airlock_controller/incinerator_tarkon{ - pixel_x = 40; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gt" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"gu" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/blood, -/obj/item/circuitboard/machine/component_printer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"gv" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/empty, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"gA" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/door/firedoor/heavy/closed, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/mining) -"gD" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/secoff) -"gE" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"gG" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"gJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/garden) -"gN" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"gP" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/folder, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"gW" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - name = "Broken Computer" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"he" = ( -/mob/living/basic/construct/artificer/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hf" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hi" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hj" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hk" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"hl" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"hm" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/cargo/tech/skyrat/utility, -/obj/item/clothing/under/rank/cargo/tech/skyrat/gorka, -/obj/item/storage/backpack/duffelbag/explorer, -/obj/item/storage/backpack/explorer, -/obj/item/storage/backpack/satchel/explorer, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage"; - state_open = 1 - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hu" = ( -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"hw" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"hz" = ( -/mob/living/simple_animal/hostile/cult/assassin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hA" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/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/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"hD" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hE" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"hH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptobservatory"; - name = "shutter controls"; - pixel_y = -32 - }, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"hL" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"hM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hP" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hQ" = ( -/obj/machinery/door/airlock/mining, -/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/blood/tracks{ - dir = 4 - }, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"hR" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hV" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hY" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"hZ" = ( -/obj/machinery/power/smes/engineering{ - charge = 0; - name = "backup power storage unit" - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"ia" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"id" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ii" = ( -/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/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"ik" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"il" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"in" = ( -/obj/item/circuitboard/machine/ore_silo, -/obj/structure/frame/machine, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ip" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ir" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"iu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iv" = ( -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iw" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 6 - }, -/obj/structure/closet/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/suit/utility/radiation, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"iA" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"iB" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iC" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"iG" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iJ" = ( -/obj/machinery/vending/hydroseeds, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"iM" = ( -/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/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"iT" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"iU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"iZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"jg" = ( -/obj/machinery/door/airlock/public, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jn" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission) -"jo" = ( -/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/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"jv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptafthall"; - name = "shutter controls"; - pixel_x = -26 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"jx" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"jy" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"jz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jA" = ( -/obj/machinery/atmospherics/components/binary/pump, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jD" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"jF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"jG" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jM" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"jN" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"jO" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"jP" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"jU" = ( -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"jV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/mob/living/basic/construct/juggernaut/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/cargo) -"jW" = ( -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"jY" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/observ) -"jZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ka" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east, -/mob/living/basic/construct/wraith/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"kd" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ke" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/vaulter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kf" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kh" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/dim/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"kk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ko" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kp" = ( -/obj/item/tape/ruins/tarkon/celebration, -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"kq" = ( -/obj/machinery/vending/cigarette, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"kr" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ku" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"kv" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"kA" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kD" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"kF" = ( -/obj/structure/fence/corner, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kH" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"kI" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"kJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"kO" = ( -/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/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"kS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"kT" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kU" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kW" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/megaphone, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kX" = ( -/obj/structure/bed/maint, -/obj/structure/safe/floor, -/obj/item/mod/module/armor_booster/retractplates{ - desc = "A complex set of actuators, micro-seals and a simple guide on how to install it, This... \"Modification\" allows the plating around the joints to retract, giving minor protection and a bit better mobility. There also seems to be a small, wireless microphone... how odd." - }, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"la" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ld" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"le" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"li" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/developement) -"lj" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/juggernaut/hostile{ - health = 275; - maxHealth = 275; - name = "Left hand of the veil" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"lp" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"ls" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lt" = ( -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lw" = ( -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/structure/table/rolling, -/obj/item/clothing/gloves/latex, -/obj/item/circular_saw, -/obj/item/scalpel, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lx" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ly" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon) -"lA" = ( -/obj/structure/closet/crate/radiation, -/obj/structure/cable, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lD" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm4"; - name = "Couples Suite" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"lF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"lH" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lI" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lK" = ( -/obj/structure/closet/firecloset/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lO" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"lQ" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lR" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"lS" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/storage/backpack/medic, -/obj/item/storage/backpack/satchel/med, -/obj/item/storage/backpack/satchel/chem, -/obj/item/storage/backpack/satchel/vir, -/obj/item/storage/backpack/virology, -/obj/item/storage/backpack/duffelbag/virology, -/obj/item/storage/backpack/duffelbag/chemistry, -/obj/item/storage/backpack/chemistry, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lT" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lU" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lV" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/brown/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lZ" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ma" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mc" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/machinery/computer/atmos_control/tarkon/nitrogen_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"md" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"mi" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"mj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/stack/sheet/iron/twenty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ml" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"mo" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"mq" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"mr" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"mt" = ( -/obj/structure/closet/crate, -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mu" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"my" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"mC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"mG" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/structure/rack/shelf, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/utility/hardhat/orange, -/obj/item/clothing/gloves/color/black, -/obj/item/storage/belt/utility, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"mK" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"mL" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/paper/fluff/ruins/tarkon/defcon2, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"mM" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"mO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"mT" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"mV" = ( -/obj/machinery/door/window/right/directional/east, -/obj/machinery/door/window/right/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"mW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"mY" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"na" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"nb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"nc" = ( -/obj/structure/sink/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ne" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"ng" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"nk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nm" = ( -/obj/machinery/atmospherics/miner/nitrogen, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"nn" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"no" = ( -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"nu" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"nx" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"nB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/simple_animal/hostile/cult/magic{ - health = 160; - maxHealth = 160 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"nF" = ( -/obj/structure/closet/crate/engineering, -/obj/item/stack/sheet/plasteel/fifty, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/mineral/plasma/thirty, -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"nH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"nL" = ( -/obj/item/stack/tile/carpet/neon/simple/purple/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"nP" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"nQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"nT" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nW" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nZ" = ( -/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/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/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ob" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"oc" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/frame/computer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"oe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"of" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptafthall" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"og" = ( -/obj/structure/table/reinforced, -/obj/item/pipe_dispenser, -/obj/item/storage/belt/utility/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oh" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oi" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"om" = ( -/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/carbon_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oq" = ( -/obj/machinery/processor, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"os" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ot" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ov" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"oy" = ( -/obj/structure/safe/floor, -/obj/structure/table, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"oC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oE" = ( -/obj/machinery/button/door{ - id = "tarkonouter"; - name = "Exterior Shutter Control"; - pixel_x = -6 - }, -/obj/machinery/button/door{ - id = "tarkoninner"; - name = "Inner Shutter Control"; - pixel_x = 6 - }, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"oF" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oH" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oL" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"oN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oQ" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/carbon_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oS" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"pa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"pb" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pc" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pd" = ( -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"pf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ph" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pj" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"pl" = ( -/obj/structure/table, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"po" = ( -/obj/structure/sink/kitchen/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ps" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"pt" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pv" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pw" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"py" = ( -/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/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"pz" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/garden) -"pA" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pB" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"pC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"pE" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pG" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"pH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"pJ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pM" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"pT" = ( -/obj/structure/chair/office, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pW" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pX" = ( -/obj/machinery/vending/clothing, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"pY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/developement) -"qa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"qb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"qf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"qh" = ( -/obj/machinery/door/poddoor/shutters{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qi" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"qk" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/oxygen_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qo" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qr" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qy" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"qB" = ( -/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/blood/tracks{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"qD" = ( -/obj/structure/lattice, -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"qF" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/cult/ghost, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"qH" = ( -/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/blood/tracks, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"qK" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"qL" = ( -/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/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qO" = ( -/obj/effect/heretic_rune/big, -/mob/living/simple_animal/hostile/cult/warrior{ - health = 175; - maxHealth = 175 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"qQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"qS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"ra" = ( -/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/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"rg" = ( -/obj/effect/turf_decal/stripes/asteroid/corner, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"rh" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ri" = ( -/obj/effect/heretic_rune/big, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"rk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ro" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ru" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"rv" = ( -/obj/structure/table, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/surgery, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"rw" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ry" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"rz" = ( -/obj/structure/rack, -/obj/item/assembly/igniter, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"rD" = ( -/obj/structure/closet, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/mask/gas/explorer, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"rF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"rG" = ( -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rH" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"rK" = ( -/obj/machinery/door/poddoor/shutters/window{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"rL" = ( -/obj/effect/turf_decal/vg_decals/atmos/oxygen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/oxygen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"rV" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"rY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/porthall) -"rZ" = ( -/obj/item/stack/tile/carpet/neon/simple/teal/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"sa" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/air_sensor/tarkon/incinerator_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"se" = ( -/obj/machinery/door/airlock/research/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"sm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"sn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"sq" = ( -/obj/structure/closet, -/obj/item/pickaxe/silver, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/glasses/meson, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"sr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sv" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav) -"sw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sA" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"sD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"sI" = ( -/obj/effect/turf_decal/delivery/red, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sK" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"sL" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sM" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sN" = ( -/obj/structure/frame/computer{ - dir = 8 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sP" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sS" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"sX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"tc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/north, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"td" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"te" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"th" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"tj" = ( -/mob/living/simple_animal/hostile/cult/magic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"tk" = ( -/obj/structure/table/reinforced, -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"to" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ts" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/purple/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"tt" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"tv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"ty" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"tz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"tA" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/item/mod/construction/broken_core, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"tC" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"tE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"tJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"tL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"tM" = ( -/obj/machinery/door/airlock/cult/unruned/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"tP" = ( -/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/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tT" = ( -/obj/structure/closet, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"tV" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"tY" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "ptdorm1"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human/cook, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"tZ" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"ub" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ud" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ug" = ( -/obj/structure/closet/firecloset, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"uh" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human/doctor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ui" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"ul" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"un" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"uo" = ( -/mob/living/basic/carp/mega, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"ut" = ( -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon) -"ux" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"uB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"uC" = ( -/obj/structure/closet/crate/bin{ - pixel_y = 8 - }, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/item/reagent_containers/cup/rag, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"uD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"uF" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"uH" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"uI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"uK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"uM" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"uN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/mob/living/simple_animal/hostile/cult/magic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"uR" = ( -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"uS" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/secoff) -"uU" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"uW" = ( -/obj/effect/decal/cleanable/blood/tracks, -/mob/living/simple_animal/hostile/cult, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"vc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"vd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ve" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm3"; - name = "Private Dorm 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"vj" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"vl" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/structure/closet/crate/freezer/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vm" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/cargo) -"vo" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/cell_charger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vp" = ( -/obj/machinery/atmospherics/miner/n2o, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vs" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"vy" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vz" = ( -/obj/machinery/door/airlock/cult/unruned/glass, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"vA" = ( -/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/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"vB" = ( -/obj/structure/curtain, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/secoff) -"vE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/structure/closet/crate/secure/engineering, -/obj/effect/decal/cleanable/dirt, -/obj/item/construction/rcd/arcd/mattermanipulator, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"vF" = ( -/obj/item/gps/computer/space{ - gpstag = "Port Tarkon - Defcon 2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vN" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vO" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/artificer/hostile{ - health = 200; - maxHealth = 200; - name = "Third eye of the veil" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"vR" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vU" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"vZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"wa" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"wc" = ( -/obj/structure/table, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"we" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"wh" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptporthall"; - name = "shutter controls"; - pixel_x = -31 - }, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"wp" = ( -/obj/effect/mob_spawn/corpse/human/cargo_tech, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"wt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ww" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"wx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"wC" = ( -/obj/effect/turf_decal/tile/yellow/full, -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"wQ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wR" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"wV" = ( -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"wW" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_tarkon{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wY" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"wZ" = ( -/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/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"xc" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"xj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xo" = ( -/mob/living/basic/construct/artificer/hostile{ - health = 150; - maxHealth = 150 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"xp" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/green/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"xr" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/item/clothing/head/helmet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xt" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xu" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xz" = ( -/obj/machinery/door/firedoor/solid/closed, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/mining) -"xB" = ( -/obj/machinery/igniter/incinerator_tarkon, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 5 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xE" = ( -/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/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xF" = ( -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"xH" = ( -/obj/machinery/ammo_workbench/unlocked, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"xI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"xL" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"xN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"xO" = ( -/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/tile/brown/half, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"xP" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"xR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"xS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"xT" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xU" = ( -/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/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xZ" = ( -/obj/machinery/firealarm/directional/north, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/porthall) -"yd" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ye" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"yf" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/sci{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"yj" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"ym" = ( -/obj/machinery/door/poddoor/shutters/window{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"yo" = ( -/obj/item/pen/edagger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"yq" = ( -/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/tile/neutral, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ys" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/engi, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"yt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"yv" = ( -/obj/machinery/vending/coffee, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"yx" = ( -/obj/item/storage/toolbox/mechanical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"yy" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"yz" = ( -/obj/machinery/firealarm/directional/west, -/obj/item/mod/construction/broken_core, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"yA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"yC" = ( -/obj/machinery/air_sensor/tarkon/mix_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"yD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"yF" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"yG" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"yJ" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"yL" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"yN" = ( -/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/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"yO" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/item/circuitboard/machine/mechfab, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"yS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"yT" = ( -/mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"yU" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/mining) -"yY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"zb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/fence/door/opened{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"zc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zd" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zf" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"zh" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"zi" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/secoff) -"zj" = ( -/mob/living/simple_animal/hostile/cult/magic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"zm" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zo" = ( -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"zp" = ( -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"zy" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zz" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"zC" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"zE" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zL" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"zM" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zT" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/holosign_creator/atmos, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zU" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"zW" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zZ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ae" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks, -/mob/living/simple_animal/hostile/cult/ghost, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ak" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Al" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Am" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/item/circuitboard/machine/circuit_imprinter/offstation, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"An" = ( -/obj/structure/fireaxecabinet/directional/north, -/obj/machinery/pipedispenser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ap" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Aq" = ( -/turf/closed/wall/mineral/titanium, -/area/ruin/space/has_grav) -"At" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Au" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"AA" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AF" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"AI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/construct/artificer/hostile{ - health = 150; - maxHealth = 150 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"AK" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/sec{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"AM" = ( -/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/delivery/white, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"AN" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/porthall) -"AO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"AP" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"AT" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ba" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bc" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Bh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Bi" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bj" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bk" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Bn" = ( -/obj/machinery/door/airlock/public{ - name = "Kitchen Freezer" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Bo" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/order_console/mining{ - forced_express = 1; - express_cost_multiplier = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bp" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/circuitboard/machine/sleeper, -/obj/structure/closet/secure_closet/medical1, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Bq" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Bt" = ( -/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/delivery/blue, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Bw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BB" = ( -/obj/structure/closet/crate/secure/weapon, -/obj/item/gun/microfusion/mcr01, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"BD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mob_spawn/corpse/human/miner/mod, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"BI" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BJ" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"BS" = ( -/obj/effect/turf_decal/delivery/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"BV" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"BW" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BX" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ce" = ( -/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/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Cf" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/juggernaut/hostile{ - health = 275; - maxHealth = 275; - name = "Right hand of the veil" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ci" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ck" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Cm" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cp" = ( -/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/solid, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cq" = ( -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cr" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Cs" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Cw" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/gold{ - amount = 25 - }, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Cx" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"Cy" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm1"; - name = "Private Dorm 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CB" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"CE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/red/anticorner, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"CG" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CL" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"CP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"CS" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/coin, -/obj/item/coin, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"CX" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/rack, -/obj/item/screwdriver, -/obj/item/wrench, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"CY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Da" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Dj" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/biogenerator, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/garden) -"Dk" = ( -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = -8 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/stack/spacecash/c20{ - pixel_y = 10 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = 5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -4; - pixel_y = -5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -6; - pixel_y = 12 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/mod/module/visor/rave, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"DA" = ( -/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/neutral/anticorner, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DD" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"DE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/construct/juggernaut/hostile{ - health = 200; - maxHealth = 200 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"DK" = ( -/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/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DN" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"DO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"DP" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/red/half, -/obj/item/paper/fluff/ruins/tarkon/detain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"DS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"DZ" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Eb" = ( -/mob/living/basic/carp, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"Ed" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/item/mod/construction/broken_core, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Eg" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Eh" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"El" = ( -/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/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Eq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Er" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Es" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Et" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/obj/machinery/door/airlock/cult/unruned/glass, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Eu" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ev" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Ex" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ez" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"EA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"EB" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ED" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"EE" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "ptcomms"; - name = "shutter controls" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"EN" = ( -/obj/structure/sign/warning/deathsposal, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"EQ" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptobservatory" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/observ) -"EU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"EV" = ( -/obj/structure/curtain, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EW" = ( -/mob/living/basic/carp/mega, -/turf/open/space/basic, -/area/template_noop) -"EY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"EZ" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Fa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Fb" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Fd" = ( -/mob/living/simple_animal/hostile/cult/ghost, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Fe" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Fh" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fk" = ( -/obj/structure/table/reinforced, -/obj/item/storage/pouch/ammo, -/obj/item/storage/pouch/ammo, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Fl" = ( -/obj/item/electronics/apc, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airalarm, -/obj/item/electronics/airalarm, -/obj/structure/closet/crate/engineering/electrical{ - name = "electronics crate" - }, -/obj/item/electronics/tracker, -/obj/item/stack/cable_coil, -/obj/item/clothing/gloves/color/yellow, -/obj/item/circuitboard/computer/atmos_control/tarkon/carbon_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/mix_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/nitrogen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/incinerator, -/obj/item/circuitboard/computer/atmos_control/tarkon/oxygen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/plasma_tank, -/obj/item/circuitboard/computer/tarkon_driver, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Fm" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Fq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Fr" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fs" = ( -/obj/machinery/airlock_sensor/incinerator_tarkon{ - pixel_x = 6; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ft" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Fv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"FB" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/item/radio, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"FC" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"FE" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/template_noop) -"FG" = ( -/obj/item/shovel, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"FH" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"FN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"FS" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/enzyme, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"FT" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"FU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FV" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"FW" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"FX" = ( -/obj/structure/table, -/obj/item/multitool, -/obj/item/storage/belt/utility/full, -/obj/item/paper/fluff/ruins/tarkon/designdoc, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"FY" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptporthall" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"FZ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gd" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Ge" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Gf" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gh" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gk" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Gl" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gm" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gp" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Gs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gt" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gv" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/reagentgrinder, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Gx" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Gy" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"GB" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/nitrous_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GE" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GF" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"GJ" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/comms) -"GL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"GM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GR" = ( -/obj/machinery/door/airlock/engineering{ - name = "Backup Generator Room" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"GS" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/small/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"GU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"GV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GW" = ( -/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/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GX" = ( -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"GY" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ha" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/greenglow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Hb" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Hi" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/item/clothing/neck/mantle, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Hj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Hk" = ( -/obj/structure/cable, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hm" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Hn" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ho" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hq" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav) -"Hr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ht" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Hy" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"HB" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"HF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"HG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"HH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"HO" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/item/circuitboard/machine/destructive_analyzer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"HQ" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/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/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"HS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"HU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"HW" = ( -/obj/machinery/door/airlock/public, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"HX" = ( -/obj/structure/cable, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ic" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Id" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ie" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"If" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Ig" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ih" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid, -/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/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ij" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Ik" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Im" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "ptdorm2"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/mob_spawn/corpse/human, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Io" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ir" = ( -/mob/living/simple_animal/hostile/cult/ghost, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Iw" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"Ix" = ( -/obj/machinery/door/poddoor/shutters{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ID" = ( -/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/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IE" = ( -/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/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/simple_animal/hostile/cult/mannequin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"IG" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/item/circuitboard/machine/rtg, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"IH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/curtain, -/mob/living/simple_animal/hostile/cult/horror{ - health = 150; - maxHealth = 150 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IJ" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IK" = ( -/obj/structure/closet, -/obj/item/pickaxe/mini, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/mask/gas/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/item/storage/belt/mining, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"IL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"IO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"IQ" = ( -/obj/structure/statue/bone/rib, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IU" = ( -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"IW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IX" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Jb" = ( -/mob/living/simple_animal/hostile/cult/spear{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ji" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jj" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Jk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Jl" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/security/skyrat/utility/redsec, -/obj/item/clothing/under/rank/security/skyrat/utility, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/storage/backpack/duffelbag/sec, -/obj/item/storage/backpack/duffelbag/sec/redsec, -/obj/item/storage/backpack/satchel/sec/redsec, -/obj/item/storage/backpack/security/redsec, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"Jm" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Jn" = ( -/obj/structure/cable, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Jp" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/item/radio, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jq" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ju" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Jv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jw" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Jx" = ( -/obj/machinery/vending/cola, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Jz" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"JB" = ( -/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/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"JE" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"JF" = ( -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"JI" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"JL" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/west, -/obj/item/paper_bin, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JM" = ( -/obj/effect/mob_spawn/corpse/human, -/obj/structure/kitchenspike, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"JN" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"JO" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/random, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "ptdorm3"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"JQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/mob/living/simple_animal/hostile/cult, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"JR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/clothing/suit/armor/vest, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"JV" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"JW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/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/solid/closed, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"JX" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"JY" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/closet/secure_closet/medical2{ - req_access = list("medical") - }, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Kb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Kc" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/driverpitch, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ke" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Kf" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ki" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kj" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/glass, -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Kk" = ( -/obj/machinery/door/airlock/wood/glass, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Kl" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Km" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/storage) -"Kn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Kp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/mob/living/simple_animal/hostile/cult/magic{ - health = 160; - maxHealth = 160 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ks" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Kt" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Kv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KA" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KB" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/mining/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"KC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/heretic_rune/big, -/obj/effect/decal/cleanable/blood, -/obj/structure/statue/bone/skull, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"KE" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"KG" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"KI" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"KJ" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/defibrillator, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"KK" = ( -/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/neutral{ - dir = 4 - }, -/obj/item/clothing/suit/armor/vest, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"KM" = ( -/obj/machinery/button/ignition/incinerator/tarkon, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"KO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"KP" = ( -/obj/item/mod/construction/broken_core, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"KQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KS" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"KT" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"KV" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/east{ - opacity = 1 - }, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KZ" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"La" = ( -/obj/structure/chair/sofa/corp{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ld" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_exterior, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Le" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Lf" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Lh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Li" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Lj" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Lk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Lo" = ( -/obj/machinery/door/poddoor/shutters{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Lp" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Lr" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ls" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Lu" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"LA" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/rnd/scientist/skyrat/utility, -/obj/item/clothing/under/rank/rnd/roboticist/skyrat/sleek, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/storage/backpack/duffelbag/science, -/obj/item/storage/backpack/duffelbag/science/robo, -/obj/item/storage/backpack/satchel/science, -/obj/item/storage/backpack/satchel/science/robo, -/obj/item/storage/backpack/science, -/obj/item/storage/backpack/science/robo, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"LD" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"LG" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"LH" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"LJ" = ( -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"LL" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/item/spear/bonespear, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"LN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"LQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"LS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"LU" = ( -/obj/item/stack/sheet/iron/fifty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"LW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"LY" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/pen/fountain, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"LZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Mb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Me" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/smes, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Mg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Mi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ml" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Mp" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Mr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"Mt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Mv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Mz" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MB" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MC" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MD" = ( -/obj/machinery/atmospherics/miner/plasma, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ME" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"MF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"MG" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"MJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"MO" = ( -/obj/structure/safe/floor, -/obj/item/areaeditor/blueprints/tarkon, -/obj/item/tape/ruins/tarkon/safe, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"MQ" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/garden) -"MS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"MU" = ( -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"MV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"MW" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"MY" = ( -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Nc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ng" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ni" = ( -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Nj" = ( -/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/solid, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"No" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Nr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nt" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Nv" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Nw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nx" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/flash, -/obj/item/assembly/flash, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nz" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ND" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"NE" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NH" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"NK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/dark/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"NM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"NN" = ( -/obj/structure/bed/maint, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"NT" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/observ) -"NU" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"NV" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"NX" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"NZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Oa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Ob" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Od" = ( -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Oi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Oj" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp, -/obj/effect/spawner/random/clothing/beret_or_rabbitears, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"On" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Os" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ox" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/dice, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"OB" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"OC" = ( -/obj/effect/heretic_rune/big, -/mob/living/simple_animal/hostile/cult/spear, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"OD" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"OF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/porthall) -"OG" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"OI" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"OK" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"OM" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/comms) -"OP" = ( -/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/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"OR" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"OS" = ( -/obj/structure/cable, -/obj/item/solar_assembly, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"OT" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"OZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pa" = ( -/obj/structure/bed/double/pod, -/obj/item/bedsheet/random/double, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/fancy_pillow, -/obj/item/fancy_pillow, -/obj/machinery/button/door/directional/north{ - id = "ptdorm4"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/mob_spawn/corpse/human, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Pc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Pf" = ( -/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/tile/purple/half, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Pp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Pq" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ps" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Px" = ( -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Pz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"PA" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"PB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PE" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"PF" = ( -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"PK" = ( -/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/solid, -/obj/machinery/door/airlock/atmos/glass, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PM" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"PO" = ( -/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/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"PR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"PS" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Financing Console" - }, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"PT" = ( -/obj/structure/rack, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"PW" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PZ" = ( -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qg" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/pink/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qh" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Qk" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qn" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Qo" = ( -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qp" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qs" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Qu" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/machinery/computer/atmos_control/tarkon/plasma_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Qx" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Qy" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/suit_storage_unit/industrial/hauler, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QA" = ( -/obj/machinery/door/window/left/directional/north, -/obj/machinery/door/window/left/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QB" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QF" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/med{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"QH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QL" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"QO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"QP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/machinery/meter, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"QW" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QX" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/closet/crate/secure/science, -/obj/item/raw_anomaly_core/random, -/obj/item/raw_anomaly_core/random, -/obj/item/raw_anomaly_core/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"QY" = ( -/obj/item/circuitboard/machine/protolathe/offstation, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Rc" = ( -/obj/machinery/firealarm/directional/north, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/servo, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon) -"Rf" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rg" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rh" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Rm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Turbine Maintenance Door" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rp" = ( -/obj/machinery/vending/dorms, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Rq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rr" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Rx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"RB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"RC" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"RE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"RH" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RI" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"RK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"RL" = ( -/obj/structure/fluff/empty_sleeper, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"RM" = ( -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"RN" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"RO" = ( -/obj/item/areaeditor/blueprints/slime, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/structure/closet/crate/secure/science, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"RS" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"RT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RU" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"RW" = ( -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"RX" = ( -/obj/structure/table, -/obj/item/clothing/head/utility/welding, -/obj/item/clothing/gloves/color/yellow, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"RY" = ( -/obj/effect/turf_decal/vg_decals/atmos/plasma, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/plasma_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"RZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sa" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/ore_redemption, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sb" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Se" = ( -/obj/structure/trash_pile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Sg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Si" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/turf/open/floor/plating, -/area/ruin/space/has_grav) -"Sj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sn" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/titanium{ - amount = 30 - }, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sp" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sq" = ( -/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/solid, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Su" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sv" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Sw" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Sz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"SD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/machinery/door/window/brigdoor/left/directional/north, -/obj/item/paper_bin{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"SI" = ( -/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/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SL" = ( -/obj/machinery/shower/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/door/window/right/directional/north{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SM" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SO" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"SQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"ST" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/observ) -"SV" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/item/folder/red, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"SW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SX" = ( -/obj/effect/decal/cleanable/ash, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SZ" = ( -/obj/structure/table/reinforced, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Tb" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Tc" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Te" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ti" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Tk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Tl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"To" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/storage/backpack/industrial, -/obj/item/storage/backpack/duffelbag/engineering, -/obj/item/storage/backpack/satchel/eng, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Ts" = ( -/obj/structure/closet/crate, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Tx" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Tz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"TF" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"TH" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/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/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TK" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/dorms) -"TL" = ( -/obj/machinery/power/solar_control{ - dir = 1; - id = "aftport"; - name = "Station Solar Control" - }, -/obj/structure/cable, -/obj/item/paper/guides/jobs/engi/solars, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"TP" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TQ" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"TS" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/mob_spawn/corpse/human/bartender, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"TT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/storage/box/stockparts/basic, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"TV" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"TW" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"TX" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/obj/item/folder/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ua" = ( -/obj/structure/safe/floor, -/obj/item/stack/sheet/bluespace_crystal{ - amount = 5 - }, -/obj/item/stack/sheet/mineral/diamond{ - amount = 10 - }, -/obj/item/weldingtool/abductor, -/obj/item/circuitboard/machine/bluespace_miner, -/obj/item/paper/fluff/ruins/tarkon/coupplans, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ub" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Ud" = ( -/obj/structure/closet/crate/bin, -/obj/item/mod/module/springlock, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Ue" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Uf" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/anomaly_refinery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Uh" = ( -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Un" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ur" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ut" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Uu" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Uv" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon) -"Uw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ux" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Uy" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"Uz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/cult/magic/elite{ - health = 400; - maxHealth = 400; - name = "The Veilbreaker" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"UI" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"UJ" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"UK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"UM" = ( -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"US" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"UU" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"UV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"UX" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"UZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Va" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Vc" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vd" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ve" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Vg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Vi" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"Vj" = ( -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/storage/backpack/duffelbag/blueshield, -/obj/item/storage/backpack/blueshield, -/obj/item/storage/backpack/satchel/blueshield, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Vn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vt" = ( -/obj/machinery/light/dim/directional/east, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Vu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Vw" = ( -/obj/structure/sign/warning/no_smoking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Vx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Vy" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VE" = ( -/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/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"VH" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VK" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"VO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VS" = ( -/obj/machinery/atmospherics/miner/oxygen, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"VT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"VU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"VV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Wa" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav) -"Wc" = ( -/obj/effect/turf_decal/sand, -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Wd" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrogen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/nitrogen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"We" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 4; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/goals, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Wh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Wi" = ( -/mob/living/basic/construct/wraith/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Wn" = ( -/obj/machinery/computer/cryopod/tarkon/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Wp" = ( -/obj/machinery/vending/snack/teal, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Wq" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/mob/living/basic/construct/artificer/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Wt" = ( -/turf/closed/mineral/random, -/area/awaymission) -"Wu" = ( -/obj/machinery/light_switch/directional/north, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Wv" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"WB" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"WC" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/mix_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"WE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"WK" = ( -/mob/living/basic/construct/proteon/hostile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/afthall) -"WL" = ( -/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/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"WM" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/oven/range, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"WO" = ( -/obj/structure/table/reinforced, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"WP" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/shutters{ - id = "ptatmos" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"WU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/porthall) -"WW" = ( -/obj/effect/decal/cleanable/glass, -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/developement) -"WY" = ( -/turf/open/space/basic, -/area/template_noop) -"Xb" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Xh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Xj" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Xn" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Xq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Xr" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Xu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/mob/living/basic/construct/artificer/hostile{ - health = 150; - maxHealth = 150 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Xw" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Xy" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Xz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"XD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"XE" = ( -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/obj/structure/statue/bone/rib, -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"XH" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"XI" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XJ" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"XT" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"XY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"XZ" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav) -"Yb" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Yc" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Yh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Yk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/garden) -"Yp" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Yr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Yt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"Yu" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/item/storage/toolbox/maint_kit, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Yv" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Yy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/comms) -"YB" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"YC" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"YD" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"YF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YH" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"YI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptcomms" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/comms) -"YP" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"YR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YT" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"YW" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"YZ" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Zc" = ( -/turf/closed/mineral/random/high_chance, -/area/solars/tarkon) -"Zf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Zg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Zi" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zl" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/mining) -"Zm" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zp" = ( -/obj/structure/table/reinforced, -/obj/item/storage/belt/utility, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Zq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zr" = ( -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Zt" = ( -/obj/machinery/light/dim/directional/north, -/mob/living/basic/construct/wraith/hostile{ - health = 125; - maxHealth = 125 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Zu" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zv" = ( -/obj/machinery/door/window/left/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zw" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/nitrous_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zz" = ( -/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/blood, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ZC" = ( -/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/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ZG" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZH" = ( -/obj/structure/cable, -/obj/structure/rack, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ZJ" = ( -/turf/open/misc/asteroid/airless, -/area/awaymission) -"ZK" = ( -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZM" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZN" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZU" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ZV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/cult, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/obj/modular_map_connector, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ZY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"ZZ" = ( -/turf/closed/wall/mineral/cult/artificer, -/area/ruin/space/has_grav/port_tarkon/centerhall) - -(1,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(2,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(3,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -RM -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -RM -WY -WY -"} -(4,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(5,1,1) = {" -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(6,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -Eb -zo -zo -zo -Wa -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -"} -(7,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -iv -zo -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -sv -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(8,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -iI -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -"} -(9,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -EQ -EQ -EQ -WU -WU -WU -WU -WU -WU -WU -WU -WU -AN -AN -AN -FY -FY -FY -FY -WU -WU -WU -xt -xt -WP -Vw -xt -xt -xt -xt -xt -xt -xt -hD -hD -xt -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(10,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -EQ -EQ -EQ -Uw -qe -jg -Xu -bK -bK -OF -bK -bK -IY -oe -RB -rY -wi -Mg -XY -Ap -RB -Kf -XY -RB -gp -df -jB -og -lH -pA -yC -lH -Wd -nm -lH -rL -VS -lH -sv -sv -sv -zo -zo -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(11,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -EQ -EQ -Gh -jF -jF -qe -AN -rW -Sz -AN -wt -xo -AN -hN -aO -UZ -AN -aM -Eg -UZ -Mv -UZ -Od -xI -Zf -PK -dC -JJ -lp -lH -te -QH -lH -sj -jj -lH -oI -AF -lH -sv -jO -iB -zo -zo -zo -sv -sv -sv -sv -sv -sv -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(12,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -KS -sK -jF -NT -xN -tL -vz -do -pj -yT -UZ -UZ -FC -AN -UZ -yT -UZ -aM -he -UZ -Vt -Lu -Eg -zU -Bh -gp -SM -CP -mo -lH -ts -NK -lH -xp -NK -lH -Bj -NK -lH -xt -GE -xt -zo -WY -zo -xt -sv -Wa -sv -sv -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(13,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -KS -yl -La -jF -Gh -aA -hH -nP -nP -nP -nP -Vc -li -db -nP -nP -db -db -db -db -nP -db -db -cX -AN -Et -hD -hi -mW -SM -WC -Bi -HU -mc -iG -ad -qk -kr -hM -iw -Fr -Gp -hD -xt -kS -cd -xt -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -RM -WY -WY -WY -WY -"} -(14,1,1) = {" -WY -WY -RM -WY -WY -WY -WY -zo -zo -EQ -EQ -NH -dt -at -Uw -jF -Uw -as -nP -Ik -sP -kT -On -vs -On -xu -db -Ik -gu -yz -wQ -fV -mM -nP -UZ -UZ -uI -xt -dl -mW -ez -SM -SM -ez -zE -ez -ez -SM -SM -SM -AA -gs -wW -Ld -sc -Ex -xB -xt -Wa -Wa -sv -Wa -sv -Wa -Wa -zo -WY -WY -WY -WY -WY -"} -(15,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -kp -Uw -LW -Uw -wR -Uw -Uw -qe -nP -Uf -zj -lF -On -BX -eo -On -db -PM -fG -OK -yO -On -Ed -nP -ob -qf -we -xt -An -jJ -zc -Tx -il -ez -ez -Tx -SM -zE -Va -ez -bn -xt -Fs -xt -Ak -MU -eZ -xt -zo -sv -Wa -sv -sv -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(16,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -jF -bX -nB -NZ -Oi -Oi -NZ -qe -nP -ef -YI -UV -On -On -ew -RH -db -PM -Ic -yx -Zu -xY -vB -nP -mY -id -uI -xt -pW -PW -ez -il -pb -hz -ez -ez -il -SM -ez -kd -lI -KM -UI -xt -xt -sa -xt -xt -zo -zo -Wa -sv -Wa -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(17,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -Ez -jF -lr -Uw -Uw -Uw -Uw -MJ -qe -db -fa -YI -AI -YI -de -Id -RH -db -PM -Xh -YI -KP -hB -vy -SO -Tc -Tc -kH -xt -IG -Jn -bJ -bJ -NE -ri -ez -ez -il -tj -ez -SM -Fh -Zq -hP -QW -Rm -FT -sL -zo -Wa -Vi -sv -sv -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(18,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -EQ -Cx -Gl -jF -Gf -gE -QL -RJ -ml -qe -db -QX -oH -Er -DE -Er -Er -sr -db -PM -eU -YI -YI -Am -RH -nP -UZ -UZ -bK -hD -fv -KI -il -il -ez -il -ez -il -ez -zE -SM -SM -Fh -DD -wh -Ob -xt -zC -xt -zo -Vi -zo -nx -Wa -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(19,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -SU -SU -SU -jY -jY -jY -SU -eL -SU -HW -nP -pE -YI -YI -YR -la -RT -Sg -pY -ko -un -nH -AO -DK -tA -db -xZ -AN -OF -hD -ez -KI -ez -oh -Jb -ez -oF -oh -ez -SM -SM -SM -Fh -zT -Ti -eQ -xt -Ke -cd -zo -Vi -zo -zo -zo -tt -zo -zo -zo -WY -WY -WY -WY -WY -"} -(20,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -Wa -sv -sv -Wa -Wa -Wa -kf -WE -WE -VV -nP -CB -VU -VU -se -VU -VU -YF -db -PM -Id -HO -On -DK -bm -db -aM -Uu -Bs -hD -OD -KI -KI -KI -Un -Un -Un -cR -KI -KI -SM -SM -jG -lQ -yJ -Ml -xt -WY -zo -zo -sv -FG -nx -nx -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(21,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -Wa -sv -Wa -sv -kf -WE -WE -VV -nP -Gv -gt -YI -vc -ZK -On -Su -db -PM -fJ -Ig -ca -dx -Pf -HQ -Zz -Eg -Fa -hD -SM -zE -ez -Zw -Zm -Rg -oQ -PB -cv -Qu -uK -XH -Me -hf -hf -xt -xt -zo -zo -sv -Wa -Wa -zb -kA -kF -zo -zo -zo -WY -WY -WY -WY -WY -"} -(22,1,1) = {" -WY -WY -WY -RM -WY -zo -zo -Wa -Wa -Wa -Wa -Wa -sv -Wa -kf -VO -WE -Nc -nP -xT -YI -On -Hr -ZK -OK -On -db -PM -TT -de -qy -rF -Ni -db -ra -aM -OI -xt -ST -Zv -ST -lH -NK -ub -lH -NK -lV -lH -NK -Qg -lH -xt -xt -xt -sv -sv -sv -sv -Wa -LJ -UJ -UJ -rg -av -MG -LJ -WY -WY -WY -WY -WY -"} -(23,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -sv -sv -sv -sv -sv -kf -sI -Kb -VV -nP -oc -yG -OZ -vc -rG -On -no -db -PM -cc -KP -On -QY -Sn -nP -ra -yT -RZ -xt -vO -pc -vO -lH -Rf -ld -lH -pU -xj -lH -Qk -fR -lH -sv -sv -sv -sv -Wa -Zc -LJ -rg -av -MG -UJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(24,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -jN -WE -VV -nP -RO -Zi -pa -qK -ZK -Sp -lw -db -RI -Jz -sN -rH -Cw -aY -nP -ra -Mi -bK -xt -vO -vO -vO -lH -GB -vp -lH -om -hR -lH -RY -MD -lH -sv -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -Xb -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(25,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -yd -ma -oi -VV -db -ME -Zi -pa -FW -WW -Xy -mi -rh -rh -rh -Xy -Xy -rh -rh -WU -tE -tQ -bK -hD -xt -xt -xt -xt -xt -hD -hD -xt -xt -bO -xt -xt -xt -GY -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -IL -LJ -Ft -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(26,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -yd -kv -ma -qa -db -YB -WQ -pa -tz -Zi -Xy -KE -Zp -gv -hw -lU -RU -pJ -wC -WU -Ve -MS -Sj -AN -uC -YZ -YZ -iq -SL -KV -aV -zm -UX -wa -cK -CI -Ck -Iw -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -gX -Mr -WB -LJ -WY -WY -WY -WY -WY -"} -(27,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -yd -cN -ma -Yh -db -Te -Zi -bs -Zi -bj -Xy -eE -HF -HF -HF -kJ -FU -FN -Xy -AN -Qs -NU -hA -WU -Ki -vR -GV -fm -iq -iq -Iw -xL -MO -Jj -BS -CV -ZH -EN -zo -zo -zo -LJ -LJ -LJ -Bk -UJ -ye -LJ -gX -UJ -ye -LJ -WY -WY -WY -WY -WY -"} -(28,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -sv -yd -Hm -dN -VV -db -Zi -kx -Uz -iU -Kj -Xy -rz -HF -fl -OT -bD -yY -ak -yY -lO -Ge -CA -xE -xr -Ki -MC -ZZ -GV -GV -GV -Iw -zW -CV -zJ -BS -HS -BW -Qx -Qx -Qx -Qx -av -av -av -OR -UJ -uU -av -qi -UJ -uU -av -WY -WY -WY -WY -WY -"} -(29,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -yd -ma -yd -VV -db -Zi -Cf -KC -lj -Zi -Xy -CX -VT -LU -dZ -yY -yY -kO -dT -ul -GM -GM -GM -Jk -ro -MB -Ki -ZZ -XE -aq -Iw -vj -Yb -VE -AM -IO -BW -JN -xP -xP -gn -Mr -UJ -UJ -UJ -UJ -UJ -UJ -UJ -UJ -Mr -OS -WY -WY -WY -WY -WY -"} -(30,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -Wa -yd -yd -WE -VV -db -DO -wx -vQ -YB -Zi -Xy -rV -nJ -pt -yY -yY -qo -bi -Li -Hn -di -TP -xU -xU -xU -AT -IE -ZZ -ZZ -Iw -Iw -Iw -Iw -Iw -ge -HS -TL -Qx -Qx -Qx -Qx -Gy -Gy -Gy -Hb -Mr -Al -Gy -Pl -UJ -fw -Gy -WY -WY -WY -WY -WY -"} -(31,1,1) = {" -WY -WY -RM -WY -WY -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -kf -WE -WE -Pc -db -fh -Ua -pa -na -fh -Xy -TV -yF -yY -yY -NM -oC -yj -uv -uv -uv -uv -uv -uv -ly -IX -tP -au -ci -dy -Fm -lA -hZ -Iw -aX -HS -my -Qx -zo -zo -zo -LJ -LJ -LJ -Ft -UJ -IL -LJ -gX -Mr -co -LJ -WY -WY -WY -WY -WY -"} -(32,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -Wa -sv -kf -Zt -ma -pC -db -ty -YB -Pk -Zi -Eh -Xy -JF -lt -Rr -VH -jz -PZ -uv -uv -hm -Vk -uv -Vj -AK -ly -ly -Sv -qv -IE -GR -vU -ps -eD -Iw -iM -pH -FX -Qx -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -Yc -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(33,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -kf -Lj -BD -kC -db -Zi -Vl -jM -GU -TS -Xy -wC -rh -yY -DS -dX -Qp -Uv -lS -sS -Cr -Uv -zz -Vj -Vj -ly -cT -Xq -dG -bz -aV -lK -Ha -aV -pf -VE -RX -Iw -zo -zo -zo -LJ -LJ -LJ -wV -UJ -ye -LJ -Qn -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(34,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -Wa -Wa -sv -Wa -kf -Cq -GX -Cp -db -db -db -db -db -db -yd -kf -kf -NM -jz -rw -Uv -Uv -LA -Rd -Jp -Uv -xF -zz -Kt -Uv -uv -ww -IJ -MB -aV -Iw -aV -aV -Iw -Au -Iw -Iw -ZN -of -of -LJ -LJ -LJ -Qn -UJ -co -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(35,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -jN -WE -Mb -XJ -WE -ma -sM -EZ -eG -Eu -WE -BI -DS -nQ -RW -Fe -sS -Rd -ux -pv -Uv -RL -xF -Vj -xF -mC -Sv -WL -PZ -lx -LN -LN -ct -mu -Lk -xS -LN -jv -Wp -of -of -LJ -LJ -aF -Gy -Ho -LJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(36,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -kf -sI -yd -Mb -Tl -WE -WE -ma -ma -ma -WE -WE -uH -qb -SW -Qo -uv -fp -Cr -uD -dq -hr -Vj -xF -cp -mL -Uv -XI -Bt -Vz -ZM -Ue -xS -tI -WK -Lk -LN -LN -Eq -Ir -yv -of -of -LJ -LJ -LJ -LJ -LJ -aF -Gy -Ho -LJ -WY -WY -WY -WY -WY -"} -(37,1,1) = {" -WY -WY -WY -WY -RM -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -yd -WE -KW -Mb -Nj -bl -bl -kG -Kv -kG -Nr -Nr -dh -JB -nQ -PZ -Fe -Cr -sS -sm -lT -uv -ys -zz -xF -Vj -ZX -PO -yq -DA -JW -Pz -Pz -pM -Pz -Pz -fP -fP -sE -sE -RC -Jx -of -zo -zo -zo -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(38,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -yd -VO -Uh -tp -yd -kf -kf -kf -Gx -kf -kf -kf -kf -GW -KK -PZ -uv -uv -Jl -Rd -FB -Uv -xF -xF -yf -Uv -Uv -YP -qL -KA -hj -pB -pB -hj -hj -Ut -ZN -OM -OM -Sq -Gk -OM -OM -YK -YK -YK -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(39,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -yd -ma -WE -HG -kf -nZ -jZ -jZ -bt -jZ -SX -ug -kf -Ki -PO -Jk -BV -Uv -tT -Cr -sS -Uv -zz -Vj -Vj -ly -xc -oN -qL -KA -OB -Gd -kI -oq -hj -kk -oL -OM -yy -EY -wY -DZ -zL -pw -We -YK -YK -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(40,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -yd -ma -Lj -af -kf -Se -Fl -mt -Cm -by -Nz -kU -Se -Ki -TH -LG -sn -uv -Uv -To -rk -uv -Vj -QF -ly -ly -Sv -ID -ZC -WO -ck -ck -ck -pd -pB -oL -oL -OM -Ox -fL -dw -jx -sA -tZ -Ie -gk -ke -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(41,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -sv -Wa -yd -Vd -ma -Bw -bL -cV -cV -cV -cV -cV -cV -cV -bL -ZZ -Fb -GW -Ci -MB -Uv -Uv -uv -uv -uv -uv -ly -GV -oN -qL -KA -KA -sl -sl -mO -pd -pB -mr -am -OM -CW -Kn -Yt -hk -sA -Yt -yo -WD -cr -YK -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(42,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -yd -ma -ma -HG -bL -GF -Ls -wc -KJ -fI -Bp -vN -Zr -ZZ -Ki -tH -GW -Ci -ff -LL -Mp -CG -ro -br -GV -RS -to -qL -KA -sl -sl -Vg -mO -SZ -hj -OG -Xr -OM -vo -EY -sA -OC -Yt -Yt -sA -uN -oS -Kc -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(43,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -sv -yd -ma -KQ -HG -cV -EV -IW -HX -uh -QO -zZ -Nq -ah -Ki -ai -tH -tH -ik -ul -eg -OP -GM -ID -xU -xU -ul -xU -ZC -tk -IU -WM -sl -iy -FS -hj -YT -YT -OM -vG -EY -Ch -Ch -Lh -Yy -kW -Ch -tn -FR -YK -YK -zo -zo -WY -WY -WY -WY -WY -"} -(44,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -Wa -kf -LH -WE -GL -iA -xi -tJ -tJ -Ae -zD -DH -yS -nu -Ki -nQ -Jq -Ki -jP -ZZ -IQ -FH -Yr -SI -gJ -gJ -gJ -Px -lR -gJ -gJ -hj -po -iy -KZ -hj -Rp -Dk -GJ -kq -mK -Qw -Yt -Yt -mK -gW -PE -Tk -oS -hL -YK -zo -zo -WY -WY -WY -WY -WY -"} -(45,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -kf -VO -Kp -Yh -Lr -gd -ga -QO -gd -jy -FV -IH -ah -Ki -Kl -RK -Wn -GM -ZZ -ZZ -iT -US -nb -gJ -XT -KT -KO -XG -XT -GS -hj -nc -iy -Ju -pB -rZ -nL -GJ -ut -Yt -VK -ry -Yt -EE -SV -VK -TX -an -JX -YK -zo -zo -WY -WY -WY -WY -WY -"} -(46,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -kf -GX -GX -NL -cV -EV -Mt -yL -QO -QO -Ht -aS -QO -Ki -vF -nQ -EA -cA -Jq -Ki -DN -LS -Hg -gJ -XT -Gs -yt -sX -xR -XT -ft -sl -td -Ju -pB -YT -tC -QC -QC -QC -QC -Km -Km -Km -ZG -ZG -ZG -ZG -ZG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(47,1,1) = {" -WY -WY -WY -RM -WY -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -kf -WE -Lj -SD -cV -ku -EB -hE -rv -vl -JY -bF -ba -Ki -Mz -jA -vd -QP -Jq -Ki -Nv -fU -Hg -Xj -pG -Yk -go -Nt -sX -XG -Tz -sl -FZ -dW -pB -ru -gP -TF -JL -Qy -QB -ng -nF -Sb -Jm -Sb -bc -PR -mG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(48,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -kf -WE -WE -SD -bL -bL -cV -cV -cV -cV -cV -cV -cV -Ki -ZZ -ZZ -AP -AP -AP -AP -JE -XD -Hg -bA -Yk -MQ -gb -iJ -sX -Rh -hj -Bn -hj -hj -hj -vm -jV -Wq -JI -uW -bo -ng -MV -Ur -Dv -Dv -Ur -gN -md -cu -zo -zo -WY -WY -WY -WY -WY -"} -(49,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -WE -KW -VJ -yd -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -zi -HB -dA -eB -Nw -bg -AG -cU -MF -gJ -aZ -Yk -ev -XG -Vm -Gt -hj -uR -uR -hV -hj -Wu -eA -dJ -kD -Ce -xO -Ih -qH -cQ -Uy -PR -rB -ng -oE -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(50,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -PF -PF -Ks -kf -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -vC -LY -Xw -Zg -Yu -uS -UU -Es -JR -gJ -Dj -XT -aK -Hj -XT -Yv -hj -JM -uR -hV -hj -fB -hQ -fB -fB -Rx -Lf -Pq -DY -PR -Gm -jD -dP -rK -RE -qh -zo -zo -WY -WY -WY -WY -WY -"} -(51,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -Wa -Wa -sv -kf -No -No -No -kf -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -sv -vC -qQ -Hk -Hf -Ud -uS -iT -US -mT -gJ -gJ -gJ -pz -pz -pz -gJ -hj -hj -hj -pB -pB -Yp -vA -th -fB -LD -Lf -ng -ZV -Io -jD -PR -Io -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(52,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -Wa -vC -bY -Fv -nk -aU -uS -Bc -LS -MF -YH -LS -tv -Es -LS -tv -Wi -zp -Ux -ND -Ux -YW -Ux -yN -Vu -fB -mq -dE -ng -ui -jD -PR -jD -wp -cE -jW -Lo -zo -Eb -WY -WY -WY -WY -WY -"} -(53,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -vC -xH -Le -nk -pT -SG -BJ -uB -ii -gG -PA -PA -Ps -PA -PA -Es -gG -yD -gG -gG -PA -Ev -qB -Da -QA -Qh -pl -ng -SQ -PR -qO -PR -PR -cE -jW -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(54,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -Wa -vC -ia -zt -mj -DP -vC -cn -Ux -Ub -CY -qS -MF -py -MF -ka -eK -fT -zM -zM -zM -zM -zM -nn -MY -fB -PS -oy -Km -BF -jD -jD -PR -jD -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(55,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -zi -PT -RN -nk -nT -vC -TW -bb -bb -eI -eI -eI -Kk -eI -eI -eI -Hy -yU -mV -yU -yU -ZU -xz -Hy -Hy -Hy -aj -Km -vZ -NV -PR -PR -NV -ym -KL -Ix -zo -zo -WY -WY -WY -RM -WY -"} -(56,1,1) = {" -WY -RM -WY -WY -WY -zo -zo -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -sv -sv -Wa -sv -sv -zi -Fv -zt -ED -ir -ls -lW -EC -zi -Oj -tY -Jv -tc -TK -Im -CS -Hy -in -zy -Fd -zy -wZ -le -hl -Sk -BU -rD -Km -vE -iZ -PR -jD -Os -aP -aP -ZG -zo -zo -WY -WY -RM -WY -WY -"} -(57,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -sv -Wa -sv -sv -sv -Wa -Wa -Wa -Wa -sv -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -zi -NX -RN -nk -Fv -gD -JQ -NN -vC -Vx -Ji -Cy -El -tM -dv -Ij -Hy -Rc -Vn -EU -aT -Rq -aT -ne -JV -Nl -sq -Km -Gb -Ur -Dv -Dv -Ur -PR -Tb -cu -zo -zo -WY -WY -WY -WY -WY -"} -(58,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -Wa -vC -Fk -Oa -LZ -cD -zi -zi -vC -vC -Jv -Jv -Jv -YC -TK -TK -Jv -aj -Sa -Fq -UK -fi -os -LQ -Xz -Xz -dR -eM -ng -Ts -dk -uM -iC -gN -PR -jU -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(59,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -sv -sv -Wa -sv -Wa -sv -sv -Wa -sv -Wa -Wa -sv -sv -sv -Wa -Wa -sv -vC -ph -Fv -nk -RN -gD -kR -kX -vC -xq -ov -ve -sw -lD -yA -ZY -aj -BU -zh -BU -jo -TQ -BU -Bo -Vy -BU -IK -ng -ng -ng -ng -ng -ng -ng -ng -ZG -zo -uF -WY -WY -WY -WY -WY -"} -(60,1,1) = {" -WY -WY -WY -WY -WY -WY -uo -zo -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -Wa -Wa -sv -vC -nW -Nx -Wh -CE -hY -IF -cY -vC -sD -JO -Jv -pX -Jv -Pa -Hi -aj -zf -zf -KB -CL -zf -aj -aj -aj -zf -zf -Hy -Wa -Wa -sv -sv -Wa -Wa -Wa -zo -uF -FE -WY -WY -WY -WY -WY -"} -(61,1,1) = {" -WY -WY -WY -WY -WY -WY -FE -uF -zo -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -vC -vC -vC -vC -zi -zi -zi -vC -vC -Sw -Sw -Sw -Sw -Sw -Sw -Sw -zf -Ng -Wv -BU -Xz -YD -Jw -Bq -Wc -Wc -bH -sv -sv -sv -Wa -Wa -Wa -Wa -zo -zo -uF -WY -WY -WY -WY -WY -WY -"} -(62,1,1) = {" -WY -WY -WY -WY -ZJ -WY -FE -zo -zo -zo -Wa -Aq -sv -sv -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -XZ -Wa -bH -Lp -Pp -Zl -qF -Xz -iu -Cs -qr -HH -ip -zo -sv -Wa -sv -Wa -Wa -zo -zo -uF -FE -WY -WY -WY -WY -WY -WY -"} -(63,1,1) = {" -WY -WY -WY -jn -Wt -WY -FE -WY -uF -zo -zo -Aq -eW -sv -sv -Aq -sv -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -XZ -Wa -bH -lZ -kh -tV -zd -ud -Xn -bH -Ba -ot -bH -zo -sv -Wa -Wa -Wa -zo -zo -uF -FE -WY -WY -WY -WY -WY -WY -WY -"} -(64,1,1) = {" -WY -WY -WY -jn -jn -FE -FE -qD -FE -uF -zo -Aq -Hq -Hq -UM -bS -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -Wa -XZ -bH -KG -bH -gA -gA -bH -KG -bH -bH -bH -bH -zo -sv -sv -Wa -zo -zo -uF -FE -WY -WY -WY -WY -WY -WY -WY -WY -"} -(65,1,1) = {" -WY -WY -Wt -jn -jn -Wt -FE -WY -WY -WY -WY -Aq -ds -MW -BB -Aq -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -zo -zo -zo -zo -zo -zo -zo -dr -zo -zo -zo -zo -zo -zo -zo -Wa -zo -zo -uF -uF -FE -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(66,1,1) = {" -WY -WY -jn -jn -Wt -jn -FE -FE -FE -FE -FE -Aq -Aq -Si -Aq -Aq -zo -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -uF -FE -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -"} -(67,1,1) = {" -WY -ZJ -Wt -jn -jn -jn -WY -WY -WY -WY -WY -WY -al -al -al -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(68,1,1) = {" -WY -WY -WY -Wt -jn -Wt -ZJ -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(69,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(70,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(71,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm deleted file mode 100644 index 8232aa56a5d..00000000000 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm +++ /dev/null @@ -1,13902 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ag" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ah" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ai" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cryopod{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ak" = ( -/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/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"am" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/mop_bucket, -/obj/item/mop, -/obj/item/reagent_containers/cup/bucket, -/obj/item/soap/nanotrasen, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"an" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"aq" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ar" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"as" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"at" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"av" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aw" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/med{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"aF" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"aP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/storage) -"aS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"aU" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/item/card/id/away/tarkon{ - pixel_y = -6 - }, -/obj/item/card/id/away/tarkon, -/obj/item/card/id/away/tarkon{ - pixel_y = 6 - }, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"aV" = ( -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"aX" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"aY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/anticorner, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"aZ" = ( -/obj/machinery/biogenerator, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"ba" = ( -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/turf_decal/tile/blue/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/security/old, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"bi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bj" = ( -/obj/structure/alien/weeds/node, -/obj/machinery/light/broken/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"bm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"bn" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = -24; - req_one_access = list("tarkon") - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -8; - pixel_y = -36; - req_one_access = list("tarkon") - }, -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bq" = ( -/obj/machinery/door/airlock/titanium/glass, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"br" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"bx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"by" = ( -/obj/effect/decal/cleanable/dirt, -/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/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/effect/decal/cleanable/dirt, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"bz" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"bA" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"bD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"bF" = ( -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bH" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"bK" = ( -/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, -/area/ruin/space/has_grav/port_tarkon/porthall) -"bO" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bS" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bT" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"bV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"bY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack/gunrack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"cc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/protolathe/offstation, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"cd" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ce" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"cn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"co" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"cq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"cr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/folder, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"cs" = ( -/obj/structure/alien/weeds/node, -/obj/item/stack/ore/uranium, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"ct" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"cu" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"cv" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"cz" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien/drone, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"cA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/supply{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"cE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"cH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"cK" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"cQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"cT" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"cV" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/trauma) -"cW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"cX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"cY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"db" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"df" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/machinery/button/door{ - id = "ptatmos"; - name = "shutter controls"; - pixel_x = -39; - pixel_y = -10 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"dh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"di" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dk" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/holosign_creator/janibarrier, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"dl" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/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, -/area/ruin/space/has_grav/port_tarkon) -"dr" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 16; - name = "Port Tarkon"; - roundstart_template = /datum/map_template/shuttle/ruin/tarkon_driver/defcon3; - shuttle_id = "port_tarkon"; - width = 14 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"dt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/sofa/corp{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"dw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"dy" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"dA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"dB" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"dC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"dG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"dR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"dT" = ( -/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/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"dX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/autolathe, -/obj/effect/turf_decal/tile/yellow/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ed" = ( -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"ef" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage" - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"eg" = ( -/obj/effect/decal/cleanable/dirt, -/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/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ek" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ep" = ( -/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/structure/flippedtable{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"es" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"eu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"eA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/flippedtable{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"eB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"eD" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"eE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"eF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"eG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xgibs/up, -/obj/machinery/light/broken/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eI" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eK" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eL" = ( -/obj/machinery/door/airlock/public, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"eM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"eQ" = ( -/obj/machinery/computer/atmos_control/tarkon/incinerator{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/glass, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/obj/structure/cable, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"fd" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"ff" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"fh" = ( -/obj/structure/closet/crate/secure/gear, -/obj/item/microfusion_gun_attachment/rail, -/obj/item/flashlight/seclite, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"fl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"fp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/closet, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/chief_engineer, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ft" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"fv" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fw" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"fB" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"fC" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fI" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/gun/medbeam/afad, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"fJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fK" = ( -/mob/living/simple_animal/hostile/alien/drone, -/obj/item/stack/ore/uranium, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"fL" = ( -/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/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"fO" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"fR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fT" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/delivery/blue, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/rolling, -/obj/item/scalpel, -/obj/item/hemostat, -/obj/item/cautery, -/obj/item/bonesetter, -/obj/item/stack/medical/suture/medicated, -/obj/item/retractor, -/obj/item/clothing/gloves/latex, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ga" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"gb" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xsplatter, -/obj/effect/decal/cleanable/ash, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"gd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ge" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"gk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gl" = ( -/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/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"gn" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"go" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/hydronutrients, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gs" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_interior, -/obj/machinery/airlock_controller/incinerator_tarkon{ - pixel_x = 40; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gt" = ( -/obj/item/stack/ore/uranium, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"gu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"gv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/empty, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"gy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds/node, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"gA" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/door/firedoor/heavy/closed, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/mining) -"gD" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/secoff) -"gE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"gJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/garden) -"gN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"gP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/folder, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"gR" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"gS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"gT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/margherita, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/margherita, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"gW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - name = "Broken Computer" - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"ha" = ( -/obj/structure/bed/nest, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/mob_spawn/corpse/facehugger, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"hb" = ( -/obj/item/wallframe/firealarm, -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"hf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/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, -/area/ruin/space/has_grav/port_tarkon/forehall) -"hi" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hj" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hl" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"hm" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/cargo/tech/skyrat/utility, -/obj/item/clothing/under/rank/cargo/tech/skyrat/gorka, -/obj/item/storage/backpack/duffelbag/explorer, -/obj/item/storage/backpack/explorer, -/obj/item/storage/backpack/satchel/explorer, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ho" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"hr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage"; - state_open = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"hw" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"hy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hA" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"hD" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"hE" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"hL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"hM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hP" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hQ" = ( -/obj/machinery/door/airlock/mining, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/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/ruin/space/has_grav/port_tarkon/cargo) -"hR" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/machine/ore_redemption, -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"hV" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hY" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"hZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/smes/engineering{ - charge = 0; - name = "backup power storage unit" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"ia" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/maint_kit, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/iron/twenty, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ic" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ik" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"in" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/machine/ore_silo, -/obj/structure/frame/machine, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ip" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor/solid/closed, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iq" = ( -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"iu" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iv" = ( -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iw" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 6 - }, -/obj/structure/closet/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/suit/utility/radiation, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"iA" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"iB" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"iG" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/hydroseeds, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"iM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"iT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"iU" = ( -/mob/living/simple_animal/hostile/alien/drone, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"iV" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"iW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"iZ" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ja" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"jc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jg" = ( -/obj/machinery/door/airlock/public, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/firedoor/closed{ - opacity = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jm" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/alien/resin/wall, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jn" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission) -"jo" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"jv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/button/door{ - id = "ptobservatory"; - name = "shutter controls"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"jz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jE" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"jF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/wood, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"jG" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jM" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"jO" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"jP" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"jU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/science, -/obj/item/areaeditor/blueprints/slime, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"jV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"jY" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/helmet, -/obj/item/clothing/head/helmet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"jZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ka" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"kb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kc" = ( -/obj/effect/decal/cleanable/dirt, -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/wrench, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ke" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/vaulter, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kf" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/obj/machinery/light/dim/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ki" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"kk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ko" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/tape/ruins/tarkon/celebration, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"kq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kr" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"kt" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ku" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"kx" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kA" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kD" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"kF" = ( -/obj/structure/fence/corner, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kG" = ( -/obj/structure/closet/crate/secure/weapon, -/obj/item/gun/microfusion/mcr01, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"kI" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"kJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"kN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"kO" = ( -/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/tile/neutral/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"kS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"kT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xgibs, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/megaphone, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed/maint, -/obj/structure/safe/floor, -/obj/item/mod/module/armor_booster/retractplates{ - desc = "A complex set of actuators, micro-seals and a simple guide on how to install it, This... \"Modification\" allows the plating around the joints to retract, giving minor protection and a bit better mobility. There also seems to be a small, wireless microphone... how odd." - }, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ld" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"le" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"li" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"lj" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs/larva, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lp" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/item/paper/fluff/ruins/tarkon/atmosincident, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/chair/wood, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"ls" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lw" = ( -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lx" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ly" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon) -"lA" = ( -/obj/structure/closet/crate/radiation, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lD" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm4"; - name = "Couples Suite" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"lE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"lF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lH" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lI" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lK" = ( -/obj/structure/closet/firecloset/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lR" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"lS" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/storage/backpack/medic, -/obj/item/storage/backpack/satchel/med, -/obj/item/storage/backpack/satchel/chem, -/obj/item/storage/backpack/satchel/vir, -/obj/item/storage/backpack/virology, -/obj/item/storage/backpack/duffelbag/virology, -/obj/item/storage/backpack/duffelbag/chemistry, -/obj/item/storage/backpack/chemistry, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lT" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lU" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/brown/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lX" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"lZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"mc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/machinery/computer/atmos_control/tarkon/nitrogen_tank{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"md" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"mh" = ( -/obj/structure/firelock_frame, -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mi" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ml" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"mo" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"mq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"mr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"mt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"mv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"my" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"mB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/tarkon/defcon3, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"mC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"mD" = ( -/obj/item/stack/ore/bluespace_crystal, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"mE" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"mH" = ( -/obj/effect/decal/cleanable/dirt, -/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/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"mI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/item/paper/fluff/ruins/tarkon/transmission, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"mM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"mO" = ( -/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/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"mT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"mV" = ( -/obj/machinery/door/window/right/directional/east, -/obj/machinery/door/window/right/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"mZ" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs/body, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"nb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/effect/decal/cleanable/dirt, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"nc" = ( -/obj/structure/sink/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ng" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"nh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nk" = ( -/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/tile/red/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nm" = ( -/obj/machinery/atmospherics/miner/nitrogen, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"no" = ( -/obj/effect/mob_spawn/corpse/human/miner/mod, -/turf/open/space/basic, -/area/template_noop) -"nt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"nu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/blue/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"nx" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"nF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/engineering, -/obj/item/stack/sheet/plasteel/fifty, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/mineral/plasma/thirty, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"nL" = ( -/obj/item/stack/tile/carpet/neon/simple/purple/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"nP" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"nQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"nS" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nZ" = ( -/obj/effect/decal/cleanable/dirt, -/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/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, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"oc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"oe" = ( -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"of" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptafthall" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"og" = ( -/obj/structure/table/reinforced, -/obj/item/pipe_dispenser, -/obj/item/storage/belt/utility/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"om" = ( -/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/carbon_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"on" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"op" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stock_parts/micro_laser, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"oq" = ( -/obj/machinery/processor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"os" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ot" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ov" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"ow" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"oy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/safe/floor, -/obj/structure/table, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"oC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oE" = ( -/obj/machinery/button/door{ - id = "tarkonouter"; - name = "Exterior Shutter Control"; - pixel_x = -6 - }, -/obj/machinery/button/door{ - id = "tarkoninner"; - name = "Inner Shutter Control"; - pixel_x = 6 - }, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"oG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oK" = ( -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"oL" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"oN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/carbon_tank{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"oV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pa" = ( -/obj/structure/alien/resin/wall, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pd" = ( -/obj/machinery/griddle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"pf" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ph" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"pk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"pl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"po" = ( -/obj/structure/sink/kitchen/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"pr" = ( -/obj/item/wallframe/airalarm, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ps" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"pt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pv" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"px" = ( -/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/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"pA" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pD" = ( -/mob/living/simple_animal/hostile/alien, -/obj/item/stack/ore/uranium, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"pE" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"pH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"pJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"pS" = ( -/obj/structure/fluff/empty_sleeper/bloodied, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pT" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/clothing, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"pY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/research/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"qb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/flippedtable{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qd" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"qf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptafthall"; - name = "shutter controls"; - pixel_x = -26 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"qh" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qi" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"qk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/oxygen_tank{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qv" = ( -/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/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qD" = ( -/obj/structure/lattice, -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"qF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qH" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qL" = ( -/obj/effect/decal/cleanable/dirt, -/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/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"qS" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"rd" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"re" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"rg" = ( -/obj/effect/turf_decal/stripes/asteroid/corner, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"rh" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ro" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"rt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ru" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"rv" = ( -/obj/structure/table, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/surgery, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"rw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ry" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"rz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/assembly/igniter, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"rC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon/sci{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"rD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/mask/gas/explorer, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"rE" = ( -/obj/structure/alien/egg/burst, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"rF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rG" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"rL" = ( -/obj/effect/turf_decal/vg_decals/atmos/oxygen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/oxygen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"rP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"rV" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"rZ" = ( -/obj/item/stack/tile/carpet/neon/simple/teal/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"sa" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/air_sensor/tarkon/incinerator_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"sj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"sm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"sn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"sq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/pickaxe/silver, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/glasses/meson, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"sr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sv" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav) -"sw" = ( -/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/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sB" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sF" = ( -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/red, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"sL" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xgibs, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/computer{ - dir = 8 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ta" = ( -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"tc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/north, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"td" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"te" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"tf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/trash_pile, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"th" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"tk" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"to" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ts" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/purple/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"tt" = ( -/obj/structure/fence/cut/medium{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"tz" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"tA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"tC" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"tE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"tM" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm2"; - name = "Private Dorm 2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"tN" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"tQ" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/porthall) -"tT" = ( -/obj/structure/closet, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"tV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"tW" = ( -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tY" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/south{ - id = "ptdorm1"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"tZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ub" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ud" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ue" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ug" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/obj/effect/decal/remains/human, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ui" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ul" = ( -/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/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"un" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/stack/ore/gold, -/obj/item/stack/ore/gold, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"uo" = ( -/mob/living/basic/carp/mega, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"up" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ut" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon) -"uw" = ( -/mob/living/simple_animal/hostile/alien, -/obj/item/stack/ore/gold, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"ux" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uy" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav/port_tarkon/porthall) -"uC" = ( -/obj/structure/closet/crate/bin{ - pixel_y = 8 - }, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/item/reagent_containers/cup/rag, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"uD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"uK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"uM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"uN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uP" = ( -/obj/effect/decal/cleanable/dirt, -/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, -/area/ruin/space/has_grav/port_tarkon/porthall) -"uR" = ( -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"uU" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"uV" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"vc" = ( -/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/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"vd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ve" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm3"; - name = "Private Dorm 3" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"vj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"vl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/structure/closet/crate/freezer/blood, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"vn" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/starboardhall) -"vo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/cell_charger, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vp" = ( -/obj/machinery/atmospherics/miner/n2o, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/north, -/obj/effect/decal/cleanable/glass, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"vs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 4; - name = "Broken Computer" - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"vy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vz" = ( -/obj/machinery/door/airlock/public, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed{ - opacity = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"vA" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"vB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/curtain, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/secoff) -"vE" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"vF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/gps/computer/space{ - gpstag = "Port Tarkon - Defcon 3" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vN" = ( -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vQ" = ( -/mob/living/simple_animal/hostile/alien/drone, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vR" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/mob/living/simple_animal/hostile/alien/drone, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"vW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"wa" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"wc" = ( -/obj/structure/table, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/clothing/suit/toggle/labcoat/medical, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"wh" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wl" = ( -/obj/effect/decal/cleanable/glass, -/mob/living/simple_animal/hostile/alien/sentinel, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stock_parts/matter_bin, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"wo" = ( -/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/decal/cleanable/blood, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"wt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ww" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"wx" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wC" = ( -/obj/effect/turf_decal/tile/yellow/full, -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/spawner/random/engineering/tool, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"wQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wV" = ( -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"wW" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_tarkon{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"wZ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"xc" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"xj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xl" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/sec{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"xp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/green/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"xs" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"xt" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/anomaly_refinery, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xB" = ( -/obj/machinery/igniter/incinerator_tarkon, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 5 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/structure/closet/crate/secure/science, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"xH" = ( -/obj/machinery/ammo_workbench/unlocked, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"xL" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"xN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"xO" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"xP" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"xS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"xT" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xU" = ( -/obj/effect/decal/cleanable/dirt, -/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/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/curtain, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xZ" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"yd" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ye" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"yi" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"yj" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"ym" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"yn" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"yt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/flippedtable{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/coffee, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"yx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/mechfab, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/machinery/recharger, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"yz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/structure/table/optable, -/obj/effect/decal/cleanable/xenoblood/xgibs/up, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"yB" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yC" = ( -/obj/machinery/air_sensor/tarkon/mix_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"yD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"yF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"yG" = ( -/obj/structure/alien/resin/wall, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"yS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"yU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/mining) -"yY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"zb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/fence/door/opened{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"zc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zf" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"zm" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zo" = ( -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"zp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/blue, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"zB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/mob/living/simple_animal/hostile/alien/drone, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"zC" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"zL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"zM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zO" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"zT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/holosign_creator/atmos, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zZ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ae" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Af" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ak" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Al" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"An" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fireaxecabinet/directional/north, -/obj/machinery/pipedispenser, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"As" = ( -/obj/machinery/power/shuttle_engine/propulsion{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav) -"At" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Au" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Az" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/developement) -"AA" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"AF" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AG" = ( -/obj/effect/decal/cleanable/dirt, -/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, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"AM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"AN" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"AP" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ba" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Bi" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bk" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Bn" = ( -/obj/machinery/door/airlock/public{ - name = "Kitchen Freezer" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Bo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/machinery/computer/order_console/mining{ - forced_express = 1; - express_cost_multiplier = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bp" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/circuitboard/machine/sleeper, -/obj/structure/closet/secure_closet/medical1, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Bq" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds/node, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"BG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ash, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BI" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BK" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/atmos) -"BM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/white, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BU" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"BV" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"BW" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/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, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Cc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ce" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Cf" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ch" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ci" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ck" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Cm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cp" = ( -/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/decal/cleanable/blood/gibs/old, -/obj/structure/cable, -/obj/effect/turf_decal/delivery/blue, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/blue, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cs" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Cv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Cw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/gold{ - amount = 25 - }, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Cx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/effect/spawner/random/trash/cigbutt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Cy" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm1"; - name = "Private Dorm 1" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/flippedtable{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CB" = ( -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"CE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/red/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"CG" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CI" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CL" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"CM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"CP" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"CS" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/coin, -/obj/item/coin, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"CX" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/screwdriver, -/obj/item/wrench, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"CY" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"CZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stock_parts/servo, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Da" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Dc" = ( -/obj/structure/bed/nest, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/item/raw_anomaly_core/random, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"De" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/broken_bottle, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Dk" = ( -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = -8 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/stack/spacecash/c20{ - pixel_y = 10 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = 5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -4; - pixel_y = -5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -6; - pixel_y = 12 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/mod/module/visor/rave, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Dv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"DA" = ( -/obj/effect/decal/cleanable/dirt, -/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/neutral/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/clothing/gloves/color/yellow, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"DG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"DK" = ( -/obj/structure/alien/weeds/node, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"DN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"DO" = ( -/obj/machinery/light/broken/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DP" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Broken Computer" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half, -/obj/item/paper/fluff/ruins/tarkon/detain, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"DQ" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"DS" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/flippedtable{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Eb" = ( -/mob/living/basic/carp, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"Ed" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cryopod{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ek" = ( -/obj/effect/decal/cleanable/dirt, -/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/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"El" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/dorms) -"Eq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Er" = ( -/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/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Es" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Et" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Eu" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood/gibs/limb{ - pixel_x = -20; - pixel_y = -5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ex" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"EA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"EB" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"EE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/lighter, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/item/tape/ruins/tarkon, -/obj/machinery/button/door{ - id = "ptcomms"; - name = "shutter controls" - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"EH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"EJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"EN" = ( -/obj/structure/sign/warning/deathsposal, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"EO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"EQ" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptobservatory" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/observ) -"EV" = ( -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EW" = ( -/mob/living/basic/carp/mega, -/turf/open/space/basic, -/area/template_noop) -"EY" = ( -/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, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Fb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Fe" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Fh" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fk" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/pouch/ammo, -/obj/item/storage/pouch/ammo, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Fl" = ( -/obj/item/electronics/apc, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airalarm, -/obj/item/electronics/airalarm, -/obj/structure/closet/crate/engineering/electrical{ - name = "electronics crate" - }, -/obj/item/electronics/tracker, -/obj/item/stack/cable_coil, -/obj/item/clothing/gloves/color/yellow, -/obj/item/circuitboard/computer/atmos_control/tarkon/carbon_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/mix_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/nitrogen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/incinerator, -/obj/item/circuitboard/computer/atmos_control/tarkon/oxygen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/plasma_tank, -/obj/item/circuitboard/computer/tarkon_driver, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Fm" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Fq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Fr" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fs" = ( -/obj/machinery/airlock_sensor/incinerator_tarkon{ - pixel_x = 6; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ft" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"FB" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"FC" = ( -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"FE" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/template_noop) -"FF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"FG" = ( -/obj/item/shovel, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"FM" = ( -/obj/structure/alien/resin/wall, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"FN" = ( -/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/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"FS" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/enzyme, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"FT" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"FU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FX" = ( -/obj/structure/table, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/belt/utility/full, -/obj/item/paper/fluff/ruins/tarkon/designdoc, -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"FY" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/glass, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"FZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gd" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/machinery/light/dim/directional/east, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/broken_bottle, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gk" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/comms) -"Gl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/paper/crumpled/fluff/tarkon, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gn" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Gp" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Gs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gt" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gu" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gv" = ( -/obj/effect/decal/cleanable/blood/gibs/torso, -/obj/machinery/light/broken/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Gx" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Gy" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"GB" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/nitrous_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GD" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"GE" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GF" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"GM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GR" = ( -/obj/machinery/door/airlock/engineering{ - name = "Backup Generator Room" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"GS" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"GT" = ( -/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/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"GU" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/structure/bed/nest, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/mob_spawn/corpse/facehugger, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"GW" = ( -/obj/effect/decal/cleanable/dirt, -/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/neutral/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GY" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ha" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/greenglow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Hb" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hg" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/starboardhall) -"Hi" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/neck/mantle, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Hk" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ho" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav) -"Ht" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Hy" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"HB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"HF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"HH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"HQ" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/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/ruin/space/has_grav/port_tarkon/developement) -"HS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"HU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"HW" = ( -/obj/machinery/door/airlock/public, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"HX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"HY" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ib" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ic" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Id" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ie" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"If" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Ih" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid/closed, -/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/ruin/space/has_grav/port_tarkon/storage) -"Ij" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Ik" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/rolling, -/obj/item/scalpel, -/obj/item/clothing/gloves/latex, -/obj/item/circular_saw, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Im" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/north{ - id = "ptdorm2"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Io" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Iw" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"Ix" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"IB" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"ID" = ( -/obj/effect/decal/cleanable/dirt, -/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/tile/neutral, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IE" = ( -/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/tile/neutral/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"IG" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/obj/item/circuitboard/machine/rtg, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"IH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/item/pickaxe/mini, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/mask/gas/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/item/storage/belt/mining, -/obj/effect/turf_decal/tile/brown/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"IL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"IO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"IU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"IW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ji" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jj" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Jl" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/security/skyrat/utility/redsec, -/obj/item/clothing/under/rank/security/skyrat/utility, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/storage/backpack/duffelbag/sec, -/obj/item/storage/backpack/duffelbag/sec/redsec, -/obj/item/storage/backpack/satchel/sec/redsec, -/obj/item/storage/backpack/security/redsec, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Jp" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jq" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ju" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Jv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Jx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/cola, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Jz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/destructive_analyzer, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"JB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"JE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/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, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"JF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"JI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/west, -/obj/item/paper_bin, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/engineering, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/item/construction/rcd/arcd/mattermanipulator, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"JN" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"JO" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/random, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/south{ - id = "ptdorm3"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"JQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"JT" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav) -"JW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/effect/decal/cleanable/dirt, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"JX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/anticorner, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"JY" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/closet/secure_closet/medical2{ - req_access = list("medical") - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Kc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/driverpitch, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ke" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Kf" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"Kg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/flippedtable{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ki" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kj" = ( -/obj/structure/alien/resin/wall, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Kk" = ( -/obj/machinery/door/airlock/wood/glass, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Kl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ks" = ( -/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/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Kw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"KA" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/airlock/mining/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"KE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/flashlight, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"KG" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"KJ" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/defibrillator, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"KL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"KM" = ( -/obj/machinery/button/ignition/incinerator/tarkon, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"KO" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/garden) -"KP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/storage/box/stockparts/basic, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"KQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"KV" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/east{ - opacity = 1 - }, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/gibs/body, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KZ" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"La" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ld" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_exterior, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Le" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Lf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Lg" = ( -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/mob_spawn/corpse/human/damaged, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"Lh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Lm" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Lo" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp/mega, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Lp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Lr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ls" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ly" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"LA" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/rnd/scientist/skyrat/utility, -/obj/item/clothing/under/rank/rnd/roboticist/skyrat/sleek, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/storage/backpack/duffelbag/science, -/obj/item/storage/backpack/duffelbag/science/robo, -/obj/item/storage/backpack/satchel/science, -/obj/item/storage/backpack/satchel/science/robo, -/obj/item/storage/backpack/science, -/obj/item/storage/backpack/science/robo, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"LD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"LG" = ( -/obj/effect/decal/cleanable/dirt, -/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/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"LH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"LI" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ash, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/forehall) -"LJ" = ( -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"LN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"LQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"LS" = ( -/obj/item/stack/ore/titanium, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"LW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"LY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/pen/fountain, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Md" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Me" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Mi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Mp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Mr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"Mt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Mu" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Mz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/tank/air, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MC" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MD" = ( -/obj/machinery/atmospherics/miner/plasma, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ME" = ( -/mob/living/simple_animal/hostile/alien/queen, -/obj/effect/turf_decal/tile/purple/anticorner, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"MF" = ( -/obj/structure/cable, -/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/ruin/space/has_grav/port_tarkon/starboardhall) -"MG" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"MJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"MO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/safe/floor, -/obj/item/areaeditor/blueprints/tarkon, -/obj/item/tape/ruins/tarkon/safe, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"MS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"MU" = ( -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"MV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"MX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"MY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Ng" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Nh" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ni" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Nj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Nq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Nr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ns" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Nt" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Nw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/assembly/flash, -/obj/item/assembly/flash, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/iron/fifty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"NH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"NK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/dark/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"NM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/flippedtable{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"NN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed/maint, -/obj/item/paper/crumpled/fluff/tarkon/prisoner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"NX" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Oa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Ob" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Oi" = ( -/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/ruin/space/has_grav/port_tarkon/observ) -"Oj" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/clothing/beret_or_rabbitears, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Om" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/glass, -/mob/living/basic/carp, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"On" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/structure/frame/machine, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Oo" = ( -/obj/effect/decal/cleanable/dirt, -/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/delivery/blue, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Oq" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Os" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ow" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/gibs/down, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"Ox" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/dice, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"OB" = ( -/obj/machinery/vending/dinnerware, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"OD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"OF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"OG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"OI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"OJ" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs/core, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"OM" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/comms) -"OR" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"OS" = ( -/obj/structure/cable, -/obj/item/solar_assembly, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"OT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"OZ" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pa" = ( -/obj/structure/bed/double/pod, -/obj/item/bedsheet/random/double, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/fancy_pillow, -/obj/item/fancy_pillow, -/obj/machinery/button/door/directional/north{ - id = "ptdorm4"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Pc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/mob/living/simple_animal/hostile/alien/sentinel, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Pf" = ( -/obj/effect/decal/cleanable/dirt, -/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/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Pq" = ( -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ps" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Pt" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/utility/hardhat/orange, -/obj/item/clothing/gloves/color/black, -/obj/item/storage/belt/utility, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Px" = ( -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Pz" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/afthall) -"PB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"PF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/resin/wall, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"PK" = ( -/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/solid/closed, -/obj/machinery/door/airlock/atmos/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PM" = ( -/obj/structure/bed/nest, -/obj/effect/mob_spawn/corpse/human, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/item/raw_anomaly_core/random, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"PQ" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/turf/open/floor/plating, -/area/ruin/space/has_grav) -"PR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"PS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Financing Console" - }, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"PT" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"PZ" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qf" = ( -/obj/effect/decal/cleanable/dirt, -/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/ruin/space/has_grav/port_tarkon/developement) -"Qg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/pink/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Qk" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qn" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Qo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qp" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qs" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Qu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/machinery/computer/atmos_control/tarkon/plasma_tank{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qx" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Qy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/machinery/suit_storage_unit/industrial/hauler, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QA" = ( -/obj/machinery/door/window/left/directional/north, -/obj/machinery/door/window/left/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"QH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"QP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/machinery/meter, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"QT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/hydroponics/soil, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"QW" = ( -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QX" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"QY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/component_printer, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Rc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rf" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rg" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Rm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Turbine Maintenance Door" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rp" = ( -/obj/machinery/vending/dorms, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Rq" = ( -/obj/structure/cable, -/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/ruin/space/has_grav/port_tarkon/mining) -"Rr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Rx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"RB" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"RC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"RE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"RF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"RH" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/circuit_imprinter/offstation, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"RK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"RL" = ( -/turf/closed/wall/mineral/titanium, -/area/ruin/space/has_grav) -"RM" = ( -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"RO" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/alien, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"RT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RU" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"RX" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/utility/welding, -/obj/item/clothing/gloves/color/yellow, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"RY" = ( -/obj/effect/turf_decal/vg_decals/atmos/plasma, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/plasma_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Sa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Se" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/trash_pile, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Sf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sk" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/titanium{ - amount = 30 - }, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sp" = ( -/obj/structure/alien/resin/wall, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/built/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sq" = ( -/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/blue/half{ - dir = 1 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/comms) -"Su" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Sw" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"SA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xgibs/larva, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"SE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/machinery/light/broken/directional/north, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/machinery/door/window/brigdoor/left/directional/north, -/obj/item/paper_bin{ - pixel_x = 7 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"SI" = ( -/obj/effect/decal/cleanable/dirt, -/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/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SK" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SL" = ( -/obj/machinery/shower/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/door/window/right/directional/north{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SM" = ( -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"SQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ST" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/observ) -"SV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/item/folder/red, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"SW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ash, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SZ" = ( -/obj/structure/table/reinforced, -/obj/item/kitchen/rollingpin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Tb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Tc" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Te" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ti" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Tk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Tl" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"To" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/storage/backpack/industrial, -/obj/item/storage/backpack/duffelbag/engineering, -/obj/item/storage/backpack/satchel/eng, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Ts" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Tx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/alien/resin/wall, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Tz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"TF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"TH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/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/neutral/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"TL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/solar_control{ - dir = 1; - id = "aftport"; - name = "Station Solar Control" - }, -/obj/structure/cable, -/obj/item/paper/guides/jobs/engi/solars, -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"TM" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/item/stack/ore/diamond, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"TP" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TQ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"TT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/storage/box/stockparts/basic, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"TV" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"TW" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"TX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ua" = ( -/obj/structure/safe/floor, -/obj/item/stack/sheet/bluespace_crystal{ - amount = 5 - }, -/obj/item/stack/sheet/mineral/diamond{ - amount = 10 - }, -/obj/item/weldingtool/abductor, -/obj/item/paper/fluff/ruins/tarkon/coupplans, -/obj/item/circuitboard/machine/bluespace_miner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Uc" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ud" = ( -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/obj/item/mod/module/springlock, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Uf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Uh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Un" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ur" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ut" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Uv" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Uw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Uz" = ( -/mob/living/simple_animal/hostile/alien/queen/large, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"UG" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"UI" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"UJ" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"UO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"US" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"UV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"UX" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"UZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Vc" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/closed{ - opacity = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Vi" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"Vj" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/engi, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/storage/backpack/duffelbag/blueshield, -/obj/item/storage/backpack/blueshield, -/obj/item/storage/backpack/satchel/blueshield, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vl" = ( -/mob/living/simple_animal/hostile/alien/sentinel, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Vn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/item/stack/cable_coil, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Vw" = ( -/obj/structure/sign/warning/no_smoking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Vx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Vy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VE" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"VH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/flippedtable{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VJ" = ( -/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/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/obj/effect/decal/cleanable/glass, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"VO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/north, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/flippedtable{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VS" = ( -/obj/machinery/atmospherics/miner/oxygen, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"VT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"VU" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"VV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Wa" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav) -"Wc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Wd" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrogen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/nitrogen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"We" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 4; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/goals, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Wh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Wn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/cryopod/tarkon/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Wp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/snack/teal, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Wq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Ws" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Wt" = ( -/turf/closed/mineral/random, -/area/awaymission) -"Wu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Ww" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/module_duplicator, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WB" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"WC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/mix_tank{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"WJ" = ( -/obj/item/stack/ore/diamond, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"WM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/machinery/oven/range, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"WO" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"WP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/poddoor/shutters{ - id = "ptatmos" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WQ" = ( -/obj/structure/alien/resin/wall, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/porthall) -"WW" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/mob/living/simple_animal/hostile/alien/drone, -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WY" = ( -/turf/open/space/basic, -/area/template_noop) -"Xb" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Xc" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 8 - }, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav) -"Xh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Xj" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Xn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Xq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Xr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Xw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/item/broken_bottle, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Xy" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Xz" = ( -/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/ruin/space/has_grav/port_tarkon/mining) -"XD" = ( -/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/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"XE" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XH" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"XI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"XN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/blood/gibs/up, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"XS" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"XV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"XZ" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav) -"Yb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Yc" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Yf" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/bed/nest, -/obj/effect/mob_spawn/corpse/human, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Yl" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav) -"Yp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Yr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Yt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/office, -/obj/item/cigbutt/cigarbutt, -/obj/effect/decal/remains/human, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Yu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Yy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/pen/edagger, -/obj/item/folder/blue, -/obj/item/taperecorder/empty, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"YB" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"YD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"YF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YI" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptcomms" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/comms) -"YT" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"YW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Za" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zc" = ( -/turf/closed/mineral/random/high_chance, -/area/solars/tarkon) -"Zi" = ( -/obj/structure/alien/weeds/node, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/sand, -/mob/living/simple_animal/hostile/alien/drone, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Zm" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Zp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/storage/belt/utility, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Zq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zr" = ( -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Zv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/window/left/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/nitrous_tank{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ZC" = ( -/obj/effect/decal/cleanable/dirt, -/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/tile/neutral/anticorner, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ZG" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZH" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/half, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ZJ" = ( -/turf/open/misc/asteroid/airless, -/area/awaymission) -"ZK" = ( -/obj/structure/alien/resin/wall, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZM" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZN" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZO" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZP" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ZU" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/structure/cable, -/obj/machinery/door/firedoor/solid, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ZV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/obj/modular_map_connector, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ZY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) - -(1,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(2,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -Wa -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -sv -sv -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(3,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -Wa -sv -WY -WY -WY -WY -sv -Wa -WY -WY -Wa -Wa -WY -WY -WY -WY -WY -Wa -Wa -sv -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -RM -WY -WY -WY -EW -WY -WY -WY -As -As -As -WY -RM -WY -WY -WY -WY -WY -WY -RM -WY -WY -"} -(4,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -Wa -sv -WY -WY -WY -RM -WY -Wa -Wa -sv -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RL -RL -PQ -RL -RL -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(5,1,1) = {" -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -Wa -Wa -Wa -WY -WY -Wa -Wa -sv -sv -sv -sv -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RL -fh -Xc -kG -RL -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(6,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -Wa -Wa -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -Wa -zo -zo -zo -Eb -zo -zo -zo -Wa -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -bq -Hq -FC -OI -RL -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -"} -(7,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -Wa -sv -sv -sv -sv -sv -sv -sv -sv -sv -sv -sv -sv -zo -zo -zo -zo -iv -zo -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -RL -uV -Hq -JT -RL -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(8,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -Wa -sv -sv -sv -sv -sv -sv -sv -sv -sv -sv -sv -zo -bT -zo -zo -zo -iI -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -RL -UG -Ow -XS -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -"} -(9,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -EQ -EQ -EQ -WU -WU -WU -WU -WU -WU -WU -WU -WU -ZP -ZP -ZP -uy -uy -uy -FY -FY -FY -Om -xt -xt -WP -Vw -xt -xt -xt -xt -xt -xt -xt -xt -xt -xt -sv -sv -zo -zo -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(10,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -EQ -EQ -EQ -Tc -oG -jg -hy -hy -hy -hy -hy -fa -IY -hy -hz -RB -ZP -ZP -uy -uy -RB -RB -RB -VN -gp -df -jB -og -lH -pA -yC -lH -Wd -nm -lH -rL -VS -lH -sv -sv -sv -zo -zo -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(11,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -EQ -EQ -Tc -eu -Tc -qe -WU -rW -hN -uJ -wt -uJ -uJ -hN -xs -pF -QD -RB -ZP -ZP -ZP -ZP -RF -QD -RF -PK -dC -dC -lp -lH -te -QH -lH -sj -jj -lH -oI -AF -lH -sv -jO -iB -zo -zo -zo -sv -sv -sv -sv -sv -sv -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(12,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -De -sK -Tc -Tc -xN -qe -vz -uJ -uJ -uJ -uJ -ic -mq -aV -ic -uJ -MX -RF -Ib -Ib -pj -Ib -RF -UZ -jc -gp -ki -CP -mo -lH -ts -NK -lH -xp -NK -lH -Bj -NK -lH -xt -GE -xt -zo -WY -zo -xt -sv -Wa -sv -sv -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(13,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -KS -yl -La -eu -Tc -Uw -jv -nP -nP -nP -nP -Vc -li -nP -nP -nP -nP -nP -nP -nP -nP -nP -nP -cX -dg -Et -xt -hi -CP -ki -WC -Bi -HU -mc -iG -ad -qk -kr -hM -iw -Fr -Gp -xt -xt -kS -cd -xt -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -RM -WY -WY -WY -WY -"} -(14,1,1) = {" -WY -WY -RM -WY -WY -WY -WY -zo -zo -EQ -EQ -NH -dt -at -Tc -Tc -Tc -as -nP -Ik -yz -kT -vy -vs -On -xu -ZO -ho -gu -Za -wQ -fV -mM -nP -lE -lE -Sf -xt -dl -CP -ki -ki -ki -ki -ki -ki -ki -ki -ki -ki -AA -gs -wW -Ld -sc -Ex -xB -xt -Wa -Wa -sv -Wa -sv -Wa -Wa -zo -WY -WY -WY -WY -WY -"} -(15,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -kp -Tc -LW -Tc -Tc -Tc -eu -qe -nP -Uf -SA -lF -EH -EH -eo -cW -ZO -QY -fG -EH -nh -EH -Ed -nP -Ht -Mi -uP -xt -An -jJ -zc -ki -ki -vO -vO -vO -vO -BK -vO -ki -bn -xt -Fs -xt -Ak -MU -eZ -xt -zo -sv -Wa -sv -sv -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(16,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -eu -bX -Ws -Oi -Oi -Oi -Oi -qe -nP -Uf -EH -UV -EH -EH -Id -Kw -ZO -KP -Ic -EH -nh -xY -vB -nP -lE -MS -uP -xt -pW -kt -ki -ki -vO -vO -SM -BK -SM -sB -ki -kd -lI -KM -UI -xt -xt -sa -xt -xt -zo -zo -Wa -sv -Wa -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(17,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -Xw -Tc -lr -Gl -Ez -Tc -Tc -MJ -qe -nP -Uf -EH -tZ -EH -EH -Id -Kw -ZO -Ww -Xh -EH -EH -Id -Kw -IB -lE -lE -BX -xt -IG -kt -ki -vO -ki -vO -BK -SM -SM -vO -ki -ki -Fh -Zq -hP -QW -Rm -FT -sL -zo -Wa -Vi -sv -sv -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(18,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -EQ -Cx -Tc -jF -Gf -gE -QL -RJ -ml -qe -nP -QX -EH -rt -rt -rt -Er -sr -ZO -Uf -Xh -EH -EH -Id -Kw -nP -lE -lE -uP -xt -fv -kt -ki -ki -ki -vO -SM -SM -BK -vO -ki -ki -Fh -DD -wh -Ob -xt -zC -xt -zo -Vi -zo -nx -Wa -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(19,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -SU -SU -SU -SU -SU -SU -SU -eL -SU -HW -nP -pE -EH -EH -EH -EH -RT -Sg -pY -ko -Qf -Qf -Qf -Az -tA -nP -xZ -lE -bK -xt -ki -Un -ki -ki -ki -vO -vO -vO -vO -vO -ki -ki -Fh -zT -Ti -eQ -xt -Ke -cd -zo -Vi -zo -zo -zo -tt -zo -zo -zo -WY -WY -WY -WY -WY -"} -(20,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -Wa -sv -sv -Wa -Wa -Wa -kf -yi -yi -FF -nP -CB -eF -Ns -eF -eF -eF -YF -ZO -TJ -Id -EH -EH -Az -bm -nP -lE -lE -uP -xt -OD -Un -Un -Un -Un -Un -vT -Un -Un -Un -ki -ki -jG -bS -lQ -qd -xt -WY -zo -zo -sv -FG -nx -nx -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(21,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -Wa -sv -Wa -sv -kf -vv -yi -FF -nP -Gv -EH -EH -EH -EH -EH -Su -ZO -yx -fJ -EH -EH -Az -Pf -HQ -tQ -lE -uP -xt -ki -ki -ki -Zw -Zm -Rg -oQ -PB -cv -Qu -uK -XH -Me -hf -hf -xt -xt -zo -zo -sv -Wa -Wa -zb -kA -kF -zo -zo -zo -WY -WY -WY -WY -WY -"} -(22,1,1) = {" -WY -WY -WY -RM -WY -zo -zo -Wa -Wa -Wa -Wa -Wa -sv -Wa -kf -VO -UO -mx -nP -xT -EH -EH -Zi -rG -EH -RH -ZO -cc -TT -EH -EH -rF -Ni -nP -tQ -lE -BX -xt -ST -Zv -ST -lH -NK -ub -lH -NK -lV -lH -NK -Qg -lH -xt -xt -xt -sv -sv -sv -sv -Wa -LJ -UJ -UJ -rg -av -MG -LJ -WY -WY -WY -WY -WY -"} -(23,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -sv -sv -sv -sv -sv -kf -sI -zB -FF -nP -oc -yG -yG -yG -EH -YI -RH -ZO -Uf -EH -EH -EH -EH -Sn -nP -tQ -lE -uP -xt -vO -pc -vO -lH -Rf -ld -lH -pU -xj -lH -Qk -fR -lH -sv -sv -sv -sv -Wa -Zc -LJ -rg -av -MG -UJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(24,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -jN -yi -wo -nP -RO -fC -iZ -Uc -ZK -Sp -lw -ZO -RI -Jz -sN -rH -Cw -aY -nP -tQ -Mi -uP -xt -vO -vO -vO -lH -GB -vp -lH -om -hR -lH -RY -MD -lH -sv -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -Xb -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(25,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -kf -cz -yi -FF -db -nS -Nh -pa -VU -WW -Xy -mi -rh -rh -rh -rh -rh -rh -rh -WU -tE -tQ -uP -xt -xt -xt -xt -xt -xt -xt -xt -xt -xt -bO -xt -xt -xt -GY -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -IL -LJ -Ft -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(26,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -kf -VO -pk -FF -db -FM -WQ -WQ -gR -RH -Xy -KE -Zp -gv -hw -lU -RU -pJ -wC -WU -lE -MS -Sj -WU -uC -ag -ag -iq -SL -KV -Iw -zm -UX -wa -cK -CI -Ck -Iw -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -gX -Mr -WB -LJ -WY -WY -WY -WY -WY -"} -(27,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -kf -zK -DG -FF -db -wl -pr -Gn -hD -bj -Xy -eE -HF -HF -HF -kJ -FU -FN -rh -WU -Qs -AN -hA -WU -Ki -vR -iq -iq -iq -iq -Iw -xL -MO -Jj -BS -CV -ZH -EN -zo -zo -zo -LJ -LJ -LJ -Bk -UJ -ye -LJ -gX -UJ -ye -LJ -WY -WY -WY -WY -WY -"} -(28,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -sv -kf -LH -KW -FF -db -QX -kx -WQ -WQ -Kj -Xy -rz -HF -fl -OT -bD -yY -ak -yY -VH -eA -CA -ep -Kg -Ki -MC -Ki -iq -iq -iq -Iw -zW -CV -zJ -BS -HS -BW -Qx -Qx -Qx -Qx -av -av -av -OR -UJ -uU -av -qi -UJ -uU -av -WY -WY -WY -WY -WY -"} -(29,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -kf -aI -yi -Tx -db -PM -Cf -OZ -Zi -jm -Xy -CX -VT -OT -dZ -yY -yY -kO -dT -ul -GM -GM -GM -kb -ro -MB -Ki -Ki -XE -aq -Iw -vj -Yb -VE -AM -IO -BW -JN -xP -xP -gn -jE -UJ -UJ -UJ -UJ -UJ -UJ -UJ -UJ -Mr -OS -WY -WY -WY -WY -WY -"} -(30,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -Wa -kf -mI -zK -FF -db -DO -wx -vQ -YB -Yf -Xy -rV -OT -pt -yY -yY -Lh -bi -Hn -Hn -di -TP -px -px -px -on -IE -Ki -Ki -Iw -Iw -Iw -Iw -Iw -ge -HS -TL -Qx -Qx -Qx -Qx -Gy -Gy -Gy -Hb -Mr -Al -Gy -Pl -UJ -fw -Gy -WY -WY -WY -WY -WY -"} -(31,1,1) = {" -WY -WY -RM -WY -WY -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -kf -yi -yi -Pc -db -QX -Ua -sF -tz -RH -Xy -TV -yF -yY -yY -Zn -oC -yj -uv -uv -uv -uv -uv -uv -ly -Kp -on -IE -Fb -dy -Fm -lA -hZ -Iw -aX -HS -my -Qx -zo -zo -zo -LJ -LJ -LJ -Ft -UJ -IL -LJ -gX -Mr -co -LJ -WY -WY -WY -WY -WY -"} -(32,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -Wa -sv -kf -vq -ja -FF -db -Te -Zi -EH -lj -hb -Xy -JF -lt -Rr -Lh -jz -es -uv -uv -hm -Vk -uv -lC -xl -ly -ly -Sv -qv -IE -GR -xP -ps -eD -Iw -iM -pH -FX -Qx -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -Yc -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(33,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -kf -zK -hB -FF -db -HY -Vl -jM -GU -ME -Xy -wC -rh -yY -bV -dX -Qp -uv -lS -lC -lC -uv -lC -lC -lC -ly -cT -Xq -gl -bz -Iw -lK -Ha -Iw -pf -VE -RX -Iw -zo -zo -zo -LJ -LJ -LJ -wV -UJ -ye -LJ -Qn -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(34,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -Wa -Wa -sv -Wa -kf -Cq -Cq -Cp -db -db -db -db -db -db -yd -kf -kf -NM -jz -rw -uv -uv -LA -lC -Jp -uv -lC -lC -ue -uv -uv -ww -qv -MB -Iw -Iw -Iw -Iw -Iw -Au -Iw -Iw -ZN -of -of -LJ -EJ -EJ -Qn -UJ -co -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(35,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -XN -iV -Tx -XJ -UO -gc -sM -OJ -eG -Eu -mE -BI -DS -yB -PZ -ef -oV -lC -ux -pv -uv -pS -lC -lC -lC -mC -Sv -zO -es -lx -LN -LN -ct -mu -Pz -LN -LN -qf -Wp -of -of -LJ -LJ -aF -Gy -Ho -LJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(36,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -kf -sI -zK -Tx -rP -Md -BJ -mZ -LI -Uh -BG -iW -Tl -qb -SW -Qo -uv -fp -yO -uD -dq -hr -tN -lC -lC -mB -uv -XI -Oo -Vz -ZM -LN -LN -tI -LN -Pz -LN -LN -Eq -LN -yv -of -of -LJ -LJ -LJ -LJ -LJ -aF -Gy -Ho -LJ -WY -WY -WY -WY -WY -"} -(37,1,1) = {" -WY -WY -WY -WY -RM -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -kf -aI -eY -sT -Nj -hh -VV -Oq -Lm -Gx -Nr -ek -dh -VP -dG -es -Fe -lC -lC -sm -lT -uv -Vj -lC -lC -lC -ZX -mH -ID -DA -JW -Pz -Pz -pM -Pz -Pz -GT -GT -GT -GT -LN -Jx -of -zo -zo -zo -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(38,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -kf -RP -up -tp -kf -kf -kf -SK -Gx -dB -kf -kf -kf -yt -LG -es -uv -uv -Jl -lC -FB -uv -lC -lC -rC -uv -uv -Sv -qL -fO -hj -hj -hj -hj -hj -Ut -ZN -OM -OM -Sq -Gk -OM -OM -YK -YK -YK -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(39,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -kf -yi -UO -FF -kf -nZ -jZ -jZ -bt -jZ -SX -ug -kf -Ki -mH -kb -BV -uv -tT -lC -lC -uv -lC -lC -lC -ly -xc -oN -qL -fO -OB -Gd -kI -oq -hj -kk -oL -OM -yy -EY -wY -DZ -zL -pw -We -YK -YK -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(40,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -kf -aI -cz -FF -kf -tf -Fl -mt -Cm -by -Nz -kU -Se -Ki -TH -LG -sn -uv -uv -To -rk -uv -lC -aw -ly -ly -Sv -ID -ZC -WO -Ek -Ek -Ek -pd -hj -oL -oL -OM -Ox -fL -dw -Af -Af -Af -Ie -gk -ke -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(41,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -sv -Wa -kf -cH -up -FF -cV -cV -cV -cV -cV -cV -cV -cV -cV -Ki -tW -GW -kc -MB -uv -uv -uv -uv -uv -uv -ly -Lh -oN -qL -KA -KA -sl -sl -mO -pd -hj -mr -am -OM -CW -fL -Af -Af -Af -Af -Af -Af -cr -YK -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(42,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -kf -zK -zK -cY -cV -GF -Ls -wc -KJ -fI -Bp -vN -Zr -Ki -Ki -tH -GW -Ci -ff -ro -Mp -CG -ro -br -ro -oN -to -qL -fO -kN -sl -Vg -mO -SZ -hj -OG -Xr -OM -vo -fL -Af -Af -Af -Af -Af -uN -oS -Kc -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(43,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -sv -kf -JB -KQ -FF -cV -EV -IW -HX -gd -gd -zZ -Nq -RC -Ki -ai -tH -tH -ik -xU -eg -zO -zO -ID -xU -xU -xU -xU -ZC -tk -IU -WM -sl -iy -FS -hj -YT -YT -OM -vG -fL -Ch -Ch -Ch -Yy -kW -Ch -tn -FR -YK -YK -zo -zo -WY -WY -WY -WY -WY -"} -(44,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -Wa -kf -vU -yi -FF -iA -xi -xi -xi -Ae -Ae -Ae -yS -nu -Ki -dG -Ef -Ki -jP -Ki -Kp -lb -Yr -SI -gJ -gJ -gJ -Px -lR -gJ -gJ -hj -po -iy -KZ -hj -Rp -Dk -OM -kq -Af -Tk -Af -Yt -mK -gW -PE -Tk -oS -hL -YK -zo -zo -WY -WY -WY -WY -WY -"} -(45,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -kf -SE -mv -BM -Lr -Zy -ga -Zy -gd -gd -Zy -IH -RC -Ki -Kl -RK -Wn -re -Ki -Ki -fd -US -nb -gJ -Uv -Uv -KO -yn -Uv -GS -hj -nc -iy -Ju -hj -rZ -nL -OM -ut -OF -OF -ry -OF -EE -SV -OF -TX -an -JX -YK -zo -zo -WY -WY -WY -WY -WY -"} -(46,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -kf -yi -aI -NL -cV -EV -Mt -gd -gd -gd -zZ -aS -ah -Ki -vF -nQ -EA -cA -Jq -Ki -DN -Bg -Hg -gJ -Uv -Gs -KO -Ly -Ly -Uv -ft -sl -td -Ju -hj -YT -tC -QC -QC -QC -QC -ZG -ZG -ZG -ZG -ZG -ZG -ZG -ZG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(47,1,1) = {" -WY -WY -WY -RM -WY -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -kf -yi -cH -NL -cV -ku -EB -hE -rv -vl -JY -bF -ba -Ki -Mz -jA -vd -QP -Jq -Ki -Bg -fU -SP -Xj -yn -yn -go -Nt -Ly -yn -Tz -sl -FZ -dW -hj -ru -gP -TF -JL -Qy -QB -ng -nF -Sb -Jm -Sb -Sb -Sb -mG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(48,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -kf -WE -WE -VJ -cV -cV -cV -cV -cV -cV -cV -cV -cV -Ki -AP -AP -AP -AP -AP -AP -JE -XD -Hg -bA -yn -yn -gb -iJ -Ly -Rh -hj -Bn -hj -hj -hj -vm -jV -Wq -xS -JI -Lf -ng -MV -Dv -Dv -Dv -Ur -gN -md -cu -zo -zo -WY -WY -WY -WY -WY -"} -(49,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -yi -GD -vc -kf -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -vC -HB -dA -eB -Nw -bg -AG -cU -vn -gJ -Uv -yn -yn -yn -Vm -Gt -hj -uR -uR -hV -hj -Wu -kD -kD -kD -Ce -xO -Ih -qH -cQ -bx -bx -rB -ng -oE -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(50,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -mh -PF -Ks -kf -Wa -ta -ta -ta -ta -ta -Wa -sv -Wa -vC -LY -zt -Hf -Yu -gD -Bg -Cv -vn -gJ -aZ -Uv -QT -QT -Uv -rd -hj -uR -uR -hV -hj -fB -hQ -fB -fB -Rx -vW -Pq -Gu -EO -bx -bx -dP -rK -RE -qh -zo -zo -WY -WY -WY -WY -WY -"} -(51,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -Wa -Wa -sv -kf -Bz -jZ -jZ -kf -ta -ta -iU -rE -Dc -ta -ta -Wa -sv -vC -qQ -Hk -Hf -Ud -gD -iT -US -mT -gJ -gJ -gJ -gJ -gJ -gJ -gJ -hj -hj -hj -hj -hj -Yp -vA -th -fB -LD -Lf -ng -ZV -bx -PR -bx -Io -cE -hu -lX -zo -zo -WY -WY -WY -WY -WY -"} -(52,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -sv -Wa -ta -ta -DQ -ta -ta -ta -ta -ha -DK -Uz -iU -DK -ta -Wa -Wa -vC -bY -zt -lW -aU -gD -Bg -Bg -MF -Cv -Bg -Bg -Cv -Bg -Bg -Bg -zp -AD -AD -AD -YW -sd -MF -Vu -fB -LD -dE -ng -ui -bx -bx -bx -ar -cE -EO -lX -zo -Eb -WY -WY -WY -WY -WY -"} -(53,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -sv -sv -Wa -ta -ed -ed -DK -un -uw -ta -ta -rE -ed -DK -iU -ta -Wa -Wa -vC -xH -Le -lW -pT -SG -Cv -cU -MF -Bg -Bg -Bg -Ps -Bg -Bg -Cv -zp -yD -Bg -Bg -Bg -Ps -MF -Da -QA -Qh -pl -ng -SQ -Pt -bx -gT -ar -cE -bx -lX -zo -zo -WY -WY -WY -WY -WY -"} -(54,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -Wa -Wa -ta -ta -gt -pD -ta -ta -ta -ta -Dc -ed -oe -ed -ta -sv -Wa -vC -ia -zt -lW -DP -vC -cn -Bg -MF -CY -qS -MF -MF -MF -ka -eK -fT -zM -Mu -zM -zM -zM -zM -MY -fB -PS -oy -ng -BF -bx -EO -bx -xC -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(55,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -sv -Wa -Wa -ta -ta -ed -ed -DK -LS -ta -ta -ta -rE -ed -ta -Wa -sv -vC -PT -zt -lW -Yu -vC -TW -TW -TW -eI -eI -eI -Kk -eI -eI -eI -Hy -yU -mV -yU -yU -ZU -yU -Hy -Hy -Hy -Hy -ng -BF -bx -bx -bx -ar -ym -KL -Ix -zo -zo -WY -WY -no -RM -WY -"} -(56,1,1) = {" -WY -RM -WY -WY -WY -zo -zo -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -ta -ed -LS -oe -ed -Kf -oe -ta -ta -ed -ta -sv -sv -vC -jY -zt -lW -nk -ls -lW -EC -vC -Oj -tY -Jv -tc -Jv -Im -CS -Hy -in -Cc -Cc -op -wZ -le -hl -Sk -Cc -rD -ng -BF -cQ -bx -JM -Os -aP -aP -ZG -zo -zo -WY -WY -RM -WY -WY -"} -(57,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -sv -Wa -sv -sv -sv -Wa -Wa -ta -ta -ta -ta -ta -ed -cs -mD -ta -DK -ta -Wa -sv -vC -NX -zt -lW -Yu -gD -JQ -NN -vC -Vx -Ji -Cy -El -tM -dv -Ij -Hy -Rc -Vn -nt -nt -Rq -nt -nt -Es -Nl -sq -ng -Gb -Dv -Dv -Dv -CM -Sb -Tb -cu -zo -zo -WY -WY -WY -WY -WY -"} -(58,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -sv -ta -DK -ed -LS -oK -gt -ta -ta -ed -ta -Wa -Wa -vC -Fk -Oa -lW -cD -vC -vC -vC -vC -Jv -Jv -Jv -YC -Jv -Jv -Jv -Hy -Sa -Fq -LQ -LQ -os -LQ -Xz -Xz -dR -eM -ng -Ts -dk -uM -iC -gN -gN -jU -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(59,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -sv -sv -Wa -sv -Wa -ta -LS -iU -ta -ta -ta -ta -fK -TM -ta -Wa -sv -vC -ph -zt -lW -Yu -gD -kR -kX -vC -xq -ov -ve -sw -lD -yA -ZY -Hy -hS -wm -cq -jo -TQ -CZ -Bo -Vy -gS -IK -ng -ng -ng -ng -ng -ng -ng -ng -ZG -zo -vE -WY -WY -WY -WY -WY -"} -(60,1,1) = {" -WY -WY -WY -WY -WY -WY -uo -zo -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -ta -ta -ed -ed -ed -ta -rE -ow -Lg -ta -Wa -sv -vC -nW -Nx -Wh -CE -hY -IF -EC -vC -sD -JO -Jv -pX -Jv -Pa -Hi -zf -zf -XV -KB -CL -XV -zf -zf -zf -zf -zf -Hy -Wa -Wa -sv -sv -Wa -Wa -Wa -zo -vE -FE -WY -WY -WY -WY -WY -"} -(61,1,1) = {" -WY -WY -WY -WY -WY -WY -FE -vE -zo -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -ta -ta -Kf -DK -ta -ed -WJ -Yl -ta -Wa -sv -vC -vC -vC -vC -vC -vC -vC -vC -vC -Sw -Sw -Sw -Sw -Sw -Sw -Sw -zf -Ng -Cc -BU -Kr -YD -Jw -Bq -Wc -Wc -bH -sv -sv -sv -Wa -Wa -Wa -Wa -zo -zo -vE -WY -WY -WY -WY -WY -WY -"} -(62,1,1) = {" -WY -WY -WY -WY -ZJ -WY -FE -zo -zo -zo -Wa -sv -Wa -sv -sv -sv -Wa -Wa -ta -ed -mD -oe -ed -ed -ta -ta -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -XZ -Wa -bH -Lp -Es -Zl -qF -gy -iu -Cs -qr -HH -ip -ce -sv -Wa -sv -Wa -Wa -zo -zo -vE -FE -WY -WY -WY -WY -WY -WY -"} -(63,1,1) = {" -WY -WY -WY -jn -Wt -WY -FE -WY -vE -zo -zo -Wa -Wa -sv -Wa -sv -Wa -Wa -ta -ta -ha -gt -WJ -ta -ta -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -XZ -Wa -bH -lZ -kh -tV -zd -ud -Xn -bH -Ba -ot -bH -zo -sv -Wa -Wa -Wa -zo -zo -vE -FE -WY -WY -WY -WY -WY -WY -WY -"} -(64,1,1) = {" -WY -WY -WY -jn -jn -FE -FE -qD -FE -vE -zo -zo -zo -Wa -sv -Wa -Wa -sv -sv -ta -ta -ta -ta -ta -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -Wa -XZ -bH -KG -bH -gA -gA -bH -KG -bH -bH -bH -bH -zo -sv -sv -Wa -zo -zo -vE -FE -WY -WY -WY -WY -WY -WY -WY -WY -"} -(65,1,1) = {" -WY -WY -Wt -jn -jn -Wt -FE -WY -WY -WY -WY -zo -vE -zo -zo -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -zo -zo -zo -zo -zo -zo -zo -dr -zo -zo -zo -zo -zo -zo -zo -Wa -zo -zo -vE -vE -FE -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(66,1,1) = {" -WY -WY -jn -jn -Wt -jn -FE -FE -FE -FE -FE -FE -FE -vE -zo -zo -zo -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -vE -FE -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -"} -(67,1,1) = {" -WY -ZJ -Wt -jn -jn -jn -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(68,1,1) = {" -WY -WY -WY -Wt -jn -Wt -ZJ -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(69,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(70,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(71,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm deleted file mode 100644 index a7294b23f63..00000000000 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm +++ /dev/null @@ -1,12943 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ah" = ( -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ai" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ak" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"am" = ( -/obj/structure/mop_bucket, -/obj/item/mop, -/obj/item/reagent_containers/cup/bucket, -/obj/item/soap/nanotrasen, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"an" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"ap" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"aq" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"as" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"at" = ( -/obj/structure/chair/sofa/corp/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"av" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aF" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/storage) -"aS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"aU" = ( -/obj/structure/table/reinforced, -/obj/item/card/id/away/tarkon{ - pixel_y = -6 - }, -/obj/item/card/id/away/tarkon, -/obj/item/card/id/away/tarkon{ - pixel_y = 6 - }, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"aX" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"aY" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"aZ" = ( -/obj/machinery/biogenerator, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"ba" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bg" = ( -/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/security/old, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"bi" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bj" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"bm" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"bn" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = -24; - req_one_access = list("tarkon") - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -8; - pixel_y = -36; - req_one_access = list("tarkon") - }, -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"br" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bt" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"by" = ( -/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/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/solar_assembly, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"bz" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"bA" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"bD" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"bF" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bH" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"bK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"bO" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"bY" = ( -/obj/structure/rack/gunrack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"bZ" = ( -/obj/item/bonesetter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"cc" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/protolathe/offstation, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"cd" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ce" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ck" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"cn" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"co" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"cq" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"cr" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/folder, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"ct" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"cu" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"cv" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"cA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"cE" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"cJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"cK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"cQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"cT" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"cV" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/trauma) -"db" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"df" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptatmos"; - name = "shutter controls"; - pixel_x = -39; - pixel_y = -10 - }, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"di" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dk" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/holosign_creator/janibarrier, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"dl" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/empty_sleeper{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"dq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"dr" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 16; - name = "Port Tarkon"; - roundstart_template = /datum/map_template/shuttle/ruin/tarkon_driver; - shuttle_id = "port_tarkon"; - width = 14 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"dt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/sofa/corp{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"dw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"dy" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"dA" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"dC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dE" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"dN" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"dR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"dT" = ( -/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/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dW" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"dX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dZ" = ( -/obj/machinery/autolathe, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ef" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"eg" = ( -/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/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"eo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"eu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"eB" = ( -/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/red/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"eD" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"eE" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"eG" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eI" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"eM" = ( -/obj/structure/closet, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"eQ" = ( -/obj/machinery/computer/atmos_control/tarkon/incinerator{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"eT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"eZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fa" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/computer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ff" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"fh" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/alien/egg/burst, -/obj/effect/mob_spawn/corpse/facehugger, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fk" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"fp" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/closet, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/chief_engineer, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ft" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"fv" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fw" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"fB" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"fG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"fI" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/medbeam/afad, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"fJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/loading_area, -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"fL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"fP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"fR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ga" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"gb" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ge" = ( -/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/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"gk" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gn" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"go" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gp" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gs" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_interior, -/obj/machinery/airlock_controller/incinerator_tarkon{ - pixel_x = 40; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gt" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"gu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"gv" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/empty, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"gA" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/door/firedoor/heavy/closed, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/mining) -"gD" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/secoff) -"gE" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"gH" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gJ" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/garden) -"gN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"gP" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/folder, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"gS" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"gW" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - name = "Broken Computer" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"hf" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hi" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/glass, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hj" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hl" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"hm" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/cargo/tech/skyrat/utility, -/obj/item/clothing/under/rank/cargo/tech/skyrat/gorka, -/obj/item/storage/backpack/duffelbag/explorer, -/obj/item/storage/backpack/explorer, -/obj/item/storage/backpack/satchel/explorer, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage"; - state_open = 1 - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hu" = ( -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"hw" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"hA" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hE" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"hH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptobservatory"; - name = "shutter controls"; - pixel_y = -32 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"hL" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"hM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hP" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hQ" = ( -/obj/machinery/door/airlock/mining, -/obj/machinery/door/firedoor/solid, -/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/ruin/space/has_grav/port_tarkon/cargo) -"hR" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hS" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"hV" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hY" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"hZ" = ( -/obj/machinery/power/smes/engineering{ - charge = 0; - name = "backup power storage unit" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"ia" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/maint_kit, -/obj/item/stack/sheet/iron/twenty, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"id" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"if" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ih" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/mob/living/basic/carp, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ik" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"in" = ( -/obj/item/circuitboard/machine/ore_silo, -/obj/structure/frame/machine, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ip" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"iu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iv" = ( -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iw" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 6 - }, -/obj/structure/closet/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/suit/utility/radiation, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"iA" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"iB" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"iG" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iJ" = ( -/obj/machinery/vending/hydroseeds, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"iM" = ( -/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/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"iT" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"iU" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"iW" = ( -/mob/living/basic/carp/mega, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jn" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission) -"jo" = ( -/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/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"jv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptafthall"; - name = "shutter controls"; - pixel_x = -26 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"jz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jA" = ( -/obj/machinery/atmospherics/components/binary/pump, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jE" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jF" = ( -/obj/structure/chair/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"jG" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jM" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jN" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"jO" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"jP" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"jT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/empty_sleeper, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"jU" = ( -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"jV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"jW" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"jY" = ( -/obj/structure/rack, -/obj/item/clothing/head/helmet, -/obj/item/clothing/head/helmet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"jZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ka" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"kd" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ke" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/vaulter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kf" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kh" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/dim/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"kk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ko" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"kp" = ( -/obj/item/tape/ruins/tarkon/celebration, -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"kq" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/vending/cigarette, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kr" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ku" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"kx" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kA" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kD" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"kF" = ( -/obj/structure/fence/corner, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kI" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"kJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"kO" = ( -/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/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"kS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"kT" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"kU" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kW" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/megaphone, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kX" = ( -/obj/structure/bed/maint, -/obj/structure/safe/floor, -/obj/item/mod/module/armor_booster/retractplates{ - desc = "A complex set of actuators, micro-seals and a simple guide on how to install it, This... \"Modification\" allows the plating around the joints to retract, giving minor protection and a bit better mobility. There also seems to be a small, wireless microphone... how odd." - }, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ld" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"le" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"lg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"li" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"lj" = ( -/obj/machinery/door/window/brigdoor/left/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lp" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/tarkon/atmosincident, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/chair/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"ls" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lt" = ( -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lw" = ( -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/structure/table/rolling, -/obj/item/clothing/gloves/latex, -/obj/item/circular_saw, -/obj/item/scalpel, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"lx" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ly" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon) -"lA" = ( -/obj/structure/closet/crate/radiation, -/obj/structure/cable, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lD" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm4"; - name = "Couples Suite" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"lF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"lH" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lI" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lK" = ( -/obj/structure/closet/firecloset/full, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lQ" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lR" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"lS" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/storage/backpack/medic, -/obj/item/storage/backpack/satchel/med, -/obj/item/storage/backpack/satchel/chem, -/obj/item/storage/backpack/satchel/vir, -/obj/item/storage/backpack/virology, -/obj/item/storage/backpack/duffelbag/virology, -/obj/item/storage/backpack/duffelbag/chemistry, -/obj/item/storage/backpack/chemistry, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lT" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lU" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lV" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/brown/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lZ" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"mc" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/machinery/computer/atmos_control/tarkon/nitrogen_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"md" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"mi" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ml" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"mo" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"mr" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"mt" = ( -/obj/structure/closet/crate, -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mu" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"my" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"mC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"mG" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"mK" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"mO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"mT" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"mV" = ( -/obj/machinery/door/window/right/directional/east, -/obj/machinery/door/window/right/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"nb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"nc" = ( -/obj/structure/sink/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ng" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"nk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nm" = ( -/obj/machinery/atmospherics/miner/nitrogen, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"no" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"nu" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"nx" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"nF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/engineering, -/obj/item/stack/sheet/plasteel/fifty, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/mineral/plasma/thirty, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"nG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"nL" = ( -/obj/item/stack/tile/carpet/neon/simple/purple/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"nN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"nP" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"nQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"nS" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nW" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nY" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"nZ" = ( -/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/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/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"oc" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/frame/computer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"oe" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"of" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptafthall" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"og" = ( -/obj/structure/table/reinforced, -/obj/item/pipe_dispenser, -/obj/item/storage/belt/utility/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"om" = ( -/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/carbon_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"on" = ( -/obj/item/cautery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"oq" = ( -/obj/machinery/processor, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"os" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ot" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ov" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"oy" = ( -/obj/structure/safe/floor, -/obj/structure/table, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"oC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oE" = ( -/obj/machinery/button/door{ - id = "tarkonouter"; - name = "Exterior Shutter Control"; - pixel_x = -6 - }, -/obj/machinery/button/door{ - id = "tarkoninner"; - name = "Inner Shutter Control"; - pixel_x = 6 - }, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oL" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"oN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oQ" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/carbon_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oS" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"oW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon/med{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pa" = ( -/obj/machinery/door/airlock/research/glass, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pc" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pd" = ( -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"pf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ph" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pj" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"pl" = ( -/obj/structure/table, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"po" = ( -/obj/structure/sink/kitchen/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ps" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"pt" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pu" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"pv" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pw" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"pz" = ( -/obj/machinery/door/firedoor/solid, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/garden) -"pA" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pE" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"pH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"pJ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pM" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"pR" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"pT" = ( -/obj/structure/chair/office, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon/sec, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pW" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pX" = ( -/obj/machinery/vending/clothing, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"pY" = ( -/obj/machinery/door/airlock/research/glass, -/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/tarkon/general, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"qb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"qh" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qi" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"qk" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/oxygen_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/structure/closet/crate/secure/science, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qr" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qv" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qw" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qD" = ( -/obj/structure/lattice, -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"qF" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qH" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qL" = ( -/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/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"qS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"qT" = ( -/mob/living/basic/carp, -/obj/item/stack/rods, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"rc" = ( -/obj/item/scalpel, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"rg" = ( -/obj/effect/turf_decal/stripes/asteroid/corner, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"rh" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ro" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"rq" = ( -/obj/item/stack/rods, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"ru" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"rv" = ( -/obj/structure/table, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/surgery, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"rw" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ry" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"rz" = ( -/obj/structure/rack, -/obj/item/assembly/igniter, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"rD" = ( -/obj/structure/closet, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/mask/gas/explorer, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"rF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"rG" = ( -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"rH" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"rK" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"rL" = ( -/obj/effect/turf_decal/vg_decals/atmos/oxygen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/oxygen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"rV" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon/engi, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"rZ" = ( -/obj/item/stack/tile/carpet/neon/simple/teal/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"sa" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/air_sensor/tarkon/incinerator_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sd" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"sf" = ( -/obj/structure/cable, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"sm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"sn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"sq" = ( -/obj/structure/closet, -/obj/item/pickaxe/silver, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/glasses/meson, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"sr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"sv" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav) -"sw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"sD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sI" = ( -/obj/effect/turf_decal/delivery/red, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sK" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"sL" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sM" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sN" = ( -/obj/structure/frame/computer{ - dir = 8 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"sX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"tc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/north, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"td" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"te" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"th" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"tk" = ( -/obj/structure/table/reinforced, -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"to" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"tq" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ts" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/purple/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"tt" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"tz" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"tA" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/item/clothing/gloves/latex, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"tC" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"tE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tH" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"tM" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm2"; - name = "Private Dorm 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"tQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tT" = ( -/obj/structure/closet, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"tV" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"tY" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "ptdorm1"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"ub" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ud" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"uf" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ug" = ( -/obj/structure/closet/firecloset, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ui" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"uk" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ul" = ( -/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/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"un" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"uo" = ( -/mob/living/basic/carp/mega, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"ut" = ( -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon) -"ux" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uC" = ( -/obj/structure/closet/crate/bin{ - pixel_y = 8 - }, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/item/reagent_containers/cup/rag, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"uD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/margherita, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/margherita, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"uK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"uM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"uN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uR" = ( -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"uS" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/secoff) -"uU" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"vd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ve" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm3"; - name = "Private Dorm 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"vj" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"vl" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/structure/closet/crate/freezer/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vm" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"vo" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/cell_charger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vp" = ( -/obj/machinery/atmospherics/miner/n2o, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vs" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"vz" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"vA" = ( -/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/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"vB" = ( -/obj/structure/curtain, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"vC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/secoff) -"vF" = ( -/obj/item/gps/computer/space{ - gpstag = "Port Tarkon - Defcon 4" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"vN" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vO" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vQ" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"vR" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"wa" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"wc" = ( -/obj/structure/table, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"wh" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wl" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"wt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ww" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"wx" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wC" = ( -/obj/effect/turf_decal/tile/yellow/full, -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"wK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"wQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"wV" = ( -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"wW" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_tarkon{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"wZ" = ( -/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/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"xc" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xd" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"xi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"xj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xp" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/green/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"xt" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xu" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"xB" = ( -/obj/machinery/igniter/incinerator_tarkon, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 5 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xH" = ( -/obj/machinery/ammo_workbench/unlocked, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"xL" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"xN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"xO" = ( -/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/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"xP" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"xR" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"xT" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"xU" = ( -/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/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"xZ" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"yd" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ye" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"yh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"yi" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"yj" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"ym" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"yp" = ( -/obj/structure/trash_pile, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"yt" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"yv" = ( -/obj/machinery/vending/coffee, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"yx" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/mechfab, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"yy" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"yz" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"yA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"yC" = ( -/obj/machinery/air_sensor/tarkon/mix_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"yD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"yE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"yF" = ( -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"yG" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"yI" = ( -/obj/item/hemostat, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"yO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"yS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"yU" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/mining) -"yY" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"zb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/fence/door/opened{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"zc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zd" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zf" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"zm" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zo" = ( -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"zp" = ( -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"zy" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zC" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zL" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"zM" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zT" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/holosign_creator/atmos, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"zW" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zZ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ae" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ak" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Al" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"An" = ( -/obj/structure/fireaxecabinet/directional/north, -/obj/machinery/pipedispenser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ao" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/tarkon/defcon4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"At" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Au" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Ax" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp/mega, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"AA" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AF" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"AL" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav/port_tarkon/porthall) -"AM" = ( -/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/delivery/white, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"AP" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"AT" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"AZ" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ba" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bi" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bj" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bk" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Bn" = ( -/obj/machinery/door/airlock/public{ - name = "Kitchen Freezer" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Bo" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/order_console/mining{ - forced_express = 1; - express_cost_multiplier = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bp" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/circuitboard/machine/sleeper, -/obj/structure/closet/secure_closet/medical1, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Bq" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"BF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"BI" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/lattice, -/obj/item/stack/rods, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"BS" = ( -/obj/effect/turf_decal/delivery/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BU" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"BV" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"BW" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ce" = ( -/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/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Cf" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ci" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ck" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Cm" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cs" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ct" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav/port_tarkon/developement) -"Cw" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/gold{ - amount = 25 - }, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Cx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Cy" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm1"; - name = "Private Dorm 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CB" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"CC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/empty_sleeper{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"CE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/red/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"CG" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CL" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"CM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"CP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"CS" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/coin, -/obj/item/coin, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"CX" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/rack, -/obj/item/screwdriver, -/obj/item/wrench, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"CY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Da" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Dk" = ( -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = -8 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/stack/spacecash/c20{ - pixel_y = 10 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = 5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -4; - pixel_y = -5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -6; - pixel_y = 12 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/mod/module/visor/rave, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Dn" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Dv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"DA" = ( -/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/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DD" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"DI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"DK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"DM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"DN" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"DO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DP" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/red/half, -/obj/item/paper/fluff/ruins/tarkon/detain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"DS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DY" = ( -/obj/machinery/firealarm/directional/east, -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav/port_tarkon/porthall) -"DZ" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Eb" = ( -/mob/living/basic/carp, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"Ed" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"El" = ( -/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/ruin/space/has_grav/port_tarkon/dorms) -"Eq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Er" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Et" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Eu" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ex" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ez" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"EA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"EB" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"EE" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "ptcomms"; - name = "shutter controls" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"EN" = ( -/obj/structure/sign/warning/deathsposal, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"EQ" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptobservatory" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/observ) -"EV" = ( -/obj/structure/curtain, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EW" = ( -/mob/living/basic/carp/mega, -/turf/open/space/basic, -/area/template_noop) -"EY" = ( -/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/blue{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Fb" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Fe" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Fh" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fk" = ( -/obj/structure/table/reinforced, -/obj/item/storage/pouch/ammo, -/obj/item/storage/pouch/ammo, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Fl" = ( -/obj/item/electronics/apc, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airalarm, -/obj/item/electronics/airalarm, -/obj/structure/closet/crate/engineering/electrical{ - name = "electronics crate" - }, -/obj/item/electronics/tracker, -/obj/item/stack/cable_coil, -/obj/item/clothing/gloves/color/yellow, -/obj/item/circuitboard/computer/atmos_control/tarkon/carbon_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/mix_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/nitrogen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/incinerator, -/obj/item/circuitboard/computer/atmos_control/tarkon/oxygen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/plasma_tank, -/obj/item/circuitboard/computer/tarkon_driver, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Fm" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Fq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Fr" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fs" = ( -/obj/machinery/airlock_sensor/incinerator_tarkon{ - pixel_x = 6; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ft" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"FB" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"FC" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"FE" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/template_noop) -"FG" = ( -/obj/item/shovel, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"FK" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/utility/hardhat/orange, -/obj/item/clothing/gloves/color/black, -/obj/item/storage/belt/utility, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"FN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"FR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"FS" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/enzyme, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"FT" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"FU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FX" = ( -/obj/structure/table, -/obj/item/multitool, -/obj/item/storage/belt/utility/full, -/obj/item/paper/fluff/ruins/tarkon/designdoc, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"FZ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gd" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gf" = ( -/obj/structure/table/wood, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gk" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/comms) -"Gl" = ( -/obj/structure/table/wood, -/obj/item/paper/crumpled/fluff/tarkon, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gp" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Gs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gt" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gv" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/reagentgrinder, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Gx" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Gy" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"GB" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/nitrous_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GD" = ( -/mob/living/basic/carp/mega, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"GE" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GF" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"GL" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/closed/mineral/random, -/area/ruin/space/has_grav/port_tarkon/porthall) -"GM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GR" = ( -/obj/machinery/door/airlock/engineering{ - name = "Backup Generator Room" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"GS" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/small/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"GU" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"GW" = ( -/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/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GY" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ha" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Hb" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Hi" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/item/clothing/neck/mantle, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Hj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Hk" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hn" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ho" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hq" = ( -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Hy" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"HB" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"HF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"HH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"HP" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"HQ" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/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/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"HS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"HU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"HW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"HX" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"HY" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ic" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Id" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ie" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"If" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Ih" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid/closed, -/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/ruin/space/has_grav/port_tarkon/storage) -"Ij" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Ik" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Im" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "ptdorm2"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Io" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Iw" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"Ix" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ID" = ( -/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/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IE" = ( -/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/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"IG" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/item/circuitboard/machine/rtg, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"IH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IK" = ( -/obj/structure/closet, -/obj/item/pickaxe/mini, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/mask/gas/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/item/storage/belt/mining, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"IL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"IO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"IQ" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IU" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"IW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ji" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jj" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Jl" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/security/skyrat/utility/redsec, -/obj/item/clothing/under/rank/security/skyrat/utility, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/storage/backpack/duffelbag/sec, -/obj/item/storage/backpack/duffelbag/sec/redsec, -/obj/item/storage/backpack/satchel/sec/redsec, -/obj/item/storage/backpack/security/redsec, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Jp" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jq" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ju" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Jv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jw" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Jx" = ( -/obj/machinery/vending/cola, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Jz" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/destructive_analyzer, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"JE" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"JF" = ( -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"JI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JL" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/west, -/obj/item/paper_bin, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JN" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"JO" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/random, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "ptdorm3"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"JQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"JW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"JX" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"JY" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/closet/secure_closet/medical2{ - req_access = list("medical") - }, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Kc" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/driverpitch, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ke" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ki" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kj" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Kk" = ( -/obj/machinery/door/airlock/wood/glass, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Kl" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ks" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KA" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KB" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/mining/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"KE" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"KG" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"KJ" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/defibrillator, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"KL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"KM" = ( -/obj/machinery/button/ignition/incinerator/tarkon, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"KO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"KP" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/stockparts/basic, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"KQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KS" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"KV" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/east{ - opacity = 1 - }, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/mob/living/basic/carp, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"KZ" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"La" = ( -/obj/structure/chair/sofa/corp{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ld" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_exterior, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Le" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Lf" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Lo" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Lp" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Lr" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ls" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"LA" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/rnd/scientist/skyrat/utility, -/obj/item/clothing/under/rank/rnd/roboticist/skyrat/sleek, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/storage/backpack/duffelbag/science, -/obj/item/storage/backpack/duffelbag/science/robo, -/obj/item/storage/backpack/satchel/science, -/obj/item/storage/backpack/satchel/science/robo, -/obj/item/storage/backpack/science, -/obj/item/storage/backpack/science/robo, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"LC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/secure/engineering, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/item/construction/rcd/arcd/mattermanipulator, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"LD" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"LG" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"LH" = ( -/obj/machinery/firealarm/directional/north, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"LJ" = ( -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"LN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"LQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"LS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"LW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"LY" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/pen/fountain, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Me" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Mp" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Mr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"Mt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Mz" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MB" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MC" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MD" = ( -/obj/machinery/atmospherics/miner/plasma, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ME" = ( -/obj/effect/turf_decal/tile/purple/anticorner, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"MF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"MG" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"MJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"MO" = ( -/obj/structure/safe/floor, -/obj/item/areaeditor/blueprints/tarkon, -/obj/item/tape/ruins/tarkon/safe, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"MP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/hydroponics/soil, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"MS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"MU" = ( -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"MV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"MY" = ( -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Nc" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ng" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ni" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Nj" = ( -/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/solid/closed, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Nq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Nr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nt" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Nw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nx" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/flash, -/obj/item/assembly/flash, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nz" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"NC" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NH" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"NK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/dark/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"NN" = ( -/obj/structure/bed/maint, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"NX" = ( -/obj/structure/rack, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Oa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Ob" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Oi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Oj" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp, -/obj/effect/spawner/random/clothing/beret_or_rabbitears, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"On" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Oo" = ( -/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/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Os" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ox" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/dice, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"OB" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"OD" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"OG" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"OI" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"OM" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/comms) -"OR" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"OS" = ( -/obj/structure/cable, -/obj/item/solar_assembly, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"OT" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"OZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pa" = ( -/obj/structure/bed/double/pod, -/obj/item/bedsheet/random/double, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/fancy_pillow, -/obj/item/fancy_pillow, -/obj/machinery/button/door/directional/north{ - id = "ptdorm4"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Pc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Pd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Pf" = ( -/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/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ph" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Pl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Pp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Pq" = ( -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ps" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Px" = ( -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Pz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"PA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PE" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"PF" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"PK" = ( -/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/solid, -/obj/machinery/door/airlock/atmos/glass, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PM" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"PO" = ( -/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/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"PR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"PS" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Financing Console" - }, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"PT" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"PZ" = ( -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qg" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/pink/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qh" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Qk" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qn" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Qo" = ( -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qp" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qs" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Qu" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/machinery/computer/atmos_control/tarkon/plasma_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qx" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Qy" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/suit_storage_unit/industrial/hauler, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QA" = ( -/obj/machinery/door/window/left/directional/north, -/obj/machinery/door/window/left/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QB" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/tarkon/sci{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"QL" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"QP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/machinery/meter, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"QW" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QX" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/closet/crate/secure/science, -/obj/item/raw_anomaly_core/random, -/obj/item/raw_anomaly_core/random, -/obj/item/raw_anomaly_core/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"QY" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/component_printer, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Rc" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/servo, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rf" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rg" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rh" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Rk" = ( -/mob/living/basic/carp/mega, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Turbine Maintenance Door" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rp" = ( -/obj/machinery/vending/dorms, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Rq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rr" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Rx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"RE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"RH" = ( -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RI" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/circuit_imprinter/offstation, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"RJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"RK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"RL" = ( -/obj/structure/fluff/empty_sleeper, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"RM" = ( -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"RN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"RO" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/item/areaeditor/blueprints/slime, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/structure/closet/crate/secure/science, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"RQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"RT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"RU" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"RX" = ( -/obj/structure/table, -/obj/item/clothing/head/utility/welding, -/obj/item/clothing/gloves/color/yellow, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"RY" = ( -/obj/effect/turf_decal/vg_decals/atmos/plasma, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/plasma_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Sa" = ( -/obj/structure/frame/machine, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/circuitboard/machine/ore_redemption, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Se" = ( -/obj/structure/trash_pile, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Sg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sn" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/titanium{ - amount = 30 - }, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sp" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sq" = ( -/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/blue/half{ - dir = 1 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/comms) -"Su" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sv" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Sw" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"SG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/machinery/door/window/brigdoor/left/directional/north, -/obj/item/paper_bin{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"SI" = ( -/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/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SL" = ( -/obj/machinery/shower/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/door/window/right/directional/north{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SM" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SP" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ST" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/observ) -"SV" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/item/folder/red, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"SW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SX" = ( -/obj/effect/decal/cleanable/ash, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SZ" = ( -/obj/structure/table/reinforced, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Tb" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Te" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ti" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Tk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Tl" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"To" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/storage/backpack/industrial, -/obj/item/storage/backpack/duffelbag/engineering, -/obj/item/storage/backpack/satchel/eng, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Tq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ts" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Tz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"TD" = ( -/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, -/mob/living/basic/carp, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"TF" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"TH" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/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/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TJ" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/item/stack/medical/suture/medicated, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"TL" = ( -/obj/machinery/power/solar_control{ - dir = 1; - id = "aftport"; - name = "Station Solar Control" - }, -/obj/structure/cable, -/obj/item/paper/guides/jobs/engi/solars, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"TP" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TQ" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"TT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/storage/box/stockparts/basic, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"TV" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"TW" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"TX" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ua" = ( -/obj/structure/safe/floor, -/obj/item/stack/sheet/bluespace_crystal{ - amount = 5 - }, -/obj/item/stack/sheet/mineral/diamond{ - amount = 10 - }, -/obj/item/weldingtool/abductor, -/obj/item/circuitboard/machine/bluespace_miner, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/paper/fluff/ruins/tarkon/coupplans, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ud" = ( -/obj/structure/closet/crate/bin, -/obj/item/mod/module/springlock, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Uf" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/anomaly_refinery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Un" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ur" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ut" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Uv" = ( -/obj/item/retractor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Uw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ux" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Uz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"UI" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"UJ" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"US" = ( -/obj/machinery/door/firedoor/solid, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"UV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"UX" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"UZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Vc" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Vi" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"Vj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/storage/backpack/duffelbag/blueshield, -/obj/item/storage/backpack/blueshield, -/obj/item/storage/backpack/satchel/blueshield, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vl" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Vn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Vw" = ( -/obj/structure/sign/warning/no_smoking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Vx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Vy" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VE" = ( -/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/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"VH" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VK" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"VO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VQ" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VS" = ( -/obj/machinery/atmospherics/miner/oxygen, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"VT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"VU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"VV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Wa" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav) -"Wc" = ( -/obj/effect/turf_decal/sand, -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Wd" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrogen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/nitrogen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"We" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 4; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/goals, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Wh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Wn" = ( -/obj/machinery/computer/cryopod/tarkon/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Wp" = ( -/obj/machinery/vending/snack/teal, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Wq" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Wt" = ( -/turf/closed/mineral/random, -/area/awaymission) -"Wu" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Ww" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/module_duplicator, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"WA" = ( -/obj/structure/lattice, -/obj/item/stack/rods, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"WB" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"WC" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/mix_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"WE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"WL" = ( -/mob/living/basic/carp/mega, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/forehall) -"WM" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/oven/range, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"WO" = ( -/obj/structure/table/reinforced, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"WP" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/poddoor/shutters{ - id = "ptatmos" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WQ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/porthall) -"WW" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WY" = ( -/turf/open/space/basic, -/area/template_noop) -"Xb" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Xh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"Xj" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Xk" = ( -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Xn" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Xq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Xr" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Xy" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Xz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"XD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"XE" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"XH" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"XI" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XJ" = ( -/obj/machinery/door/firedoor/solid/closed, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"XT" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"XX" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/porthall) -"XZ" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav) -"Yb" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Yc" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Yf" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Yh" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Yp" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Yr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Yt" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Yu" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Yv" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Yy" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/folder/blue, -/obj/item/pen/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"YB" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YC" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"YD" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"YF" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"YI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"YK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptcomms" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/comms) -"YQ" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/mob/living/basic/carp, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"YT" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"YW" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"YZ" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Zc" = ( -/turf/closed/mineral/random/high_chance, -/area/solars/tarkon) -"Zi" = ( -/obj/machinery/door/window/brigdoor/left/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zl" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Zm" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zp" = ( -/obj/structure/table/reinforced, -/obj/item/storage/belt/utility, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Zq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zr" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Zv" = ( -/obj/machinery/door/window/left/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zw" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/nitrous_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ZC" = ( -/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/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ZF" = ( -/mob/living/basic/carp/mega, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/observ) -"ZG" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZH" = ( -/obj/structure/cable, -/obj/structure/rack, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ZJ" = ( -/turf/open/misc/asteroid/airless, -/area/awaymission) -"ZK" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/airless, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZM" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZN" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZO" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZP" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ZU" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/structure/cable, -/obj/machinery/door/firedoor/solid, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ZV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/obj/modular_map_connector, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ZY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) - -(1,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(2,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(3,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -RM -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -RM -WY -WY -"} -(4,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -sv -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(5,1,1) = {" -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -zo -zo -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(6,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -Wa -Wa -Wa -Wa -Wa -Wa -sv -sv -zo -zo -zo -zo -zo -zo -Eb -zo -zo -zo -Wa -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -"} -(7,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -Wa -Wa -Wa -Wa -Wa -Wa -Wa -zo -zo -zo -zo -zo -zo -iv -zo -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -sv -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(8,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -sv -sv -sv -sv -sv -sv -sv -qT -zo -rq -zo -zo -iI -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -"} -(9,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -EQ -EQ -EQ -WU -WU -WU -WU -WU -WU -WU -WU -WA -ZP -ZP -ZP -ZP -ZP -ZP -ZP -yE -yE -WU -xt -xt -WP -Vw -xt -xt -xt -xt -xt -xt -xt -xt -xt -xt -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(10,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -EQ -EQ -EQ -Uw -qe -jg -bK -eV -nG -nG -nG -eV -IY -oe -ZP -AL -AL -ZP -ZP -AL -AL -MS -Tq -Pd -gp -df -jB -og -lH -pA -yC -lH -Wd -nm -lH -rL -VS -lH -sv -sv -sv -zo -zo -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(11,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -EQ -EQ -Uw -sC -Uw -qe -WU -rW -hN -RN -wt -RN -RN -hN -XX -oe -ZP -ZP -ZP -ZP -ZP -ZP -ZP -MS -Pd -PK -dC -GX -lp -lH -te -QH -lH -sj -jj -lH -oI -AF -lH -sv -jO -iB -zo -zo -zo -sv -sv -sv -sv -sv -sv -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(12,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -KS -sK -HP -Uw -xN -RQ -vz -UZ -pj -RN -RN -Xk -FC -RN -RN -RN -nY -AL -AL -ZP -ZP -DY -ZP -MS -lg -NC -SM -CP -mo -lH -ts -NK -lH -xp -NK -lH -Bj -NK -lH -xt -GE -xt -zo -WY -zo -xt -sv -Wa -sv -sv -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(13,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -KS -yl -La -Uw -Uw -sC -hH -nP -nP -nP -nP -Vc -li -nP -nP -nP -nP -wQ -Ct -Ct -Ct -Ct -Nc -ZP -ZP -Et -xt -hi -CP -BX -WC -Bi -HU -mc -iG -ad -qk -kr -hM -iw -Fr -Gp -xt -xt -kS -cd -xt -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -RM -WY -WY -WY -WY -"} -(14,1,1) = {" -WY -WY -RM -WY -WY -WY -WY -zo -zo -EQ -EQ -NH -dt -at -Uw -Uw -HP -as -nP -Ik -yz -kT -On -vs -On -xu -uf -tq -gu -On -wQ -fV -wQ -Ct -ZP -ZP -wK -xt -dl -CP -BX -BX -BX -BX -FO -FO -FO -FO -qw -BX -AA -gs -wW -Ld -sc -Ex -xB -xt -Wa -Wa -sv -Wa -sv -Wa -Wa -zo -WY -WY -WY -WY -WY -"} -(15,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -kp -Uw -LW -Uw -ZF -Uw -Uw -Ph -nP -Uf -YI -lF -ce -YI -eo -YF -uf -QY -fG -YI -yO -ih -Ed -nP -GL -ZP -wK -xt -An -jJ -zc -BX -Rk -PA -FO -dN -BP -FO -BX -BX -bn -xt -Fs -xt -Ak -MU -eZ -xt -zo -sv -Wa -sv -sv -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(16,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -Uw -bX -Oi -Oi -Oi -Oi -Oi -Ph -nP -ef -YI -vL -YI -YI -Id -YF -uf -KP -Ic -YI -yO -xY -vB -nP -MS -MS -VZ -xt -pW -Un -qw -BX -FO -SP -id -SP -FO -BX -BX -kd -lI -KM -UI -xt -xt -sa -xt -xt -zo -zo -Wa -sv -Wa -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(17,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -sK -Uw -lr -Gl -Ez -Uw -Uw -MJ -Ph -nP -fa -YI -vL -YI -YI -Id -YF -uf -Ww -Xh -YI -yI -Id -wl -Vc -RN -nY -OI -xt -IG -Un -BX -BX -PA -ap -id -xW -FO -BX -BX -iW -Fh -Zq -hP -QW -Rm -FT -sL -zo -Wa -Vi -sv -sv -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(18,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -EQ -Cx -Uw -jF -Gf -gE -QL -RJ -ml -qe -nP -QX -GD -Er -Er -Er -Er -sr -uf -xd -KX -YI -Ax -Id -wl -nP -RN -RN -nG -xt -fv -Un -BX -FO -FO -id -SP -id -FO -BX -BX -BX -Fh -DD -wh -Ob -xt -zC -xt -zo -Vi -zo -nx -Wa -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(19,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -SU -SU -SU -SU -SU -SU -SU -eL -SU -HW -nP -pE -YI -YI -cJ -YI -RT -Sg -pY -ko -un -un -un -DK -tA -nP -xZ -RN -DM -xt -BX -Un -FO -FO -FO -PA -FO -FO -FO -uk -BX -BX -YQ -zT -Ti -eQ -xt -Ke -cd -zo -Vi -zo -zo -zo -tt -zo -zo -zo -WY -WY -WY -WY -WY -"} -(20,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -Wa -sv -sv -Wa -Wa -Wa -kf -WE -WE -VV -nP -CB -VU -VU -pa -VU -VU -YF -uf -TJ -Id -YI -YI -DK -bm -nP -RN -RN -nG -xt -OD -Un -sf -Un -Un -Un -Un -Un -Un -Yh -FO -BX -jG -lQ -gH -fk -xt -WY -zo -zo -sv -FG -nx -nx -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(21,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -Wa -sv -Wa -sv -kf -Cq -Cq -Cp -nP -Gv -gt -YI -cJ -rG -YI -Su -uf -yx -fJ -Uv -YI -DK -Pf -HQ -tQ -RN -nG -xt -BX -BX -BX -Zw -Zm -Rg -oQ -PB -cv -Qu -uK -XH -Me -hf -hf -xt -xt -zo -zo -sv -Wa -Wa -zb -kA -kF -zo -zo -zo -WY -WY -WY -WY -WY -"} -(22,1,1) = {" -WY -WY -WY -RM -WY -zo -zo -Wa -Wa -Wa -Wa -Wa -sv -Wa -kf -VO -Cq -Cp -nP -xT -YI -YI -cJ -rG -YI -wl -ZO -cc -TT -YI -YI -rF -Ni -nP -TD -RN -OI -xt -ST -Zv -ST -lH -NK -ub -lH -NK -lV -lH -NK -Qg -lH -xt -xt -xt -sv -sv -sv -sv -Wa -LJ -UJ -UJ -rg -av -MG -LJ -WY -WY -WY -WY -WY -"} -(23,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -sv -sv -sv -sv -sv -kf -sI -KQ -zV -nP -oc -yG -cJ -cJ -rG -ce -no -ZO -xd -on -YI -rc -bZ -Sn -nP -tQ -RN -nG -xt -vO -pc -vO -lH -Rf -ld -lH -pU -xj -lH -Qk -fR -lH -sv -sv -sv -sv -Wa -Zc -LJ -rg -av -MG -UJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(24,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -jN -Cq -Cp -nP -RO -YI -cJ -YI -ZK -Sp -lw -ZO -RI -Jz -sN -rH -Cw -aY -nP -tQ -DI -nG -xt -vO -vO -vO -lH -GB -vp -lH -om -hR -lH -RY -MD -lH -sv -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -Xb -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(25,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -kf -Cq -Cq -Cp -db -nS -VU -pa -VU -WW -Xy -mi -rh -rh -rh -rh -rh -rh -rh -WU -tE -tQ -nG -xt -xt -xt -xt -xt -xt -xt -xt -xt -xt -bO -xt -xt -xt -GY -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -IL -LJ -Ft -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(26,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -kf -VO -WL -Cp -db -PM -WQ -OZ -tz -RH -Xy -KE -Zp -gv -hw -lU -RU -pJ -wC -WU -RN -Hj -Sj -WU -uC -YZ -YZ -iq -SL -KV -Iw -zm -UX -wa -cK -CI -Ck -Iw -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -gX -Mr -WB -LJ -WY -WY -WY -WY -WY -"} -(27,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -kf -Cq -Cq -Cp -db -Te -Zi -OZ -lj -bj -Xy -eE -HF -HF -HF -kJ -FU -FN -rh -WU -Qs -pR -hA -WU -Ki -vR -iq -iq -iq -iq -Iw -xL -MO -Jj -BS -CV -ZH -EN -zo -zo -zo -LJ -LJ -LJ -Bk -UJ -ye -LJ -gX -UJ -ye -LJ -WY -WY -WY -WY -WY -"} -(28,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -sv -kf -LH -KW -Cp -db -PM -kx -OZ -iU -Kj -Xy -rz -HF -fl -OT -bD -yY -ak -yY -VH -ro -CA -dT -MB -Ki -MC -Ki -iq -iq -iq -Iw -zW -CV -zJ -BS -HS -BW -Qx -Qx -Qx -Qx -av -av -av -OR -UJ -uU -av -qi -UJ -uU -av -WY -WY -WY -WY -WY -"} -(29,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -kf -Cq -Cq -Cp -db -PM -Cf -OZ -jE -RH -Xy -CX -VT -OT -dZ -yY -yY -kO -dT -ul -GM -GM -GM -Uz -ro -MB -Ki -Ki -XE -aq -Iw -vj -Yb -VE -AM -IO -BW -JN -xP -xP -gn -Mr -UJ -UJ -UJ -UJ -UJ -UJ -UJ -UJ -Mr -OS -WY -WY -WY -WY -WY -"} -(30,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -Wa -kf -Cq -Cq -Cp -db -DO -wx -OZ -YB -Yf -Xy -rV -OT -pt -yY -yY -VH -bi -Hn -Hn -di -TP -xU -xU -xU -AT -IE -Ki -Ki -Iw -Iw -Iw -Iw -Iw -ge -HS -TL -Qx -Qx -Qx -Qx -Gy -Gy -Gy -Hb -Mr -Al -Gy -Pl -UJ -fw -Gy -WY -WY -WY -WY -WY -"} -(31,1,1) = {" -WY -WY -RM -WY -WY -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -kf -Cq -Cq -Pc -db -fh -Ua -OZ -tz -RH -Xy -TV -yF -yY -yY -NM -oC -yj -uv -uv -uv -uv -uv -uv -ly -IQ -AT -IE -Fb -dy -Fm -lA -hZ -Iw -aX -HS -my -Qx -zo -zo -zo -LJ -LJ -LJ -Ft -UJ -IL -LJ -gX -Mr -co -LJ -WY -WY -WY -WY -WY -"} -(32,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -Wa -sv -kf -VO -Cq -Cp -db -Te -Zi -UV -lj -Kj -Xy -JF -lt -Rr -VH -jz -PZ -uv -uv -hm -Vk -uv -Vj -dn -ly -ly -Sv -qv -IE -GR -xP -ps -eD -Iw -iM -pH -FX -Qx -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -Yc -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(33,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -kf -Cq -eT -Cp -db -HY -Vl -jM -GU -ME -Xy -wC -rh -yY -DS -dX -Qp -uv -lS -Vj -Vj -uv -Vj -Vj -Vj -ly -cT -Xq -qL -bz -Iw -lK -Ha -Iw -pf -VE -RX -Iw -zo -zo -zo -LJ -LJ -LJ -wV -UJ -ye -LJ -Qn -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(34,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -Wa -Wa -sv -Wa -kf -Cq -Cq -Cp -db -db -db -db -db -db -yd -kf -kf -NM -jz -rw -uv -uv -LA -Vj -Jp -uv -Vj -Vj -CC -uv -uv -ww -qv -MB -Iw -Iw -Iw -Iw -Iw -Au -Iw -Iw -ZN -of -of -LJ -LJ -LJ -Qn -UJ -co -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(35,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -jN -Cq -Cp -XJ -nN -nN -sM -nN -eG -Eu -nN -BI -DS -nQ -PZ -Fe -Vj -Vj -ux -pv -uv -RL -Vj -Vj -Vj -mC -Sv -GM -PZ -lx -LN -LN -ct -mu -Pz -LN -LN -jv -Wp -of -of -LJ -LJ -aF -Gy -Ho -LJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(36,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -kf -sI -Cq -Cp -yt -nN -nN -nN -nN -nN -nN -nN -Tl -qb -SW -Qo -uv -fp -Vj -uD -dq -hr -Vj -Vj -Vj -Ao -uv -XI -Oo -Vz -ZM -LN -LN -tI -LN -Pz -LN -LN -Eq -LN -yv -of -of -LJ -LJ -LJ -LJ -LJ -aF -Gy -Ho -LJ -WY -WY -WY -WY -WY -"} -(37,1,1) = {" -WY -WY -WY -WY -RM -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -kf -Cq -KW -Cp -Nj -yh -yh -kG -kG -kG -Nr -Nr -dh -PO -nQ -PZ -Fe -Vj -Vj -sm -lT -uv -jT -Vj -Vj -Vj -ZX -PO -ID -DA -JW -Pz -Pz -pM -Pz -Pz -fP -fP -fP -fP -LN -Jx -of -zo -zo -zo -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(38,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -kf -VO -Cq -tp -kf -kf -kf -kf -Gx -kf -kf -kf -kf -GW -LG -PZ -uv -uv -Jl -Vj -FB -uv -Vj -Vj -QK -uv -uv -Sv -qL -KA -hj -hj -hj -hj -hj -Ut -ZN -OM -OM -Sq -Gk -OM -OM -YK -YK -YK -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(39,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -kf -Cq -Cq -Cp -kf -nZ -jZ -jZ -bt -jZ -SX -ug -kf -Ki -PO -Uz -BV -uv -tT -Vj -Vj -uv -Vj -Vj -Vj -ly -xc -oN -qL -KA -OB -Gd -kI -oq -hj -kk -oL -OM -yy -EY -wY -DZ -zL -pw -We -YK -YK -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(40,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -kf -Cq -Cq -zV -kf -yp -Fl -mt -Cm -by -Nz -kU -Se -Ki -TH -LG -sn -uv -uv -To -rk -uv -Vj -oW -ly -ly -Sv -ID -ZC -WO -ck -ck -ck -pd -hj -oL -oL -OM -Ox -fL -dw -WD -WD -WD -Ie -gk -ke -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(41,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -sv -Wa -kf -Cq -WL -Cp -cV -cV -cV -cV -cV -cV -cV -cV -cV -Ki -Fb -GW -Ci -MB -uv -uv -uv -uv -uv -uv -ly -VH -oN -qL -KA -KA -sl -sl -mO -pd -hj -mr -am -OM -CW -fL -WD -WD -WD -WD -WD -WD -cr -YK -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(42,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -kf -Cq -Cq -Cp -cV -GF -Ls -wc -KJ -fI -Bp -vN -Zr -Ki -Ki -tH -GW -Ci -ff -ro -Mp -CG -ro -br -ro -oN -to -qL -KA -sl -sl -Vg -mO -SZ -hj -OG -Xr -OM -vo -fL -WD -WD -WD -WD -WD -uN -oS -Kc -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(43,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -sv -kf -Cq -KQ -Cp -cV -EV -IW -HX -gd -gd -zZ -Nq -ah -Ki -ai -tH -tH -ik -xU -eg -GM -GM -ID -xU -xU -xU -xU -ZC -tk -IU -WM -sl -iy -FS -hj -YT -YT -OM -vG -fL -Ch -Ch -Ch -Yy -kW -Ch -tn -FR -YK -YK -zo -zo -WY -WY -WY -WY -WY -"} -(44,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -Wa -kf -yi -Cq -Cp -iA -xi -xi -xi -Ae -Ae -Ae -yS -nu -Ki -nQ -Jq -Ki -jP -Ki -IQ -Hn -Yr -SI -gJ -gJ -gJ -Px -lR -gJ -gJ -hj -po -iy -KZ -hj -Rp -Dk -OM -kq -WD -Tk -WD -Yt -mK -gW -PE -Tk -oS -hL -YK -zo -zo -WY -WY -WY -WY -WY -"} -(45,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -kf -VO -KW -Cp -Lr -gd -ga -gd -gd -gd -gd -IH -ah -Ki -Kl -RK -Wn -GM -Ki -Ki -iT -US -nb -gJ -XT -XT -KO -XG -XT -GS -hj -nc -iy -Ju -hj -rZ -nL -OM -ut -VK -VK -ry -VK -EE -SV -VK -TX -an -JX -YK -zo -zo -WY -WY -WY -WY -WY -"} -(46,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -kf -Cq -Cq -VJ -cV -EV -Mt -gd -gd -gd -zZ -aS -ah -Ki -vF -nQ -EA -cA -Jq -Ki -DN -LS -Hg -gJ -XT -Gs -KO -sX -sX -XT -ft -sl -td -Ju -hj -YT -tC -QC -QC -QC -QC -ZG -ZG -ZG -ZG -ZG -ZG -ZG -ZG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(47,1,1) = {" -WY -WY -WY -RM -WY -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -kf -VQ -Cq -VJ -cV -ku -EB -hE -rv -vl -JY -bF -ba -Ki -Mz -jA -vd -QP -Jq -Ki -LS -fU -Hg -Xj -XG -XG -go -Nt -sX -XG -Tz -sl -FZ -dW -hj -ru -gP -TF -JL -Qy -QB -ng -nF -Sb -Jm -Sb -Sb -xR -mG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(48,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -kf -Cq -Cq -VJ -cV -cV -cV -cV -cV -cV -cV -cV -cV -Ki -AP -AP -AP -AP -AP -AP -JE -XD -Hg -bA -XG -XG -gb -iJ -sX -Rh -hj -Bn -hj -hj -hj -vm -jV -Wq -JI -JI -Lf -ng -MV -Dv -Dv -Dv -Ur -AZ -md -cu -zo -zo -WY -WY -WY -WY -WY -"} -(49,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -Cq -KW -VJ -kf -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -vC -HB -dA -eB -Nw -bg -AG -cU -MF -gJ -XT -XG -XG -XG -Vm -Gt -hj -uR -uR -hV -hj -Wu -kD -kD -kD -Ce -xO -Ih -qH -cQ -jW -jW -rB -ng -oE -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(50,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -PF -PF -Ks -kf -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -vC -LY -zt -Hf -Yu -uS -LS -LS -MF -gJ -aZ -XT -MP -MP -XT -Yv -hj -uR -uR -hV -hj -fB -hQ -fB -fB -Rx -Lf -Pq -pu -PR -jW -jW -dP -rK -RE -qh -zo -zo -WY -WY -WY -WY -WY -"} -(51,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -Wa -Wa -sv -kf -Hq -Hq -Hq -kf -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -sv -vC -qQ -Hk -Hf -Ud -uS -iT -Dn -mT -gJ -gJ -gJ -pz -pz -gJ -gJ -hj -hj -hj -hj -hj -Yp -vA -th -fB -LD -Lf -ng -ZV -jW -eu -jW -Io -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(52,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -Wa -vC -bY -zt -lW -aU -uS -LS -LS -MF -LS -LS -LS -LS -LS -LS -LS -zp -Ux -Ux -Ux -YW -sd -MF -Vu -fB -LD -dE -ng -ui -jW -jW -jW -if -cE -jW -Lo -zo -Eb -WY -WY -WY -WY -WY -"} -(53,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -vC -xH -Le -lW -pT -SG -LS -cU -MF -LS -LS -LS -Ps -LS -LS -LS -zp -yD -LS -LS -LS -Ps -MF -Da -QA -Qh -pl -ng -SQ -FK -jW -uJ -if -cE -jW -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(54,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -Wa -vC -ia -zt -lW -DP -vC -cn -LS -MF -CY -qS -MF -MF -MF -ka -eK -fT -zM -zM -zM -zM -zM -zM -MY -fB -PS -oy -ng -BF -jW -PR -jW -qq -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(55,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -vC -PT -zt -lW -Yu -vC -TW -TW -TW -eI -eI -eI -Kk -eI -eI -eI -Hy -yU -mV -yU -yU -ZU -yU -Hy -Hy -Hy -Hy -ng -BF -jW -jW -jW -if -ym -KL -Ix -zo -zo -WY -WY -WY -RM -WY -"} -(56,1,1) = {" -WY -RM -WY -WY -WY -zo -zo -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -sv -sv -Wa -sv -sv -vC -jY -zt -lW -nk -ls -lW -EC -vC -Oj -tY -Jv -tc -Jv -Im -CS -Hy -in -zy -zy -zy -wZ -le -hl -Sk -zy -rD -ng -BF -cQ -jW -LC -Os -aP -aP -ZG -zo -zo -WY -WY -RM -WY -WY -"} -(57,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -sv -Wa -sv -sv -sv -Wa -Wa -Wa -Wa -sv -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -vC -NX -zt -lW -Yu -gD -JQ -NN -vC -Vx -Ji -Cy -El -tM -dv -Ij -Hy -Rc -Vn -aT -aT -Rq -aT -aT -Pp -Nl -sq -ng -Gb -Dv -Dv -Dv -CM -xR -Tb -cu -zo -zo -WY -WY -WY -WY -WY -"} -(58,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -Wa -vC -Fk -Oa -lW -cD -vC -vC -vC -vC -Jv -Jv -Jv -YC -Jv -Jv -Jv -Hy -Sa -Fq -LQ -LQ -os -LQ -Xz -Xz -dR -eM -ng -Ts -dk -uM -iC -gN -AZ -jU -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(59,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -sv -sv -Wa -sv -Wa -sv -sv -Wa -sv -Wa -Wa -sv -sv -sv -Wa -Wa -sv -vC -ph -zt -lW -Yu -gD -kR -kX -vC -xq -ov -ve -sw -lD -yA -ZY -Hy -hS -Vy -cq -jo -TQ -gS -Bo -Vy -gS -IK -ng -ng -ng -ng -ng -ng -ng -ng -ZG -zo -vQ -WY -WY -WY -WY -WY -"} -(60,1,1) = {" -WY -WY -WY -WY -WY -WY -uo -zo -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -Wa -Wa -sv -vC -nW -Nx -Wh -CE -hY -IF -EC -vC -sD -JO -Jv -pX -Jv -Pa -Hi -zf -zf -zf -KB -CL -zf -zf -zf -zf -zf -zf -Hy -Wa -Wa -sv -sv -Wa -Wa -Wa -zo -vQ -FE -WY -WY -WY -WY -WY -"} -(61,1,1) = {" -WY -WY -WY -WY -WY -WY -FE -vQ -zo -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -vC -vC -vC -vC -vC -vC -vC -vC -vC -Sw -Sw -Sw -Sw -Sw -Sw -Sw -zf -Ng -zy -BU -Kr -YD -Jw -Bq -Wc -Wc -bH -sv -sv -sv -Wa -Wa -Wa -Wa -zo -zo -vQ -WY -WY -WY -WY -WY -WY -"} -(62,1,1) = {" -WY -WY -WY -WY -ZJ -WY -FE -zo -zo -zo -Wa -sv -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -XZ -Wa -bH -Lp -Pp -Zl -qF -Xz -iu -Cs -qr -HH -ip -zo -sv -Wa -sv -Wa -Wa -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -"} -(63,1,1) = {" -WY -WY -WY -jn -Wt -WY -FE -WY -vQ -zo -zo -Wa -Wa -sv -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -XZ -Wa -bH -lZ -kh -tV -zd -ud -Xn -bH -Ba -ot -bH -zo -sv -Wa -Wa -Wa -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -WY -"} -(64,1,1) = {" -WY -WY -WY -jn -jn -FE -FE -qD -FE -vQ -zo -zo -zo -Wa -sv -Wa -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -Wa -XZ -bH -KG -bH -gA -gA -bH -KG -bH -bH -bH -bH -zo -sv -sv -Wa -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -WY -WY -"} -(65,1,1) = {" -WY -WY -Wt -jn -jn -Wt -FE -WY -WY -WY -WY -zo -vQ -zo -zo -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -zo -zo -zo -zo -zo -zo -zo -dr -zo -zo -zo -zo -zo -zo -zo -Wa -zo -zo -vQ -vQ -FE -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(66,1,1) = {" -WY -WY -jn -jn -Wt -jn -FE -FE -FE -FE -FE -FE -FE -vQ -zo -zo -zo -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -"} -(67,1,1) = {" -WY -ZJ -Wt -jn -jn -jn -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(68,1,1) = {" -WY -WY -WY -Wt -jn -Wt -ZJ -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(69,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(70,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(71,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm deleted file mode 100644 index 1a0adf42c2a..00000000000 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm +++ /dev/null @@ -1,13744 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ab" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ad" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ag" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/directional/east, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ah" = ( -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ai" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ak" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"am" = ( -/obj/structure/mop_bucket, -/obj/item/mop, -/obj/item/reagent_containers/cup/bucket, -/obj/item/soap/nanotrasen, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"an" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"aq" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"as" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"at" = ( -/obj/structure/chair/sofa/corp/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"av" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aF" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"aH" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"aP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/storage) -"aS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"aU" = ( -/obj/structure/table/reinforced, -/obj/item/card/id/away/tarkon{ - pixel_y = -6 - }, -/obj/item/card/id/away/tarkon, -/obj/item/card/id/away/tarkon{ - pixel_y = 6 - }, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"aX" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"aY" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"aZ" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ba" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bf" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"bg" = ( -/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/security/old, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"bi" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bj" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"bm" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"bn" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = -24; - req_one_access = list("tarkon") - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -8; - pixel_y = -36; - req_one_access = list("tarkon") - }, -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bq" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"br" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bt" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"by" = ( -/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/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/solar_assembly, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"bz" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"bA" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"bD" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"bF" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"bH" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"bK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"bO" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"bT" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"bV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"bX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"bY" = ( -/obj/structure/rack/gunrack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"cc" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/protolathe/offstation, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"cd" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ce" = ( -/obj/machinery/light/dim/directional/north, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ck" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"cn" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"co" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"cq" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"cr" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/folder, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"cs" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ct" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"cu" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"cv" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"cA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/supply{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"cE" = ( -/obj/machinery/door/poddoor/shutters/window{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"cK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"cQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"cT" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"cU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"cV" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/trauma) -"cX" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"db" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"df" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptatmos"; - name = "shutter controls"; - pixel_x = -39; - pixel_y = -10 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"di" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dk" = ( -/obj/structure/closet/crate, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/holosign_creator/janibarrier, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"dl" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"dr" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 16; - name = "Port Tarkon"; - roundstart_template = /datum/map_template/shuttle/ruin/tarkon_driver; - shuttle_id = "port_tarkon"; - width = 14 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"dt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/sofa/corp{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"dw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"dy" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"dA" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"dB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"dC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"dE" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"dP" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"dR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"dT" = ( -/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/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dW" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"dX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"dZ" = ( -/obj/machinery/autolathe, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"eb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ed" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ef" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"eg" = ( -/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/tile/neutral{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ek" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ep" = ( -/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/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"et" = ( -/obj/structure/fluff/empty_sleeper{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"eu" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"eB" = ( -/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/red/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"eD" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"eE" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"eG" = ( -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eI" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"eL" = ( -/obj/machinery/door/airlock/public, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"eM" = ( -/obj/structure/closet, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"eQ" = ( -/obj/machinery/computer/atmos_control/tarkon/incinerator{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"eY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"eZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fa" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/computer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ff" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"fh" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/alien/egg/burst, -/obj/effect/mob_spawn/corpse/facehugger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fl" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"fp" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/closet, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/black, -/obj/item/clothing/gloves/color/plasmaman/chief_engineer, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/clothing/under/plasmaman, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/tank/internals/nitrogen/belt/full, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/item/clothing/mask/breath/vox, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ft" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"fv" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fw" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"fB" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"fG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fI" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/medbeam/afad, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"fJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/loading_area, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"fK" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"fL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"fP" = ( -/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/ruin/space/has_grav/port_tarkon/afthall) -"fR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"fT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"fV" = ( -/obj/structure/table/rolling, -/obj/item/scalpel, -/obj/item/hemostat, -/obj/item/cautery, -/obj/item/bonesetter, -/obj/item/stack/medical/suture/medicated, -/obj/item/retractor, -/obj/item/clothing/gloves/latex, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ga" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"gb" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ge" = ( -/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/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"gk" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gl" = ( -/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/tile/neutral/half, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"gn" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"go" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"gp" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gs" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_interior, -/obj/machinery/airlock_controller/incinerator_tarkon{ - pixel_x = 40; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"gt" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"gu" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"gv" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/empty, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"gy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"gA" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/door/firedoor/heavy/closed, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/port_tarkon/mining) -"gD" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/secoff) -"gE" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"gJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/garden) -"gN" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/structure/chair/sofa/corp/left{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"gP" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue, -/obj/item/folder, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"gS" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"gW" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - name = "Broken Computer" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"gX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"ha" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"hf" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hi" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hj" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hl" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"hm" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/cargo/tech/skyrat/utility, -/obj/item/clothing/under/rank/cargo/tech/skyrat/gorka, -/obj/item/storage/backpack/duffelbag/explorer, -/obj/item/storage/backpack/explorer, -/obj/item/storage/backpack/satchel/explorer, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage"; - state_open = 1 - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"hu" = ( -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"hw" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"hy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hA" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"hE" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"hH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptobservatory"; - name = "shutter controls"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"hL" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"hM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"hP" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hQ" = ( -/obj/machinery/door/airlock/mining, -/obj/machinery/door/firedoor/solid, -/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/ruin/space/has_grav/port_tarkon/cargo) -"hR" = ( -/obj/machinery/atmospherics/miner/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"hS" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"hV" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"hY" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"hZ" = ( -/obj/machinery/power/smes/engineering{ - charge = 0; - name = "backup power storage unit" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"ia" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/maint_kit, -/obj/item/stack/sheet/iron/twenty, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ik" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"in" = ( -/obj/item/circuitboard/machine/ore_silo, -/obj/structure/frame/machine, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ip" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/sand/plating, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"iu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"iv" = ( -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iw" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 6 - }, -/obj/structure/closet/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/clothing/suit/utility/radiation, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"iA" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"iB" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iC" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/mob_spawn/ghost_role/human/tarkon{ - dir = 8 - }, -/obj/structure/chair/sofa/corp{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"iG" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"iI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"iJ" = ( -/obj/machinery/vending/hydroseeds, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"iM" = ( -/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/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"iO" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"iT" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"iU" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jg" = ( -/obj/machinery/door/airlock/public, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jj" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jn" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission) -"jo" = ( -/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/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"jr" = ( -/obj/effect/decal/cleanable/confetti, -/obj/item/broken_bottle, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"jv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "ptporthall"; - name = "shutter controls"; - pixel_x = -31 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"jz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jA" = ( -/obj/machinery/atmospherics/components/binary/pump, -/obj/effect/decal/cleanable/confetti, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jC" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"jE" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jF" = ( -/obj/structure/chair/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"jG" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"jM" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"jN" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"jO" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"jP" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"jU" = ( -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"jV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"jW" = ( -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"jY" = ( -/obj/structure/rack, -/obj/item/clothing/head/helmet, -/obj/item/clothing/head/helmet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"jZ" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ka" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"kb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kc" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kd" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ke" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/vaulter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kf" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kh" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/dim/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"kk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ko" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kp" = ( -/obj/item/tape/ruins/tarkon/celebration, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"kq" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/vending/cigarette, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kr" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ku" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/effect/mob_spawn/ghost_role/human/tarkon/med{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"kx" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kA" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kD" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"kF" = ( -/obj/structure/fence/corner, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"kG" = ( -/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/ruin/space/has_grav/port_tarkon/forehall) -"kI" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"kJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"kN" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"kO" = ( -/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/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"kR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"kS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"kT" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"kU" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/obj/effect/spawner/random/decoration/carpet, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"kW" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/megaphone, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"kX" = ( -/obj/structure/bed/maint, -/obj/structure/safe/floor, -/obj/item/mod/module/armor_booster/retractplates{ - desc = "A complex set of actuators, micro-seals and a simple guide on how to install it, This... \"Modification\" allows the plating around the joints to retract, giving minor protection and a bit better mobility. There also seems to be a small, wireless microphone... how odd." - }, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"ld" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"le" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"li" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"lj" = ( -/obj/machinery/door/window/brigdoor/left/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lp" = ( -/obj/machinery/suit_storage_unit/engine, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/chair/wood, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"ls" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - req_access = list("tarkon") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lt" = ( -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lu" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lw" = ( -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/structure/table/rolling, -/obj/item/clothing/gloves/latex, -/obj/item/circular_saw, -/obj/item/scalpel, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lx" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ly" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon) -"lA" = ( -/obj/structure/closet/crate/radiation, -/obj/structure/cable, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lC" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lD" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm4"; - name = "Couples Suite" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"lF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"lH" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lI" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lK" = ( -/obj/structure/closet/firecloset/full, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"lQ" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lR" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"lS" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/clothing/under/rank/medical/doctor/skyrat/utility, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/storage/backpack/medic, -/obj/item/storage/backpack/satchel/med, -/obj/item/storage/backpack/satchel/chem, -/obj/item/storage/backpack/satchel/vir, -/obj/item/storage/backpack/virology, -/obj/item/storage/backpack/duffelbag/virology, -/obj/item/storage/backpack/duffelbag/chemistry, -/obj/item/storage/backpack/chemistry, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lT" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"lU" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"lV" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/brown/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"lW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"lZ" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"mc" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners{ - color = "#DE3A3A" - }, -/obj/machinery/computer/atmos_control/tarkon/nitrogen_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"md" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"mi" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"ml" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"mo" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"mq" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"mr" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"mt" = ( -/obj/structure/closet/crate, -/obj/item/transfer_valve, -/obj/item/transfer_valve, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"mu" = ( -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"my" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"mC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"mD" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"mG" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"mH" = ( -/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/neutral/half{ - dir = 1 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"mK" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"mM" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"mO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"mT" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"mV" = ( -/obj/machinery/door/window/right/directional/east, -/obj/machinery/door/window/right/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"mX" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"nb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"nc" = ( -/obj/structure/sink/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ng" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"nh" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nm" = ( -/obj/machinery/atmospherics/miner/nitrogen, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"no" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/table/optable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"nu" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"nx" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"nz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"nF" = ( -/obj/structure/closet/crate/engineering, -/obj/item/stack/sheet/plasteel/fifty, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/mineral/plasma/thirty, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"nL" = ( -/obj/item/stack/tile/carpet/neon/simple/purple/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"nP" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/developement) -"nS" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"nW" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"nZ" = ( -/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/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, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"oc" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/frame/computer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"oe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"of" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptafthall" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"og" = ( -/obj/structure/table/reinforced, -/obj/item/pipe_dispenser, -/obj/item/storage/belt/utility/full, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"om" = ( -/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/carbon_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"on" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"op" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"oq" = ( -/obj/machinery/processor, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"os" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ot" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ov" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"ow" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"oy" = ( -/obj/structure/safe/floor, -/obj/structure/table, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/item/stack/spacecash/c10000, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"oC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oE" = ( -/obj/machinery/button/door{ - id = "tarkonouter"; - name = "Exterior Shutter Control"; - pixel_x = -6 - }, -/obj/machinery/button/door{ - id = "tarkoninner"; - name = "Inner Shutter Control"; - pixel_x = 6 - }, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"oG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"oH" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"oL" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"oN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"oQ" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/carbon_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"oS" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"oV" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pa" = ( -/obj/machinery/door/airlock/research/glass, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pc" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pd" = ( -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"pf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ph" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pj" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"pl" = ( -/obj/structure/table, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c200, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"po" = ( -/obj/structure/sink/kitchen/directional/south, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ps" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"pt" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pv" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/machinery/light/warm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"pw" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"pA" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pE" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"pH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"pJ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"pM" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"pP" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/hydroponics/soil, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"pT" = ( -/obj/structure/chair/office, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"pU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pW" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"pX" = ( -/obj/machinery/vending/clothing, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"pY" = ( -/obj/machinery/door/airlock/research/glass, -/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/tarkon/general, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"qb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"qh" = ( -/obj/machinery/door/poddoor/shutters{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"qi" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"qk" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/oxygen_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qr" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qv" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qA" = ( -/obj/structure/cable, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"qD" = ( -/obj/structure/lattice, -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"qF" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"qH" = ( -/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/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"qL" = ( -/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/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"qQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"qS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"rd" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/biogenerator, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"rg" = ( -/obj/effect/turf_decal/stripes/asteroid/corner, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"rh" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ro" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ru" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"rv" = ( -/obj/structure/table, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/surgery, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"rw" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ry" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"rz" = ( -/obj/structure/rack, -/obj/item/assembly/igniter, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rA" = ( -/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/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"rB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"rD" = ( -/obj/structure/closet, -/obj/item/storage/backpack/satchel/explorer, -/obj/item/clothing/mask/gas/explorer, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"rE" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rG" = ( -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rH" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"rK" = ( -/obj/machinery/door/poddoor/shutters/window{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"rL" = ( -/obj/effect/turf_decal/vg_decals/atmos/oxygen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/oxygen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"rV" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"rW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"rZ" = ( -/obj/item/stack/tile/carpet/neon/simple/teal/nodots/sixty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"sa" = ( -/obj/machinery/power/turbine/inlet_compressor{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/air_sensor/tarkon/incinerator_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sd" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"sj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"sm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"sn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"sq" = ( -/obj/structure/closet, -/obj/item/pickaxe/silver, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/glasses/meson, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"sr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sv" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/space/has_grav) -"sw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sD" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"sI" = ( -/obj/effect/turf_decal/delivery/red, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sK" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"sL" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"sM" = ( -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"sN" = ( -/obj/structure/frame/computer{ - dir = 8 - }, -/obj/item/circuitboard/computer/rdconsole, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"sX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"ta" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/north, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"td" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"te" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"th" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"tk" = ( -/obj/structure/table/reinforced, -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"to" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ts" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/purple/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"tt" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"tz" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"tA" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"tC" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"tE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"tI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"tM" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm2"; - name = "Private Dorm 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"tQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"tT" = ( -/obj/structure/closet, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/clothing/under/misc/skyrat/utility, -/obj/item/storage/backpack, -/obj/item/storage/backpack/duffelbag, -/obj/item/storage/backpack/satchel, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"tV" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"tY" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "ptdorm1"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"ub" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ud" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ug" = ( -/obj/structure/closet/firecloset, -/obj/effect/decal/remains/human, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"uh" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ui" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/advanced, -/obj/structure/closet/crate/medical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"ul" = ( -/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/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"un" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"uo" = ( -/mob/living/basic/carp/mega, -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"ut" = ( -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon) -"uw" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ux" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uC" = ( -/obj/structure/closet/crate/bin{ - pixel_y = 8 - }, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/obj/item/reagent_containers/cup/rag, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"uD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uH" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/fluff/ruins/tarkon/defcon5, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"uK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"uM" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"uN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"uR" = ( -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"uU" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"uV" = ( -/obj/effect/decal/cleanable/confetti, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"vd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ve" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm3"; - name = "Private Dorm 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"vj" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"vl" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/structure/closet/crate/freezer/blood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vm" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"vn" = ( -/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/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"vo" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/cell_charger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vp" = ( -/obj/machinery/atmospherics/miner/n2o, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vq" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"vs" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vz" = ( -/obj/machinery/door/airlock/public, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"vA" = ( -/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/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"vB" = ( -/obj/structure/curtain, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"vC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/secoff) -"vE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/obj/structure/closet/crate/secure/engineering, -/obj/effect/decal/cleanable/dirt, -/obj/item/construction/rcd/arcd/mattermanipulator, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"vF" = ( -/obj/item/gps/computer/space{ - gpstag = "Port Tarkon" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"vN" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"vO" = ( -/obj/effect/mob_spawn/ghost_role/human/tarkon/engi, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"vQ" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"vR" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"vU" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"vZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/structure/closet/crate/secure/science, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/item/mod/construction/broken_core, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"wa" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"wc" = ( -/obj/structure/table, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/clothing/suit/toggle/labcoat/medical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"wh" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wm" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"wt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"ww" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"wx" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wC" = ( -/obj/effect/turf_decal/tile/yellow/full, -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"wG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"wQ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"wV" = ( -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"wW" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_tarkon{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"wX" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/hydroponics/soil, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"wY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"wZ" = ( -/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/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"xc" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"xj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/co2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"xp" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/green/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"xt" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xu" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xB" = ( -/obj/machinery/igniter/incinerator_tarkon, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 5 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"xH" = ( -/obj/machinery/ammo_workbench/unlocked, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"xL" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"xN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"xO" = ( -/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/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"xP" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"xT" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xU" = ( -/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/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xW" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"xY" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"xZ" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"yd" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/forehall) -"ye" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"yj" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"ym" = ( -/obj/machinery/door/poddoor/shutters/window{ - id = "tarkoninner"; - name = "Interior Bay Shutter" - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"yn" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"yv" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"yx" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/mechfab, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yy" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"yz" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"yB" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"yC" = ( -/obj/machinery/air_sensor/tarkon/mix_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"yD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"yF" = ( -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"yG" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yO" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"yS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"yU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/mining) -"yY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"zb" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/fence/door/opened{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"zc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zd" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/tile/brown, -/obj/effect/decal/cleanable/confetti, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zf" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"zl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"zm" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zo" = ( -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"zp" = ( -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zs" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"zt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"zy" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"zA" = ( -/obj/structure/fluff/empty_sleeper{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"zB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"zC" = ( -/obj/machinery/power/turbine/turbine_outlet{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zL" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"zM" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"zT" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/holosign_creator/atmos, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zV" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"zW" = ( -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"zZ" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ae" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Af" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ak" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Al" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"An" = ( -/obj/structure/fireaxecabinet/directional/north, -/obj/machinery/pipedispenser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"As" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"At" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Au" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Az" = ( -/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/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"AA" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"AD" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"AF" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"AG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"AM" = ( -/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/delivery/white, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"AN" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"AP" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"AT" = ( -/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/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"AX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ba" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bg" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Bi" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bj" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Bk" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Bn" = ( -/obj/machinery/door/airlock/public{ - name = "Kitchen Freezer" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron/freezer, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Bo" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/order_console/mining{ - forced_express = 1; - express_cost_multiplier = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Bp" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/circuitboard/machine/sleeper, -/obj/structure/closet/secure_closet/medical1, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Bq" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"By" = ( -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"BC" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/item/broken_bottle, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"BF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/pizzabox/margherita, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/mushroom, -/obj/item/pizzabox/margherita, -/obj/item/pizzabox/meat, -/obj/item/pizzabox/mushroom, -/obj/structure/closet/crate/freezer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"BI" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"BS" = ( -/obj/effect/turf_decal/delivery/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BU" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"BV" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"BW" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"BX" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Cc" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ce" = ( -/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/tile/brown{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Cf" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ci" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ck" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 8 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Cm" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cp" = ( -/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/solid, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cq" = ( -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Cs" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Cu" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Cv" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Cw" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/gold{ - amount = 25 - }, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Cx" = ( -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Cy" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "ptdorm1"; - name = "Private Dorm 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CB" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"CE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/red/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"CG" = ( -/obj/machinery/light/warm/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"CI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CL" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/mining/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"CM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"CP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"CR" = ( -/obj/item/broken_bottle, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"CS" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"CV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"CW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/coin, -/obj/item/coin, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"CX" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/rack, -/obj/item/screwdriver, -/obj/item/wrench, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"CY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"CZ" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Da" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Dc" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"De" = ( -/obj/structure/table/wood, -/obj/item/broken_bottle, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Dk" = ( -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/item/stack/spacecash/c100{ - pixel_x = 4; - pixel_y = -8 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/stack/spacecash/c20{ - pixel_y = 10 - }, -/obj/item/stack/spacecash/c20{ - pixel_x = 5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -4; - pixel_y = -5 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = -6; - pixel_y = 12 - }, -/obj/item/stack/spacecash/c10{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/mod/module/visor/rave, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"DA" = ( -/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/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DD" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"DK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DN" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"DO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DP" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/red/half, -/obj/item/paper/fluff/ruins/tarkon/detain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"DQ" = ( -/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/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"DR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"DS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"DZ" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/machinery/light_switch/directional/west, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Eb" = ( -/mob/living/basic/carp, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"Ed" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ef" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Eg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ek" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"El" = ( -/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/vomit/old, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"En" = ( -/obj/machinery/hydroponics/soil, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Eq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Er" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Et" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Eu" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Ex" = ( -/obj/effect/turf_decal/vg_decals/atmos/mix, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ez" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"EA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"EB" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"EE" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "ptcomms"; - name = "shutter controls" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"EJ" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"EN" = ( -/obj/structure/sign/warning/deathsposal, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"EQ" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptobservatory" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/observ) -"EV" = ( -/obj/structure/curtain, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"EW" = ( -/mob/living/basic/carp/mega, -/turf/open/space/basic, -/area/template_noop) -"EY" = ( -/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/blue{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Fb" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Fe" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Crew Storage" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Fh" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fk" = ( -/obj/structure/table/reinforced, -/obj/item/storage/pouch/ammo, -/obj/item/storage/pouch/ammo, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Fl" = ( -/obj/item/electronics/apc, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/item/electronics/airlock, -/obj/item/electronics/airalarm, -/obj/item/electronics/airalarm, -/obj/structure/closet/crate/engineering/electrical{ - name = "electronics crate" - }, -/obj/item/electronics/tracker, -/obj/item/stack/cable_coil, -/obj/item/clothing/gloves/color/yellow, -/obj/item/circuitboard/computer/atmos_control/tarkon/carbon_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/mix_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/nitrogen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/incinerator, -/obj/item/circuitboard/computer/atmos_control/tarkon/oxygen_tank, -/obj/item/circuitboard/computer/atmos_control/tarkon/plasma_tank, -/obj/item/circuitboard/computer/tarkon_driver, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Fm" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Fo" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Fr" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Fs" = ( -/obj/machinery/airlock_sensor/incinerator_tarkon{ - pixel_x = 6; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ft" = ( -/obj/item/solar_assembly, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"FB" = ( -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"FC" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"FE" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/template_noop) -"FG" = ( -/obj/item/shovel, -/turf/open/misc/asteroid/airless, -/area/ruin/space/has_grav) -"FN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/item/encryptionkey/headset_cargo/tarkon, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"FS" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/enzyme, -/obj/item/reagent_containers/condiment/sugar, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"FT" = ( -/obj/machinery/power/turbine/core_rotor{ - dir = 4; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"FU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"FX" = ( -/obj/structure/table, -/obj/item/multitool, -/obj/item/storage/belt/utility/full, -/obj/item/paper/fluff/ruins/tarkon/designdoc, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"FY" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptporthall" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/porthall) -"FZ" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gd" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Gf" = ( -/obj/structure/table/wood, -/obj/machinery/light/dim/directional/east, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gk" = ( -/obj/machinery/door/airlock/multi_tile/public/glass{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/comms) -"Gl" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/paper/crumpled/fluff/tarkon, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Gp" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Gs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gt" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/firealarm/directional/south{ - pixel_y = -31 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Gu" = ( -/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/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Gv" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/reagentgrinder, -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Gx" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Gy" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"GB" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/nitrous_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GE" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"GF" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"GR" = ( -/obj/machinery/door/airlock/engineering{ - name = "Backup Generator Room" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"GS" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/small/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"GT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/item/broken_bottle, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"GU" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"GW" = ( -/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/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"GY" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Ha" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Hb" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hc" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Hf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Hi" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/obj/item/clothing/neck/mantle, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Hk" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Hm" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Hn" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ho" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Hr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ht" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Hy" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/mining) -"HB" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"HF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"HH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"HO" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"HQ" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/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/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"HS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"HU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"HW" = ( -/obj/machinery/door/airlock/public, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"HX" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"HY" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ib" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Ic" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Id" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ie" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"If" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Ih" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid, -/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/ruin/space/has_grav/port_tarkon/storage) -"Ij" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Ik" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/obj/structure/chair/comfy/black, -/obj/effect/mob_spawn/ghost_role/human/tarkon/sci, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Il" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Im" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/random{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "ptdorm2"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/cyan, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Io" = ( -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Iw" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) -"Ix" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"ID" = ( -/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/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IE" = ( -/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/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"IG" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, -/obj/item/circuitboard/machine/rtg, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"IH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IK" = ( -/obj/structure/closet, -/obj/item/pickaxe/mini, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/mask/gas/explorer, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/gps/mining, -/obj/item/storage/bag/ore, -/obj/item/storage/belt/mining, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"IL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"IO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"IP" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"IQ" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"IU" = ( -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"IW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"IY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Jc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Ji" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jj" = ( -/obj/machinery/power/smes/engineering{ - charge = 0 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Jl" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/security/skyrat/utility/redsec, -/obj/item/clothing/under/rank/security/skyrat/utility, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/storage/backpack/duffelbag/sec, -/obj/item/storage/backpack/duffelbag/sec/redsec, -/obj/item/storage/backpack/satchel/sec/redsec, -/obj/item/storage/backpack/security/redsec, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jm" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Jp" = ( -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Jq" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ju" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Jv" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Jw" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Jx" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Jz" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/destructive_analyzer, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"JB" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"JE" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"JF" = ( -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"JI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JL" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/dim/directional/west, -/obj/item/paper_bin, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"JN" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Engineering External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"JO" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/random, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "ptdorm3"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/black, -/area/ruin/space/has_grav/port_tarkon/dorms) -"JQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"JT" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"JW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"JX" = ( -/obj/structure/table, -/obj/item/paper/crumpled, -/obj/effect/turf_decal/tile/blue/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"JY" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/closet/secure_closet/medical2{ - req_access = list("medical") - }, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Kc" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 1; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/driverpitch, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ke" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Kf" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Kg" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ki" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kj" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Kk" = ( -/obj/machinery/door/airlock/wood/glass, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Kl" = ( -/obj/machinery/light/directional/north, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kp" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Kr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ks" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KA" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KB" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/mining/glass, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"KE" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight, -/obj/effect/turf_decal/tile/yellow/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"KG" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/port_tarkon/mining) -"KJ" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/item/defibrillator, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"KL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"KM" = ( -/obj/machinery/button/ignition/incinerator/tarkon, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"KO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"KP" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/stockparts/basic, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"KQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KS" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"KU" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KV" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/machinery/door/window/left/directional/east{ - opacity = 1 - }, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"KW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"KZ" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"La" = ( -/obj/structure/chair/sofa/corp{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ld" = ( -/obj/machinery/door/airlock/public/glass/incinerator/tarkon_exterior, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Le" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Lf" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Lg" = ( -/obj/effect/decal/cleanable/confetti, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Lm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Lo" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/machinery/door/poddoor/shutters{ - id = "tarkonouter"; - name = "External Bay Shutters" - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"Lp" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Lr" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ls" = ( -/obj/machinery/iv_drip, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/blue/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Ly" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"LA" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/rank/rnd/scientist/skyrat/utility, -/obj/item/clothing/under/rank/rnd/roboticist/skyrat/sleek, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/storage/backpack/duffelbag/science, -/obj/item/storage/backpack/duffelbag/science/robo, -/obj/item/storage/backpack/satchel/science, -/obj/item/storage/backpack/satchel/science/robo, -/obj/item/storage/backpack/science, -/obj/item/storage/backpack/science/robo, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"LD" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"LG" = ( -/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/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"LH" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"LJ" = ( -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"LN" = ( -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"LQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"LS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"LW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"LY" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/pen/fountain, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Me" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/power/smes, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Mi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Mn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Mp" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Mr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"Mt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/curtain, -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Mu" = ( -/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/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Mz" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MB" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MC" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"MD" = ( -/obj/machinery/atmospherics/miner/plasma, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"ME" = ( -/obj/effect/turf_decal/tile/purple/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"MF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"MG" = ( -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"MJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"MO" = ( -/obj/structure/safe/floor, -/obj/item/areaeditor/blueprints/tarkon, -/obj/item/tape/ruins/tarkon/safe, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"MS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"MU" = ( -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"MV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"MY" = ( -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/confetti, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Ng" = ( -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Ni" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Nj" = ( -/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/solid, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Nl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Nq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/table/rolling, -/obj/item/surgery_tray/full, -/obj/item/clothing/gloves/latex{ - pixel_y = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Nr" = ( -/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/ruin/space/has_grav/port_tarkon/forehall) -"Nt" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Nw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nx" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/flash, -/obj/item/assembly/flash, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Nz" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/iron/fifty, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"NF" = ( -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"NG" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NH" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"NK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/dark/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"NL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"NM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"NN" = ( -/obj/structure/bed/maint, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"NR" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"NU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"NX" = ( -/obj/structure/rack, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/item/gun/ballistic/automatic/m6pdw, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Oa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Ob" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "tarkon_turbine" - }, -/obj/structure/cable, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Oi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Oj" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp, -/obj/effect/spawner/random/clothing/beret_or_rabbitears, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Om" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"On" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Oo" = ( -/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/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Oq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Os" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ow" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Ox" = ( -/obj/structure/table/wood/fancy/blue, -/obj/effect/turf_decal/tile/blue/half{ - dir = 1 - }, -/obj/item/dice, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"OB" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"OD" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"OF" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"OG" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"OI" = ( -/obj/machinery/light/dim/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"OM" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/comms) -"OQ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"OR" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"OS" = ( -/obj/structure/cable, -/obj/item/solar_assembly, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"OT" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"OZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pa" = ( -/obj/structure/bed/double/pod, -/obj/item/bedsheet/random/double, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/fancy_pillow, -/obj/item/fancy_pillow, -/obj/machinery/button/door/directional/north{ - id = "ptdorm4"; - name = "Door Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Pc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Pf" = ( -/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/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Pl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Pp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Pq" = ( -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ps" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Px" = ( -/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/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Pz" = ( -/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/ruin/space/has_grav/port_tarkon/afthall) -"PB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PE" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"PF" = ( -/obj/machinery/door/firedoor/solid/closed, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"PK" = ( -/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/solid, -/obj/machinery/door/airlock/atmos/glass, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PM" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"PO" = ( -/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/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"PP" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"PQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"PR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"PS" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Financing Console" - }, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"PT" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"PZ" = ( -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Qg" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/atmospherics/pipe/layer_manifold/pink/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qh" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Qi" = ( -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Qk" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qn" = ( -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Qo" = ( -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qp" = ( -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Qs" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Qu" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/machinery/computer/atmos_control/tarkon/plasma_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Qx" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/power1) -"Qy" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/suit_storage_unit/industrial/hauler, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QA" = ( -/obj/machinery/door/window/left/directional/north, -/obj/machinery/door/window/left/directional/south, -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QB" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QC" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"QD" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"QH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input/tarkon{ - dir = 4 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QL" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"QP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/machinery/meter, -/obj/structure/cable, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"QW" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"QX" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/closet/crate/secure/science, -/obj/item/raw_anomaly_core/random, -/obj/item/raw_anomaly_core/random, -/obj/item/raw_anomaly_core/random, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"QY" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/component_printer, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ra" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Rc" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/servo, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rf" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input/tarkon{ - dir = 8 - }, -/turf/open/floor/engine/n2o, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rg" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rh" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Rk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Rm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Turbine Maintenance Door" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Rp" = ( -/obj/machinery/vending/dorms, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Rq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Rr" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/engineering/glass{ - name = "P-T Tool Storage" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Rx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"RB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"RC" = ( -/obj/effect/turf_decal/tile/blue/half, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"RE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/has_grav/port_tarkon/storage) -"RH" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RI" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/circuit_imprinter/offstation, -/obj/effect/turf_decal/tile/purple/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RJ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"RK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"RL" = ( -/obj/structure/fluff/empty_sleeper, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"RM" = ( -/mob/living/basic/carp, -/turf/open/space/basic, -/area/template_noop) -"RO" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/item/areaeditor/blueprints/slime, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/structure/closet/crate/secure/science, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"RU" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"RX" = ( -/obj/structure/table, -/obj/item/clothing/head/utility/welding, -/obj/item/clothing/gloves/color/yellow, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"RY" = ( -/obj/effect/turf_decal/vg_decals/atmos/plasma, -/obj/machinery/light/small/directional/east, -/obj/machinery/air_sensor/tarkon/plasma_tank{ - pixel_x = 26 - }, -/turf/open/floor/engine/plasma, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Sa" = ( -/obj/structure/frame/machine, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/item/circuitboard/machine/ore_redemption, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sb" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Se" = ( -/obj/structure/trash_pile, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Sf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Sk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Sn" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/titanium{ - amount = 30 - }, -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sp" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sq" = ( -/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/blue/half{ - dir = 1 - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/comms) -"Su" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Sv" = ( -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Sw" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/dorms) -"SG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/machinery/door/window/brigdoor/left/directional/north, -/obj/item/paper_bin{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"SI" = ( -/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/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SK" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"SL" = ( -/obj/machinery/shower/directional/east, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/obj/machinery/door/window/right/directional/north{ - opacity = 1 - }, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SM" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"SQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/structure/closet/crate, -/obj/item/storage/belt/utility, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/head/utility/hardhat/orange, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"ST" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"SU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/observ) -"SV" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/item/folder/red, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"SW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SX" = ( -/obj/effect/decal/cleanable/ash, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"SY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"SZ" = ( -/obj/structure/table/reinforced, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Tb" = ( -/obj/machinery/light/dim/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/structure/rack/shelf, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Te" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ti" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Tk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Tl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/forehall) -"To" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/clothing/under/rank/engineering/engineer/skyrat/utility, -/obj/item/storage/backpack/industrial, -/obj/item/storage/backpack/duffelbag/engineering, -/obj/item/storage/backpack/satchel/eng, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Ts" = ( -/obj/structure/closet/crate, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Tx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Tz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"TF" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"TH" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/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/neutral/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TJ" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"TL" = ( -/obj/machinery/power/solar_control{ - dir = 1; - id = "aftport"; - name = "Station Solar Control" - }, -/obj/structure/cable, -/obj/item/paper/guides/jobs/engi/solars, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"TM" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"TP" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"TQ" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"TT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/storage/box/stockparts/basic, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/glass{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"TV" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"TW" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"TX" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/machinery/light/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Ua" = ( -/obj/structure/safe/floor, -/obj/item/stack/sheet/bluespace_crystal{ - amount = 5 - }, -/obj/item/stack/sheet/mineral/diamond{ - amount = 10 - }, -/obj/item/weldingtool/abductor, -/obj/item/circuitboard/machine/bluespace_miner, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/paper/fluff/ruins/tarkon/coupplans, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ud" = ( -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/obj/item/mod/module/springlock, -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Uf" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/circuitboard/machine/anomaly_refinery, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Ug" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/structure/chair/greyscale{ - dir = 1 - }, -/obj/effect/mob_spawn/ghost_role/human/tarkon/sec{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Uh" = ( -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Un" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Up" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Ur" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"Ut" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Uv" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Uw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Ux" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Uz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"UG" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"UI" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"UJ" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/solars/tarkon) -"US" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"UV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"UX" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"UZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"Vc" = ( -/obj/machinery/door/airlock/research, -/obj/machinery/door/firedoor/solid, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"Vi" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav) -"Vj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vk" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/clothing/under/rank/captain/skyrat/utility, -/obj/item/storage/backpack/duffelbag/blueshield, -/obj/item/storage/backpack/blueshield, -/obj/item/storage/backpack/satchel/blueshield, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Vl" = ( -/obj/effect/turf_decal/tile/purple/half{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Vm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Vn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Vw" = ( -/obj/structure/sign/warning/no_smoking, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Vx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet/purple, -/area/ruin/space/has_grav/port_tarkon/dorms) -"Vy" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Vz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VE" = ( -/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/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"VG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"VH" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VK" = ( -/obj/effect/turf_decal/tile/blue/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"VN" = ( -/obj/effect/decal/cleanable/confetti, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/porthall) -"VO" = ( -/obj/machinery/light/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"VP" = ( -/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/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"VS" = ( -/obj/machinery/atmospherics/miner/oxygen, -/turf/open/floor/engine/o2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"VT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"VU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"VV" = ( -/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, -/area/ruin/space/has_grav/port_tarkon/forehall) -"Wa" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav) -"Wc" = ( -/obj/effect/turf_decal/sand, -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Wd" = ( -/obj/effect/turf_decal/vg_decals/atmos/nitrogen, -/obj/machinery/light/small/directional/west, -/obj/machinery/air_sensor/tarkon/nitrogen_tank{ - pixel_x = -26 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/has_grav/port_tarkon/atmos) -"We" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 4; - name = "Broken Computer" - }, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/item/paper/fluff/ruins/tarkon/goals, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Wh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Wn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/computer/cryopod/tarkon/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Wp" = ( -/obj/machinery/vending/snack/teal, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Wq" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Ws" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Wt" = ( -/turf/closed/mineral/random, -/area/awaymission) -"Wu" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/cargo) -"Ww" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/module_duplicator, -/obj/effect/turf_decal/tile/purple/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WB" = ( -/obj/machinery/power/solar, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"WC" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/mix_tank{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"WE" = ( -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"WJ" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"WM" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/oven/range, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"WO" = ( -/obj/structure/table/reinforced, -/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/ruin/space/has_grav/port_tarkon/centerhall) -"WP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/shutters{ - id = "ptatmos" - }, -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"WQ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WU" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/porthall) -"WW" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"WY" = ( -/turf/open/space/basic, -/area/template_noop) -"Xb" = ( -/obj/structure/cable, -/obj/machinery/power/solar, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Xc" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"Xh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Xj" = ( -/obj/machinery/door/airlock/multi_tile/public/glass, -/obj/machinery/door/firedoor/solid, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"Xn" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Xq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Xr" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"Xw" = ( -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/observ) -"Xy" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Xz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"XD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"XE" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/garden) -"XH" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"XI" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/delivery/blue, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XJ" = ( -/obj/machinery/door/firedoor/solid, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"XN" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/forehall) -"XO" = ( -/obj/structure/fluff/empty_sleeper{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"XS" = ( -/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/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"XT" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"XV" = ( -/obj/effect/spawner/random/trash/food_packaging, -/obj/machinery/button/door{ - id = "ptafthall"; - name = "shutter controls"; - pixel_x = -26 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/afthall) -"XZ" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav) -"Yb" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"Yc" = ( -/obj/item/solar_assembly, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/asteroid/airless, -/area/solars/tarkon) -"Yf" = ( -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Yk" = ( -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Yl" = ( -/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/tile/neutral/half{ - dir = 4 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Yp" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"Yr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Yt" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"Yu" = ( -/obj/effect/turf_decal/tile/red/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/secoff) -"Yv" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/small/directional/east, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/ruin/space/has_grav/port_tarkon/garden) -"Yy" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/folder/blue, -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/comms) -"YB" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YC" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/no_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/wood/large, -/area/ruin/space/has_grav/port_tarkon/dorms) -"YD" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"YF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/turf_decal/tile/purple/half, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"YK" = ( -/obj/effect/spawner/structure/window/reinforced/no_firelock, -/obj/machinery/door/poddoor/shutters{ - id = "ptcomms" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/comms) -"YT" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/cargo) -"YW" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/starboardhall) -"YZ" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/directional/east, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Za" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/purple/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zc" = ( -/turf/closed/mineral/random/high_chance, -/area/solars/tarkon) -"Zi" = ( -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"Zl" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"Zm" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/anticorner{ - dir = 1 - }, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"Zp" = ( -/obj/structure/table/reinforced, -/obj/item/storage/belt/utility, -/obj/effect/turf_decal/tile/yellow/half{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/toolstorage) -"Zq" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zr" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/anticorner{ - dir = 8 - }, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"Zv" = ( -/obj/machinery/door/window/left/directional/west, -/obj/item/broken_bottle, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zw" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/computer/atmos_control/tarkon/nitrous_tank{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/atmos) -"Zy" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/trauma) -"ZA" = ( -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZC" = ( -/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/tile/neutral/anticorner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/centerhall) -"ZE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/has_grav/port_tarkon/kitchen) -"ZG" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZH" = ( -/obj/structure/cable, -/obj/structure/rack, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/turf_decal/tile/yellow/half, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/power1) -"ZJ" = ( -/turf/open/misc/asteroid/airless, -/area/awaymission) -"ZK" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/curtain, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZN" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/afthall) -"ZO" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/port_tarkon/developement) -"ZS" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/effect/decal/cleanable/confetti, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZU" = ( -/obj/machinery/door/airlock/mining/glass, -/obj/structure/cable, -/obj/machinery/door/firedoor/solid, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/mining) -"ZV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon/storage) -"ZX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/solid, -/obj/structure/cable, -/obj/modular_map_connector, -/turf/open/floor/iron, -/area/ruin/space/has_grav/port_tarkon) -"ZY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/floor/carpet/red, -/area/ruin/space/has_grav/port_tarkon/dorms) - -(1,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(2,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(3,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -RM -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -RM -WY -WY -"} -(4,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(5,1,1) = {" -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(6,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -Eb -zo -zo -zo -Wa -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -"} -(7,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -iv -zo -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -sv -Wa -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(8,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -iI -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -WY -"} -(9,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -zo -EQ -EQ -EQ -WU -WU -WU -WU -WU -WU -WU -WU -WU -WU -WU -WU -FY -FY -FY -FY -WU -WU -WU -xt -xt -WP -Vw -xt -xt -xt -xt -xt -xt -xt -xt -xt -xt -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(10,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -zo -EQ -EQ -EQ -Uw -oG -jg -bK -bK -hy -bK -bK -bK -IY -oe -hz -RB -jv -uV -RB -RB -RB -Kf -RB -VN -gp -df -jB -og -lH -pA -yC -lH -Wd -nm -lH -rL -VS -lH -sv -sv -sv -zo -zo -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -WY -"} -(11,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -EQ -EQ -Uw -eu -Uw -qe -WU -rW -hN -UZ -wt -QD -UZ -hN -UZ -UZ -QD -UZ -ow -UZ -Ef -UZ -QD -hN -RB -PK -dC -eb -lp -lH -te -QH -lH -sj -jj -lH -oI -AF -lH -sv -jO -iB -zo -zo -zo -sv -sv -sv -sv -sv -sv -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(12,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -De -sK -bq -Uw -xN -qe -vz -QD -pj -Ib -UZ -UZ -mq -UZ -ow -UZ -UZ -UZ -Ib -QD -pj -FC -UZ -UZ -jc -gp -SM -CP -mo -lH -ts -NK -lH -xp -NK -lH -Bj -NK -lH -xt -GE -xt -zo -WY -zo -xt -sv -Wa -sv -sv -Wa -Wa -Wa -WY -WY -WY -WY -WY -WY -"} -(13,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -KS -yl -La -eu -Uw -Uw -hH -nP -nP -nP -nP -Vc -li -nP -nP -nP -nP -nP -nP -nP -nP -nP -nP -cX -AN -Et -xt -hi -Qd -VG -WC -Bi -HU -mc -iG -ad -qk -kr -hM -iw -Fr -Gp -xt -xt -kS -cd -xt -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -RM -WY -WY -WY -WY -"} -(14,1,1) = {" -WY -WY -RM -WY -WY -WY -WY -zo -zo -EQ -EQ -NH -dt -at -Uw -Uw -Uw -as -nP -Ik -yz -kT -On -vs -On -xu -ZO -NF -gu -Za -wQ -fV -mM -nP -UZ -ow -Sf -xt -dl -CP -SM -VG -VG -VG -VG -SM -aH -zV -VG -aH -AA -gs -wW -Ld -sc -Ex -xB -xt -Wa -Wa -sv -Wa -sv -Wa -Wa -zo -WY -WY -WY -WY -WY -"} -(15,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -zo -EQ -kp -Uw -LW -Uw -Uw -Uw -eu -qe -nP -Uf -YI -lF -YI -YI -eo -RH -ZO -QY -fG -YI -nh -YI -Ed -nP -Ht -Mi -bK -xt -An -jJ -zc -VG -zV -VG -VG -VG -VG -VG -SM -VG -bn -xt -Fs -xt -Ak -MU -eZ -xt -zo -sv -Wa -sv -sv -Wa -zo -zo -WY -WY -WY -WY -WY -"} -(16,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -EQ -eu -bX -Ws -Oi -Oi -Oi -Oi -qe -nP -ef -YI -UV -YI -YI -Id -RH -ZO -KP -Ic -YI -yO -xY -vB -nP -UZ -MS -bK -xt -pW -Un -VG -VG -SM -VG -PP -VG -VG -VG -VG -kd -lI -KM -UI -xt -xt -sa -xt -xt -zo -zo -Wa -sv -Wa -Wa -zo -zo -WY -WY -RM -WY -WY -"} -(17,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -EQ -Xw -Uw -lr -Gl -Ez -bT -Uw -MJ -qe -nP -fa -yG -UV -YI -YI -Id -RH -ZO -Ww -Xh -YI -As -Id -EJ -Vc -UZ -QD -BX -xt -IG -Un -VG -VG -VG -VG -VG -VG -VG -SM -VG -VG -Fh -Zq -hP -QW -Rm -FT -sL -zo -Wa -Vi -sv -sv -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(18,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -EQ -Cx -Uw -jF -Gf -gE -QL -RJ -ml -qe -nP -QX -YI -Er -Er -Er -Er -sr -ZO -PM -pD -YI -YI -Id -RH -nP -ow -UZ -bK -xt -fv -Un -zV -VG -SM -VG -VG -SM -aH -VG -SM -VG -Fh -DD -wh -Ob -xt -zC -xt -zo -Vi -zo -nx -Wa -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(19,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -SU -SU -SU -SU -SU -SU -SU -eL -SU -HW -nP -pE -YI -YI -OZ -YI -RT -Sg -pY -ko -Qf -un -un -Az -tA -nP -xZ -UZ -bK -xt -VG -lu -VG -aH -VG -aH -VG -VG -VG -VG -VG -SM -NG -zT -Ti -eQ -xt -Ke -cd -zo -Vi -zo -zo -zo -tt -zo -zo -zo -WY -WY -WY -WY -WY -"} -(20,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -zo -Wa -sv -sv -Wa -Wa -Wa -kf -DR -cs -Rk -nP -CB -VU -VU -pa -VU -VU -YF -ZO -TJ -Id -YI -YI -DK -bm -nP -UZ -Ib -Sf -xt -OD -qA -Un -Un -Un -Un -lu -Un -Un -lu -VG -VG -jG -lQ -aZ -OQ -xt -WY -zo -zo -sv -FG -nx -nx -Wa -zo -zo -zo -WY -WY -WY -WY -WY -"} -(21,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -Wa -sv -Wa -sv -kf -KU -JB -Rk -nP -Gv -gt -YI -OZ -rG -YI -Su -ZO -yx -fJ -YI -YI -DQ -Pf -HQ -tQ -UZ -hy -xt -SM -VG -aH -Zw -Zm -Rg -oQ -PB -cv -Qu -uK -XH -Me -hf -hf -xt -xt -zo -zo -sv -Wa -Wa -zb -kA -kF -zo -zo -zo -WY -WY -WY -WY -WY -"} -(22,1,1) = {" -WY -WY -WY -RM -WY -zo -zo -Wa -Wa -Wa -Wa -Wa -sv -Wa -kf -VO -DR -Rk -nP -xT -YI -YI -OZ -rG -YI -RH -ZO -cc -TT -uw -YI -rF -Ni -nP -tQ -UZ -OI -xt -ST -Zv -IP -lH -NK -ub -lH -NK -lV -lH -NK -Qg -lH -xt -xt -xt -sv -sv -sv -sv -Wa -LJ -UJ -UJ -rg -av -MG -LJ -WY -WY -WY -WY -WY -"} -(23,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -sv -sv -sv -sv -sv -kf -sI -zB -Rk -nP -oc -yG -OZ -OZ -rG -YI -no -ZO -PM -YI -YI -YI -uw -Sn -nP -tQ -QD -PQ -xt -vO -pc -HO -lH -Rf -ld -lH -pU -xj -lH -Qk -fR -lH -sv -sv -sv -sv -Wa -Zc -LJ -rg -av -MG -UJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(24,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -jN -JB -Rk -nP -RO -YI -OZ -YI -ZK -Sp -lw -ZO -RI -Jz -sN -rH -Cw -aY -nP -tQ -Mi -bK -xt -uh -uh -Fo -lH -GB -vp -lH -om -hR -lH -RY -MD -lH -sv -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -Xb -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(25,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -kf -DR -DR -Tx -db -nS -VU -pa -VU -WW -Xy -mi -rh -rh -rh -rh -rh -rh -rh -WU -tE -tQ -Sf -xt -xt -xt -xt -xt -xt -xt -xt -xt -xt -bO -xt -xt -xt -GY -sv -sv -sv -LJ -LJ -LJ -Qn -UJ -IL -LJ -Ft -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(26,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -kf -ce -DR -dB -db -PM -WQ -OZ -tz -RH -Xy -KE -Zp -gv -hw -lU -RU -pJ -wC -WU -QD -MS -Sj -WU -uC -ag -YZ -Up -SL -KV -Iw -zm -UX -wa -cK -CI -Ck -Iw -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -gX -Mr -WB -LJ -WY -WY -WY -WY -WY -"} -(27,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -kf -JB -KU -Rk -db -Te -Zi -OZ -lj -bj -Xy -eE -HF -oK -HF -kJ -FU -FN -rh -WU -Qs -AN -hA -WU -Ki -vR -iq -iq -xW -iq -Iw -xL -MO -Jj -BS -CV -ZH -EN -zo -zo -zo -LJ -LJ -LJ -Bk -UJ -ye -LJ -gX -UJ -ye -LJ -WY -WY -RM -WY -WY -"} -(28,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -sv -kf -LH -KW -Rk -db -PM -kx -OZ -iU -Kj -Xy -rz -HF -fl -rE -bD -yY -ak -yY -VH -ro -CA -ep -Kg -Ki -MC -Ki -xW -iq -Up -Iw -zW -CV -zJ -BS -HS -BW -Qx -Qx -Qx -Qx -av -av -av -OR -UJ -uU -av -qi -UJ -uU -av -WY -WY -WY -WY -WY -"} -(29,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -kf -DR -DR -Tx -db -PM -Cf -OZ -jE -RH -Xy -CX -VT -OT -dZ -yY -yY -kO -dT -ul -SY -Eg -SY -Uz -ro -MB -Ki -Ki -XE -aq -Iw -vj -Yb -VE -AM -IO -BW -JN -xP -xP -gn -Mr -UJ -UJ -UJ -UJ -UJ -UJ -UJ -UJ -Mr -OS -WY -WY -WY -WY -WY -"} -(30,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -Wa -kf -DR -DR -ed -db -DO -wx -OZ -YB -Yf -Xy -rV -OT -pt -yY -yY -Dc -bi -Hn -JT -di -TP -xU -xU -XS -on -IE -Ki -Ki -Iw -Iw -Iw -Iw -Iw -ge -HS -TL -Qx -Qx -Qx -Qx -Gy -Gy -Gy -Hb -Mr -Al -Gy -Pl -UJ -fw -Gy -WY -WY -WY -WY -WY -"} -(31,1,1) = {" -WY -WY -RM -WY -WY -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -kf -DR -JB -Pc -db -fh -Ua -OZ -tz -RH -Xy -TV -yF -yY -yY -Zn -oC -yj -uv -uv -uv -uv -uv -uv -ly -IQ -AT -IE -Fb -dy -Fm -lA -hZ -Iw -aX -HS -my -Qx -zo -zo -zo -LJ -LJ -LJ -Ft -UJ -IL -LJ -gX -Mr -co -LJ -WY -WY -WY -WY -WY -"} -(32,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -Wa -sv -kf -vq -DR -Rk -db -Te -Zi -UV -lj -Kj -Xy -JF -lt -Rr -VH -jz -PZ -uv -uv -hm -Vk -uv -Vj -XO -ly -ly -Sv -qv -rA -GR -xP -ps -eD -Iw -iM -pH -FX -Qx -zo -zo -zo -LJ -LJ -LJ -Qn -UJ -IL -LJ -Yc -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(33,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -kf -DR -hB -Rk -db -HY -Vl -jM -GU -ME -Xy -wC -rh -yY -bV -dX -Qp -uv -lS -oV -Vj -uv -Lg -UG -Vj -ly -cT -Xq -gl -bz -Iw -lK -Ha -Iw -pf -VE -RX -Iw -zo -zo -zo -LJ -LJ -LJ -wV -UJ -ye -LJ -Qn -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(34,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -Wa -Wa -sv -Wa -kf -Cq -Cq -Cp -db -db -db -db -db -db -yd -kf -kf -NM -jz -rw -uv -uv -LA -Vj -Jp -uv -Vj -WJ -zA -uv -uv -ww -iO -MB -Iw -Iw -Iw -Iw -Iw -Au -Iw -Iw -ZN -of -of -LJ -LJ -LJ -Qn -UJ -co -LJ -Qn -Mr -If -LJ -WY -WY -WY -WY -WY -"} -(35,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -XN -DR -Tx -XJ -fK -WE -sM -WE -eG -Eu -WE -BI -DS -yB -PZ -Fe -oV -lC -ux -pv -uv -RL -Vj -Vj -oV -mC -ab -SY -PZ -lx -LN -CR -ct -mu -Pz -LN -jr -XV -Wp -of -of -LJ -LJ -aF -Gy -Ho -LJ -At -Mr -ye -LJ -WY -WY -WY -WY -WY -"} -(36,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -kf -sI -cs -Rk -Tl -WE -WE -Uh -WE -Uh -WE -WE -Tl -qb -SW -Qo -uv -fp -Vj -uD -dq -hr -SK -Vj -lC -uH -uv -XI -Oo -Vz -ZM -By -LN -tI -Qi -Pz -By -LN -Eq -LN -yv -of -of -LJ -LJ -LJ -LJ -LJ -aF -Gy -Ho -LJ -WY -WY -WY -WY -WY -"} -(37,1,1) = {" -WY -WY -WY -WY -RM -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -kf -KU -eY -Rk -Nj -VV -VV -Oq -Lm -kG -Nr -ek -dh -VP -AX -PZ -Fe -Vj -oV -sm -lT -uv -Vj -Xc -Vj -WJ -ZX -PO -ID -DA -JW -Pz -xo -pM -NU -Pz -GT -fP -Il -fP -Qi -Jx -of -zo -zo -zo -zo -zo -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(38,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -kf -VO -DR -tp -kf -kf -kf -kf -Gx -kf -kf -kf -kf -GW -LG -PZ -uv -uv -Jl -Vj -FB -uv -RL -Vj -zA -uv -uv -Sv -qL -KA -hj -hj -hj -hj -hj -Ut -ZN -OM -OM -Sq -Gk -OM -OM -YK -YK -YK -zo -zo -zo -zo -zo -zo -WY -WY -RM -WY -WY -"} -(39,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -kf -DR -JB -Rk -kf -nZ -jZ -jZ -bt -jZ -SX -ug -kf -Ki -mH -kb -BV -uv -tT -Vj -Lg -uv -TM -lC -Vj -ly -xc -VA -gl -KA -OB -Gd -kI -oq -hj -kk -oL -OM -yy -EY -wY -DZ -zL -pw -We -YK -YK -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(40,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -kf -cs -KU -Rk -kf -Se -Fl -mt -Cm -by -Nz -kU -Se -Ki -TH -LG -sn -uv -uv -To -rk -uv -Vj -et -ly -ly -Sv -ID -ZC -WO -Ek -zs -ck -pd -hj -oL -oL -OM -Ox -fL -dw -Af -WD -WD -Ie -gk -ke -YK -zo -zo -zo -zo -WY -WY -WY -WY -WY -"} -(41,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -Wa -sv -sv -Wa -sv -Wa -kf -DR -DR -dB -cV -cV -cV -cV -cV -cV -cV -cV -cV -Ki -Fb -GW -kc -MB -uv -uv -uv -uv -uv -uv -ly -Yk -oN -qL -KA -KA -sl -Ra -mO -pd -hj -mr -am -OM -CW -fL -WD -WD -WD -Af -WD -Af -cr -YK -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(42,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -Wa -Wa -sv -Wa -Wa -kf -DR -DR -Rk -cV -GF -Ls -wc -KJ -fI -Bp -vN -Zr -Ki -Ki -tH -GW -Ci -ff -ro -Mp -CG -ro -br -ro -oN -to -qL -KA -kN -Ra -Vg -AC -SZ -hj -OG -Xr -OM -vo -Hr -WD -WD -mX -WD -WD -uN -oS -Kc -YK -zo -zo -zo -WY -WY -WY -WY -WY -"} -(43,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -sv -kf -JB -KQ -ed -cV -EV -IW -HX -gd -Zy -zZ -Nq -RC -Ki -ai -tH -tH -ik -xU -eg -SY -SY -ID -XS -Yl -xU -xU -ZC -tk -IU -WM -sl -iy -FS -hj -YT -YT -OM -vG -zl -Ch -Ch -wG -Yy -kW -Ch -tn -FR -YK -YK -zo -zo -WY -WY -WY -WY -WY -"} -(44,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -Wa -kf -vU -DR -Rk -iA -xi -xi -ha -Ae -Ae -Ae -yS -nu -Ki -ta -Jq -Ki -jP -Ki -Kp -Hn -Yr -SI -gJ -gJ -gJ -Px -lR -gJ -gJ -hj -po -ZE -KZ -hj -Rp -Dk -OM -kq -Af -Tk -WD -Yt -mK -gW -PE -Tk -oH -hL -YK -zo -zo -WY -WY -WY -WY -WY -"} -(45,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -kf -VO -KW -Tx -Lr -Zy -ga -gd -gd -gd -gd -IH -ah -Ki -Kl -RK -Wn -SY -Ki -Ki -iT -US -nb -gJ -Uv -Hm -KO -XG -En -GS -hj -nc -Jc -Ju -hj -rZ -nL -OM -ut -OF -Hc -ry -VK -EE -SV -OF -TX -an -JX -YK -zo -zo -WY -WY -WY -WY -WY -"} -(46,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -kf -Cq -Cq -NL -cV -EV -Mt -gd -Zy -gd -mD -aS -ah -Ki -vF -AX -EA -cA -Jq -Ki -DN -LS -Hg -gJ -XT -Gs -KO -Ly -sX -Uv -ft -Ra -td -Ju -hj -YT -tC -QC -QC -QC -QC -ZG -ZG -ZG -ZG -ZG -ZG -ZG -ZG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(47,1,1) = {" -WY -WY -WY -RM -WY -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -kf -cs -DR -VJ -cV -ku -EB -hE -rv -vl -JY -bF -ba -Ki -Mz -jA -vd -QP -Jq -Ki -Bg -fU -SP -Xj -yn -Cu -go -Nt -sX -XG -Tz -sl -FZ -dW -hj -ru -gP -TF -JL -Qy -QB -ng -nF -Sb -Jm -NR -Sb -Sb -mG -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(48,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -kf -DR -DR -VJ -cV -cV -cV -cV -cV -cV -cV -cV -cV -Ki -AP -AP -AP -AP -AP -AP -JE -XD -Hg -bA -XG -XG -gb -iJ -sX -Rh -hj -Bn -hj -hj -hj -vm -jV -Wq -JI -JI -Lf -ng -MV -Dv -Dv -Dv -Ur -ZS -md -cu -zo -zo -WY -WY -RM -WY -WY -"} -(49,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -sv -sv -Wa -sv -sv -Wa -kf -DR -KW -VJ -kf -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -Wa -vC -HB -dA -eB -Nw -bg -AG -cU -vn -gJ -pP -yn -XG -XG -Vm -Gt -hj -uR -uR -hV -hj -Wu -kD -kD -kD -Ce -xO -Ih -qH -cQ -ZA -PR -rB -ng -oE -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(50,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -Wa -sv -sv -Wa -Wa -kf -PF -PF -Ks -kf -Wa -sv -sv -Wa -Wa -sv -Wa -sv -Wa -vC -LY -zt -Hf -Yu -gD -LS -Om -MF -gJ -rd -BC -pP -wX -XT -Yv -hj -uR -uR -hV -hj -fB -hQ -fB -fB -Rx -Lf -Pq -Gu -PR -PR -PR -dP -rK -RE -qh -zo -zo -WY -WY -WY -WY -WY -"} -(51,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -Wa -Wa -sv -kf -jZ -jZ -jZ -kf -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -sv -vC -qQ -Hk -Hf -Ud -gD -iT -US -mT -gJ -gJ -gJ -gJ -gJ -gJ -gJ -hj -hj -hj -hj -hj -Yp -vA -th -fB -LD -Lf -ng -ZV -PR -PR -PR -Io -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(52,1,1) = {" -WY -WY -WY -WY -WY -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -Wa -vC -bY -zt -lW -aU -gD -LS -LS -MF -LS -LS -bf -LS -LS -Om -LS -zp -AD -Ux -AD -YW -sd -MF -Vu -fB -LD -dE -ng -ui -PR -PR -ZA -dP -cE -jW -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(53,1,1) = {" -WY -WY -WY -WY -WY -Wa -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -vC -xH -Le -lW -pT -SG -Cv -cU -MF -LS -Om -LS -Ps -LS -Cv -Ow -zp -yD -LS -LS -Cv -Ps -MF -Da -QA -Qh -pl -ng -SQ -PR -PR -PR -dP -cE -jW -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(54,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -Wa -vC -ia -zt -lW -DP -vC -cn -Ow -MF -CY -qS -MF -MF -MF -ka -eK -fT -zM -Mu -zM -zM -jC -zM -MY -fB -PS -oy -ng -BF -PR -PR -PR -Io -cE -hu -Lo -zo -zo -WY -WY -WY -WY -WY -"} -(55,1,1) = {" -WY -WY -WY -WY -WY -zo -Wa -Wa -sv -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -vC -PT -zt -lW -Ug -vC -TW -TW -TW -eI -eI -eI -Kk -eI -eI -eI -Hy -yU -mV -yU -yU -ZU -yU -Hy -Hy -Hy -Hy -ng -vZ -PR -PR -ZA -dP -ym -KL -Ix -zo -zo -WY -WY -WY -RM -WY -"} -(56,1,1) = {" -WY -RM -WY -WY -WY -zo -zo -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -sv -sv -Wa -sv -sv -vC -jY -zt -lW -nk -ls -lW -EC -vC -Oj -tY -Jv -tc -Jv -Im -CS -Hy -in -Cc -zy -op -wZ -le -hl -Sk -zy -rD -ng -vE -cQ -PR -PR -Os -aP -aP -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(57,1,1) = {" -WY -WY -WY -WY -WY -zo -zo -Wa -sv -Wa -sv -sv -sv -Wa -Wa -Wa -Wa -sv -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -vC -NX -zt -lW -Yu -gD -JQ -NN -vC -Vx -Ji -Cy -El -tM -dv -Ij -Hy -Rc -Vn -nt -aT -Rq -aT -aT -Pp -Nl -sq -ng -Gb -Dv -nz -Dv -CM -Sb -Tb -cu -zo -zo -WY -WY -WY -WY -WY -"} -(58,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -sv -Wa -sv -Wa -Wa -Wa -vC -Fk -Oa -lW -cD -vC -vC -vC -vC -Jv -Jv -Jv -YC -Jv -Jv -Jv -Hy -Sa -Fq -LQ -LQ -os -LQ -Xz -Mn -dR -eM -ng -Ts -dk -uM -iC -gN -ZS -jU -ZG -zo -zo -WY -WY -WY -WY -WY -"} -(59,1,1) = {" -WY -WY -WY -WY -WY -WY -zo -zo -Wa -Wa -sv -sv -sv -Wa -sv -Wa -sv -sv -Wa -sv -Wa -Wa -sv -sv -sv -Wa -Wa -sv -vC -ph -zt -lW -Yu -gD -kR -kX -vC -xq -ov -ve -sw -lD -yA -ZY -Hy -hS -wm -cq -jo -TQ -CZ -Bo -Vy -gS -IK -ng -ng -ng -ng -ng -ng -ng -ng -ZG -zo -vQ -WY -WY -WY -WY -WY -"} -(60,1,1) = {" -WY -WY -WY -WY -WY -WY -uo -zo -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -sv -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -Wa -Wa -sv -vC -nW -Nx -Wh -CE -hY -IF -EC -vC -sD -JO -Jv -pX -Jv -Pa -Hi -zf -zf -zf -KB -CL -zf -zf -zf -zf -zf -zf -Hy -Wa -Wa -sv -sv -Wa -Wa -Wa -zo -vQ -FE -WY -WY -WY -WY -WY -"} -(61,1,1) = {" -WY -WY -WY -WY -WY -WY -FE -vQ -zo -Wa -Wa -Wa -Wa -sv -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -vC -vC -vC -vC -vC -vC -vC -vC -vC -Sw -Sw -Sw -Sw -Sw -Sw -Sw -zf -Ng -Cc -BU -Kr -YD -Jw -Bq -Wc -Wc -bH -sv -sv -sv -Wa -Wa -Wa -Wa -zo -zo -vQ -WY -WY -WY -WY -WY -WY -"} -(62,1,1) = {" -WY -WY -WY -WY -ZJ -WY -FE -zo -zo -zo -Wa -sv -Wa -sv -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -sv -sv -Wa -Wa -Wa -sv -Wa -sv -sv -sv -sv -Wa -sv -sv -Wa -sv -sv -Wa -Wa -XZ -Wa -bH -Lp -Pp -Zl -qF -gy -iu -Cs -qr -HH -ip -zo -sv -Wa -sv -Wa -Wa -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -"} -(63,1,1) = {" -WY -WY -WY -jn -Wt -WY -FE -WY -vQ -zo -zo -Wa -Wa -sv -Wa -Wa -sv -Wa -sv -Wa -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -sv -sv -Wa -Wa -Wa -sv -Wa -Wa -sv -sv -Wa -Wa -Wa -XZ -Wa -bH -lZ -kh -tV -zd -ud -Xn -bH -Ba -ot -bH -zo -sv -Wa -Wa -Wa -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -WY -"} -(64,1,1) = {" -WY -WY -WY -jn -jn -FE -FE -qD -FE -vQ -zo -zo -zo -Wa -sv -Wa -Wa -Wa -sv -Wa -sv -sv -Wa -Wa -Wa -Wa -sv -sv -Wa -Wa -sv -sv -sv -sv -sv -sv -sv -sv -Wa -sv -sv -Wa -Wa -XZ -bH -KG -bH -gA -gA -bH -KG -bH -bH -bH -bH -zo -sv -sv -Wa -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -WY -WY -"} -(65,1,1) = {" -WY -WY -Wt -jn -jn -Wt -FE -WY -WY -WY -WY -zo -vQ -zo -zo -Wa -sv -sv -Wa -sv -Wa -Wa -Wa -sv -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -Wa -sv -Wa -Wa -Wa -Wa -Wa -Wa -zo -zo -zo -zo -zo -zo -zo -dr -zo -zo -zo -zo -zo -zo -zo -Wa -zo -zo -vQ -vQ -FE -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(66,1,1) = {" -WY -WY -jn -jn -Wt -jn -FE -FE -FE -FE -FE -FE -FE -vQ -zo -zo -zo -Wa -sv -Wa -sv -sv -sv -sv -sv -Wa -Wa -Wa -Wa -sv -Wa -sv -Wa -Wa -sv -Wa -Wa -Wa -sv -Wa -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -zo -vQ -FE -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -"} -(67,1,1) = {" -WY -ZJ -Wt -jn -jn -jn -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(68,1,1) = {" -WY -WY -WY -Wt -jn -Wt -ZJ -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(69,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -EW -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(70,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -RM -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} -(71,1,1) = {" -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -WY -"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_cabin.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_cabin.dmm new file mode 100644 index 00000000000..46efa9cd6ae --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_cabin.dmm @@ -0,0 +1,195 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/dorms_double, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"b" = ( +/obj/structure/closet/cabinet, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, +/area/template_noop) +"c" = ( +/obj/structure/cable, +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/effect/spawner/random/food_or_drink/three_course_meal, +/obj/effect/spawner/random/food_or_drink/three_course_meal, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/spawner/random/food_or_drink/three_course_meal, +/turf/open/floor/wood/parquet, +/area/template_noop) +"d" = ( +/obj/structure/curtain/bounty, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"e" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"g" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/template_noop) +"o" = ( +/obj/machinery/light_switch/directional/east, +/turf/open/floor/wood/parquet, +/area/template_noop) +"q" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"r" = ( +/obj/effect/spawner/random/structure/chair_comfy{ + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"s" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/template_noop) +"t" = ( +/obj/structure/fireplace, +/turf/open/floor/stone, +/area/template_noop) +"x" = ( +/obj/modular_map_connector, +/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/parquet, +/area/template_noop) +"z" = ( +/turf/open/floor/wood/parquet, +/area/template_noop) +"A" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree, +/obj/item/grown/log/tree, +/turf/open/floor/stone, +/area/template_noop) +"B" = ( +/obj/structure/curtain/bounty/start_closed, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"D" = ( +/obj/effect/spawner/random/structure/table_fancy, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"E" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/template_noop) +"F" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/parquet, +/area/template_noop) +"G" = ( +/obj/item/hatchet/wooden, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/stone, +/area/template_noop) +"I" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/structure/chair_comfy{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"K" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/wood/parquet, +/area/template_noop) +"N" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/west, +/obj/machinery/vending/clothing, +/turf/open/floor/wood/parquet, +/area/template_noop) +"O" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/wood/parquet, +/area/template_noop) +"Y" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblue, +/area/template_noop) + +(1,1,1) = {" +b +c +N +x +O +d +a +"} +(2,1,1) = {" +K +E +z +s +z +B +B +"} +(3,1,1) = {" +G +Y +I +s +g +d +a +"} +(4,1,1) = {" +t +q +D +z +z +B +B +"} +(5,1,1) = {" +A +e +r +o +F +d +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_classic.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_classic.dmm new file mode 100644 index 00000000000..b0ac0cbd685 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_classic.dmm @@ -0,0 +1,264 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/effect/spawner/random/clothing/beret_or_rabbitears, +/turf/open/floor/carpet/cyan, +/area/template_noop) +"c" = ( +/obj/structure/bed/double/pod, +/obj/item/bedsheet/random/double, +/obj/machinery/button/door/directional/north{ + id = "ptdorm4"; + name = "Door Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/template_noop) +"f" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/carpet/cyan, +/area/template_noop) +"k" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/purple, +/area/template_noop) +"l" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ptdorm4"; + name = "Couples Suite" + }, +/obj/machinery/door/firedoor/solid, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/template_noop) +"m" = ( +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/item/bedsheet/random{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "ptdorm1"; + name = "Door Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/template_noop) +"o" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp, +/obj/effect/spawner/random/clothing/funny_hats, +/turf/open/floor/carpet/purple, +/area/template_noop) +"q" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/firealarm/directional/south{ + pixel_y = -31 + }, +/obj/modular_map_connector, +/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/large, +/area/template_noop) +"r" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/purple, +/area/template_noop) +"t" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/template_noop) +"y" = ( +/obj/machinery/vending/clothing, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/template_noop) +"B" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/effect/spawner/random/clothing/kittyears_or_rabbitears, +/turf/open/floor/carpet/red, +/area/template_noop) +"C" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/black, +/area/template_noop) +"D" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/cyan, +/area/template_noop) +"E" = ( +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/item/bedsheet/random{ + dir = 1 + }, +/obj/machinery/button/door/directional/north{ + id = "ptdorm2"; + name = "Door Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet/cyan, +/area/template_noop) +"G" = ( +/turf/closed/wall, +/area/template_noop) +"H" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/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/large, +/area/template_noop) +"K" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ptdorm1"; + name = "Private Dorm 1" + }, +/obj/machinery/door/firedoor/solid, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/template_noop) +"N" = ( +/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/large, +/area/template_noop) +"R" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/black, +/area/template_noop) +"T" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ptdorm2"; + name = "Private Dorm 2" + }, +/obj/machinery/door/firedoor/solid, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/template_noop) +"U" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/red, +/area/template_noop) +"W" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/random, +/obj/machinery/button/door/directional/south{ + id = "ptdorm3"; + name = "Door Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/black, +/area/template_noop) +"X" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/carpet/black, +/area/template_noop) +"Y" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/template_noop) +"Z" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ptdorm3"; + name = "Private Dorm 3" + }, +/obj/machinery/door/firedoor/solid, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/template_noop) + +(1,1,1) = {" +o +m +G +q +G +E +a +"} +(2,1,1) = {" +r +k +K +N +T +D +f +"} +(3,1,1) = {" +G +G +G +H +G +G +G +"} +(4,1,1) = {" +C +R +Z +t +l +U +Y +"} +(5,1,1) = {" +X +W +G +y +G +c +B +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_party.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_party.dmm new file mode 100644 index 00000000000..aad927151d4 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/dorm_party.dmm @@ -0,0 +1,268 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/firealarm/directional/south{ + pixel_y = -31 + }, +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/template_noop) +"c" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"d" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ptdorm1"; + name = "Private Dorm 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"e" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/wood/large, +/area/template_noop) +"k" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/template_noop) +"m" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"o" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/template_noop) +"q" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/template_noop) +"s" = ( +/obj/machinery/button/door/directional/south{ + id = "ptdorm1"; + name = "Door Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/table/wood/fancy/black, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/spawner/random/entertainment/lighter, +/obj/item/bong, +/obj/item/reagent_containers/hash, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"t" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"w" = ( +/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/template_noop) +"x" = ( +/obj/machinery/button/door/directional/south{ + id = "ptdorm4"; + name = "Door Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/table/wood/fancy/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/item/clothing/mask/cigarette/candy, +/obj/item/clothing/mask/cigarette, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"z" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/tennis/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/template_noop) +"B" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/dorms_double, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"D" = ( +/turf/closed/wall, +/area/template_noop) +"G" = ( +/turf/open/floor/wood/large, +/area/template_noop) +"I" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/template_noop) +"J" = ( +/obj/structure/chair/plastic, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/wood/large, +/area/template_noop) +"L" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/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/template_noop) +"M" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/wood/large, +/area/template_noop) +"N" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/wood/large, +/area/template_noop) +"O" = ( +/obj/machinery/light_switch/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/modular_map_connector, +/turf/open/floor/wood/large, +/area/template_noop) +"P" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/template_noop) +"R" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"S" = ( +/obj/structure/table/wood/poker, +/obj/item/reagent_containers/cup/glass/bottle/ale{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/bottle/ale{ + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/bottle/ale{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/item/reagent_containers/cup/glass/bottle/ale{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/bottle/ale{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/item/reagent_containers/cup/glass/bottle/ale, +/turf/open/floor/wood/large, +/area/template_noop) +"T" = ( +/obj/machinery/door/airlock/wood{ + id_tag = "ptdorm4"; + name = "Couples Suite" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/royalblue, +/area/template_noop) +"V" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/template_noop) +"W" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/template_noop) +"Y" = ( +/obj/structure/bed/double{ + dir = 1 + }, +/obj/item/bedsheet/dorms_double{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"Z" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/template_noop) + +(1,1,1) = {" +Y +s +D +O +P +G +a +"} +(2,1,1) = {" +R +m +d +w +I +N +q +"} +(3,1,1) = {" +D +D +D +L +k +z +o +"} +(4,1,1) = {" +c +t +T +k +W +S +Z +"} +(5,1,1) = {" +B +x +D +M +J +e +V +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_dead.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_dead.dmm new file mode 100644 index 00000000000..e1e981d7c10 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_dead.dmm @@ -0,0 +1,157 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"c" = ( +/obj/structure/alien/resin/wall, +/turf/template_noop, +/area/template_noop) +"k" = ( +/obj/structure/spawner/tarkon_xenos/minor, +/turf/template_noop, +/area/template_noop) +"l" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/alien/resin/wall, +/turf/template_noop, +/area/template_noop) +"m" = ( +/obj/machinery/door/window/brigdoor/right/directional/north, +/turf/template_noop, +/area/template_noop) +"p" = ( +/obj/structure/alien/weeds/node, +/obj/structure/alien/resin/wall, +/turf/template_noop, +/area/template_noop) +"u" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/template_noop, +/area/template_noop) +"w" = ( +/obj/structure/alien/weeds, +/turf/template_noop, +/area/template_noop) +"x" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/template_noop, +/area/template_noop) +"B" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/template_noop, +/area/template_noop) +"C" = ( +/obj/effect/mob_spawn/corpse/facehugger, +/obj/structure/alien/egg/burst, +/turf/template_noop, +/area/template_noop) +"D" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/template_noop, +/area/template_noop) +"H" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/alien/resin/wall, +/turf/template_noop, +/area/template_noop) +"J" = ( +/obj/machinery/door/window/brigdoor/right/directional/south, +/turf/template_noop, +/area/template_noop) +"L" = ( +/obj/modular_map_connector, +/obj/structure/alien/resin/wall, +/obj/structure/alien/weeds, +/turf/template_noop, +/area/template_noop) +"O" = ( +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/template_noop) +"Q" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/template_noop) +"X" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/template_noop, +/area/template_noop) +"Z" = ( +/obj/machinery/door/window/brigdoor/right/directional/north, +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +a +a +w +a +a +"} +(2,1,1) = {" +a +a +O +a +a +"} +(3,1,1) = {" +c +H +L +l +p +"} +(4,1,1) = {" +a +u +a +x +k +"} +(5,1,1) = {" +a +J +a +Z +a +"} +(6,1,1) = {" +X +B +a +D +X +"} +(7,1,1) = {" +a +Q +a +x +a +"} +(8,1,1) = {" +C +J +a +m +a +"} +(9,1,1) = {" +k +u +a +x +a +"} +(10,1,1) = {" +O +u +a +x +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_nest.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_nest.dmm new file mode 100644 index 00000000000..d523bdf264f --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_nest.dmm @@ -0,0 +1,97 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/alien/resin/wall, +/turf/template_noop, +/area/template_noop) +"f" = ( +/obj/structure/spawner/tarkon_xenos/common, +/turf/template_noop, +/area/template_noop) +"C" = ( +/obj/structure/alien/weeds/node, +/turf/template_noop, +/area/template_noop) +"V" = ( +/obj/structure/alien/weeds, +/turf/template_noop, +/area/template_noop) +"X" = ( +/turf/template_noop, +/area/template_noop) +"Z" = ( +/obj/structure/alien/resin/wall, +/obj/modular_map_connector, +/obj/structure/alien/weeds, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +X +X +V +X +X +"} +(2,1,1) = {" +X +X +C +X +X +"} +(3,1,1) = {" +a +a +Z +a +a +"} +(4,1,1) = {" +a +C +X +X +a +"} +(5,1,1) = {" +X +X +X +C +X +"} +(6,1,1) = {" +X +X +X +X +X +"} +(7,1,1) = {" +C +X +f +X +X +"} +(8,1,1) = {" +X +X +X +X +C +"} +(9,1,1) = {" +X +X +C +X +X +"} +(10,1,1) = {" +X +X +X +X +X +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_safe.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_safe.dmm new file mode 100644 index 00000000000..b857f1d07a8 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/xeno_safe.dmm @@ -0,0 +1,95 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"f" = ( +/obj/machinery/door/window/brigdoor/right/directional/south, +/turf/template_noop, +/area/template_noop) +"o" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/template_noop, +/area/template_noop) +"v" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/template_noop, +/area/template_noop) +"z" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/template_noop, +/area/template_noop) +"I" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/template_noop, +/area/template_noop) +"K" = ( +/obj/machinery/door/window/brigdoor/right/directional/north, +/turf/template_noop, +/area/template_noop) +"Q" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/template_noop, +/area/template_noop) +"S" = ( +/obj/modular_map_connector, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +a +I +S +v +a +"} +(2,1,1) = {" +a +I +a +v +a +"} +(3,1,1) = {" +a +f +a +K +a +"} +(4,1,1) = {" +Q +z +a +o +Q +"} +(5,1,1) = {" +a +I +a +v +a +"} +(6,1,1) = {" +a +f +a +K +a +"} +(7,1,1) = {" +a +I +a +v +a +"} +(8,1,1) = {" +a +I +a +v +a +"} diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/wreckedhomestead.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/wreckedhomestead.dmm index afa164d0b27..254fe9eecd5 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/wreckedhomestead.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/wreckedhomestead.dmm @@ -254,9 +254,8 @@ /turf/open/floor/plating/airless, /area/ruin/unpowered) "RO" = ( -/obj/machinery/door/airlock/research/glass{ - welded = 1 - }, +/obj/machinery/door/airlock/research/glass, +/obj/effect/mapping_helpers/airlock/welded, /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/airless, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm index 43b6174e7fb..59aed6d2d32 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm @@ -243,6 +243,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/bar) "bb" = ( @@ -324,7 +327,6 @@ /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, /obj/machinery/door/airlock/maintenance{ name = "Hotel Maintenance" }, @@ -397,6 +399,14 @@ /obj/effect/turf_decal/siding/dark, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel) +"cC" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/hotel/pool) "cE" = ( /obj/effect/turf_decal/tile/green, /turf/open/floor/carpet/black, @@ -515,6 +525,7 @@ "dv" = ( /obj/item/reagent_containers/cup/rag, /obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "dx" = ( @@ -537,6 +548,19 @@ }, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel) +"dF" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/hotel) "dH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/royalblack, @@ -701,6 +725,14 @@ /obj/effect/turf_decal/tile/dark/diagonal_edge, /turf/open/floor/iron/white, /area/ruin/space/has_grav/hotel) +"ev" = ( +/obj/structure/chair/stool/bar, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/black, +/area/ruin/space/has_grav/hotel/bar) "ex" = ( /obj/item/kirbyplants/random, /turf/open/floor/carpet/green, @@ -719,14 +751,10 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/hotel) "ez" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/siding/green{ - dir = 4 - }, -/turf/open/floor/iron, +/turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel/bar) "eA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -1411,13 +1439,9 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "hv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/coffeemaker, /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/mug/nanotrasen{ @@ -1444,9 +1468,6 @@ /obj/machinery/light_switch{ pixel_y = -24 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/hotel/guestroom/room_6) "hy" = ( @@ -1644,6 +1665,12 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/twin_nexus_staff, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/bar) "il" = ( @@ -1681,9 +1708,6 @@ /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 = 5 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -1735,14 +1759,12 @@ /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/hotel/guestroom/room_6) "iz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/indestructible/hoteltile, -/area/ruin/space/has_grav/hotel/guestroom) +/turf/open/floor/iron/cafeteria, +/area/ruin/space/has_grav/hotel/bar) "iA" = ( /turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel/bar) @@ -1759,9 +1781,6 @@ /obj/machinery/door/airlock/engineering{ name = "Power Storage" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/mapping_helpers/airlock/access/all/twin_nexus_staff, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel/power) @@ -1770,9 +1789,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "iM" = ( @@ -1900,7 +1917,6 @@ /area/ruin/space/has_grav/hotel/bar) "jm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/neon/simple/black/nodots, /area/ruin/space/has_grav/hotel/guestroom/room_1) "jo" = ( @@ -1951,12 +1967,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "jE" = ( @@ -2009,10 +2025,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, /obj/effect/turf_decal/siding/wood, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "jL" = ( @@ -2067,19 +2083,17 @@ "kb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/workroom) "kc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/carpet/green, -/area/ruin/space/has_grav/hotel/guestroom/room_4) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet/orange, +/area/ruin/space/has_grav/hotel) "ke" = ( /obj/machinery/gibber, /obj/effect/decal/cleanable/blood/old, @@ -2164,7 +2178,7 @@ /area/ruin/space/has_grav/hotel/power) "kw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 + dir = 4 }, /turf/open/floor/carpet/green, /area/ruin/space/has_grav/hotel/guestroom/room_4) @@ -2285,6 +2299,9 @@ /obj/machinery/airalarm/directional/north{ pixel_y = 24 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "kR" = ( @@ -2363,6 +2380,9 @@ dir = 4 }, /obj/effect/turf_decal/siding/dark_green/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "lc" = ( @@ -2618,6 +2638,12 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/hotel/dock) +"mq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/hotel/bar) "mr" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -2709,13 +2735,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 6 }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "mI" = ( @@ -2842,6 +2868,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "nj" = ( @@ -3051,6 +3080,13 @@ }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) +"os" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/black, +/area/ruin/space/has_grav/hotel/bar) "ov" = ( /turf/open/floor/iron/dark/diagonal, /area/ruin/space/has_grav/hotel/dock) @@ -3072,6 +3108,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/bar) "oI" = ( @@ -3106,14 +3145,11 @@ /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/ruin/space/has_grav/hotel/bar) "oV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/indestructible/hoteltile, -/area/ruin/space/has_grav/hotel/guestroom) +/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/ruin/space/has_grav/hotel) "oW" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/flashlight/lamp/green, @@ -3492,12 +3528,12 @@ /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "rp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 9 - }, /obj/effect/turf_decal/siding/green{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/bar) "rr" = ( @@ -3607,7 +3643,6 @@ /obj/machinery/door/airlock/grunge{ name = "Hotel Medical Storage" }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -3711,15 +3746,9 @@ /turf/open/floor/carpet/executive, /area/ruin/space/has_grav/hotel/workroom) "sh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/hotel) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/space/has_grav/hotel/bar) "sj" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -3756,6 +3785,12 @@ }, /turf/open/floor/carpet/neon/simple/teal/nodots, /area/ruin/space/has_grav/hotel/guestroom/room_3) +"sA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 + }, +/turf/open/floor/carpet/neon/simple/pink/nodots, +/area/ruin/space/has_grav/hotel/guestroom/room_2) "sC" = ( /obj/machinery/light{ dir = 1 @@ -3821,6 +3856,9 @@ /obj/effect/turf_decal/siding/dark_green{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "td" = ( @@ -4105,6 +4143,10 @@ }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/hotel/guestroom/room_4) +"ve" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/hotel/guestroom/room_6) "vn" = ( /obj/structure/table/glass, /obj/item/flashlight/flare/candle/infinite{ @@ -4154,6 +4196,9 @@ /obj/effect/turf_decal/siding/green{ dir = 6 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/bar) "vu" = ( @@ -4170,9 +4215,6 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "vB" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -4181,6 +4223,9 @@ dir = 8 }, /obj/effect/turf_decal/siding/wood, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "vG" = ( @@ -4283,7 +4328,7 @@ /area/ruin/space/has_grav/hotel/custodial) "wB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 + dir = 8 }, /turf/open/floor/carpet/green, /area/ruin/space/has_grav/hotel/guestroom/room_4) @@ -4430,9 +4475,6 @@ dir = 8 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/effect/turf_decal/siding/dark{ dir = 4 }, @@ -4540,6 +4582,16 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/power) +"yi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 5 + }, +/turf/open/floor/catwalk_floor, +/area/ruin/space/has_grav/hotel) "yk" = ( /obj/machinery/door/airlock{ name = "Unisex Changing" @@ -4686,6 +4738,9 @@ /area/ruin/space/has_grav/hotel/pool) "zo" = ( /obj/structure/decorative/shelf/alcohol_assortment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "zp" = ( @@ -4743,6 +4798,9 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/twin_nexus_staff, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "zP" = ( @@ -4828,7 +4886,6 @@ /area/ruin/space/has_grav/hotel/guestroom) "Ao" = ( /obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -5095,6 +5152,9 @@ /obj/effect/turf_decal/siding/green{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/bar) "Cb" = ( @@ -5343,7 +5403,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/workroom) "DH" = ( @@ -5664,6 +5723,9 @@ }, /obj/machinery/light, /obj/effect/turf_decal/siding/dark_green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "Ga" = ( @@ -5813,12 +5875,10 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "GN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /obj/machinery/light{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/indestructible/hoteltile, /area/ruin/space/has_grav/hotel/guestroom) "GO" = ( @@ -5881,11 +5941,12 @@ /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/hotel/guestroom/room_6) "Hp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/indestructible/hoteltile, -/area/ruin/space/has_grav/hotel/guestroom) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/orange, +/area/ruin/space/has_grav/hotel) "Hq" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -5900,9 +5961,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "HA" = ( @@ -5934,6 +5992,9 @@ dir = 4 }, /obj/effect/turf_decal/siding/dark_green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "HG" = ( @@ -5966,10 +6027,9 @@ pixel_x = 6; pixel_y = 5 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel/bar) "HS" = ( @@ -6065,8 +6125,8 @@ /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/flip{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) @@ -6381,6 +6441,9 @@ }, /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/siding/dark_green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "KY" = ( @@ -6414,6 +6477,9 @@ /obj/effect/turf_decal/siding/dark_green{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "Lh" = ( @@ -6439,6 +6505,14 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) +"Lk" = ( +/obj/machinery/light, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/orange, +/area/ruin/space/has_grav/hotel) "Lm" = ( /obj/structure/chair/pew/right{ dir = 8; @@ -6456,8 +6530,6 @@ pixel_y = -24 }, /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/ruin/space/has_grav/hotel/guestroom/room_5) "Lp" = ( @@ -6568,6 +6640,9 @@ /obj/effect/turf_decal/siding/dark{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/hotel) "Mb" = ( @@ -6694,9 +6769,6 @@ /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "MV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -6733,6 +6805,9 @@ /obj/effect/turf_decal/siding/dark_green{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "Nc" = ( @@ -6823,9 +6898,6 @@ /turf/open/floor/carpet/neon/simple/pink/nodots, /area/ruin/space/has_grav/hotel/guestroom/room_2) "NV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, /obj/structure/cable, /obj/machinery/light{ dir = 8 @@ -6880,6 +6952,9 @@ }, /obj/structure/sign/poster/contraband/random/directional/north, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "Om" = ( @@ -6936,6 +7011,9 @@ dir = 8 }, /obj/effect/turf_decal/siding/wood/corner, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "OB" = ( @@ -7137,9 +7215,6 @@ /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "PN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, /obj/structure/cable, /obj/structure/extinguisher_cabinet{ pixel_x = -30 @@ -7298,9 +7373,6 @@ "QR" = ( /obj/machinery/airalarm/directional/west, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, /obj/machinery/light_switch{ pixel_y = -24 }, @@ -7344,14 +7416,19 @@ /turf/closed/wall, /area/ruin/space/has_grav/hotel/workroom) "Rm" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 }, -/turf/open/floor/carpet/green, -/area/ruin/space/has_grav/hotel/guestroom/room_4) +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/ruin/space/has_grav/hotel) "Rn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -7361,9 +7438,6 @@ }, /obj/item/kirbyplants/random, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/hotel) "Rq" = ( @@ -7379,6 +7453,9 @@ dir = 4 }, /obj/effect/turf_decal/siding/dark_green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "Rv" = ( @@ -7482,6 +7559,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel) "RS" = ( @@ -7503,11 +7581,17 @@ /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/hotel/guestroom/room_6) "RX" = ( +/obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/carpet/neon/simple/black/nodots, -/area/ruin/space/has_grav/hotel/guestroom/room_1) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/ruin/space/has_grav/hotel) "RY" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood, @@ -7583,7 +7667,7 @@ /area/ruin/space/has_grav/hotel/sauna) "SH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 1 }, /turf/open/indestructible/hoteltile, /area/ruin/space/has_grav/hotel/guestroom) @@ -7609,6 +7693,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "SU" = ( @@ -7653,6 +7740,9 @@ dir = 8 }, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "Tj" = ( @@ -7701,18 +7791,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 1 }, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/catwalk_floor, /area/ruin/space/has_grav/hotel) "Tz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/turf/open/floor/carpet/green, -/area/ruin/space/has_grav/hotel/guestroom/room_4) +/turf/open/floor/carpet/orange, +/area/ruin/space/has_grav/hotel) "TA" = ( /obj/machinery/door/airlock/grunge{ name = "Disposals Access" @@ -7877,6 +7967,9 @@ pixel_y = -24 }, /obj/effect/turf_decal/siding/dark_green, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "UW" = ( @@ -7932,8 +8025,6 @@ /turf/open/floor/engine/n2, /area/ruin/space/has_grav/hotel/power) "Vn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/extinguisher_cabinet{ pixel_x = -30 @@ -8028,8 +8119,10 @@ /turf/open/floor/carpet/neon/simple/black/nodots, /area/ruin/space/has_grav/hotel/guestroom/room_1) "VX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 6 + }, /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/hotel/guestroom/room_6) "VY" = ( @@ -8258,7 +8351,6 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "XB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/sofa/corp/left{ dir = 8 }, @@ -8837,12 +8929,12 @@ OA RO mH cd -ed -ed -ed -ed -ed -or +oV +oV +oV +oV +oV +yi am aa aa @@ -8900,7 +8992,7 @@ YK xe ww Qv -Zc +sA aw kL vB @@ -9259,7 +9351,7 @@ Ba cl DR bq -RX +bV mT cl Oh @@ -9325,7 +9417,7 @@ Qe bN dl yE -uN +RX cl YP Bn @@ -9481,7 +9573,7 @@ ZI wc RH ni -RH +iz HF VI hw @@ -9489,7 +9581,7 @@ hw Lj hw hw -hw +sh rD fi bE @@ -9559,7 +9651,7 @@ hw Lj hw hw -hw +sh hw HV hS @@ -9699,7 +9791,7 @@ AA sT AA AA -AA +ev AA AI fo @@ -9900,7 +9992,7 @@ qA qA qA qA -oH +mq oD fi iA @@ -9969,7 +10061,7 @@ IZ AG IZ IZ -ez +AG rp vt fi @@ -10196,7 +10288,7 @@ Wo Wo ye fi -RL +Rm jO jO gM @@ -10227,7 +10319,7 @@ aa xH qd xD -Tz +sj kw ql rr @@ -10256,7 +10348,7 @@ fi iA gd gb -ZM +ez ud pe qU @@ -10297,7 +10389,7 @@ aa xH gV xD -kc +sj sm FQ vK @@ -10326,7 +10418,7 @@ fi iA Mh ur -ZM +ez bb ya qU @@ -10367,7 +10459,7 @@ aa xH rG UI -Rm +sj wB av YI @@ -10453,7 +10545,7 @@ tC lL am Rn -LN +dF LN LN LN @@ -10465,8 +10557,8 @@ iC fi iA gd -gb -iA +os +ez ud pe qU @@ -10522,7 +10614,7 @@ Fc bW bW SU -lO +nh nh lO nh @@ -10600,7 +10692,7 @@ am am DL ey -so +UX qq fi fi @@ -10789,13 +10881,13 @@ OL OL OL hE -OL -OL +zQ +zQ kO YO fE yE -MU +Hp di JZ fC @@ -10828,7 +10920,7 @@ vo am iZ jQ -jU +cC Xs Jy qr @@ -10860,12 +10952,12 @@ OL OL em zQ -zQ +OL hv aC xR yE -MU +Hp di UW fY @@ -10935,7 +11027,7 @@ rP aC xR yE -MU +Hp di WH fC @@ -10950,7 +11042,7 @@ Nq am IK ey -UX +so ET am Ln @@ -11005,7 +11097,7 @@ cf cf xR yE -MU +Hp di di fC @@ -11075,7 +11167,7 @@ OZ cf xR yE -MU +Hp di cc lh @@ -11145,7 +11237,7 @@ DN cf xR yE -MU +Hp di cb xX @@ -11160,7 +11252,7 @@ bP am fq ey -so +UX Xu am Ln @@ -11215,7 +11307,7 @@ HM cf xR yE -MU +Hp di Sf bZ @@ -11285,7 +11377,7 @@ cf cf xR yE -MU +Hp di di di @@ -11298,7 +11390,7 @@ Tj sE Pq rU -sh +sE ey eA Xu @@ -11355,7 +11447,7 @@ hx cf iQ yE -JW +Lk am ac di @@ -11419,13 +11511,13 @@ uR uR uR uR -uR +ve VX kA lF UQ yE -MU +Hp qI ac Ml @@ -11495,7 +11587,7 @@ MV cf xR yE -MU +Hp qI ac Ml @@ -11565,7 +11657,7 @@ UF cf xR yE -MU +Hp qI ac Ml @@ -11635,7 +11727,7 @@ cf cf xR yE -MU +Hp am ac di @@ -11705,7 +11797,7 @@ Cw dN GF yE -MU +Hp di di di @@ -11775,7 +11867,7 @@ Hd Al EP yE -MU +Hp di LQ xd @@ -11843,9 +11935,9 @@ Cj Cj KY dN -Dt +Tz yE -MU +kc di GC xN @@ -12189,9 +12281,9 @@ dN dN dN dN -oV -iz -Hp +vH +vH +vH dN sD sD diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index c4b2bac791c..248ca7a46f2 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -16,6 +16,7 @@ // SKYRAT EDIT ADDITON START - Compiling our modular maps too! #include "map_files\VoidRaptor\VoidRaptor.dmm" #include "map_files\NSVBlueshift\Blueshift.dmm" + #include "map_files\KiloStation\KiloStation.dmm" // SKYRAT EDIT END // BUBBER EDIT ADDITION START #include "map_files\biodome\biodome.dmm" diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 1fc5f00ed3a..ceba20a2149 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -795,6 +795,7 @@ }, /obj/structure/cable, /obj/effect/turf_decal/siding/wideplating/dark, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/security) "apB" = ( @@ -2560,6 +2561,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"bbK" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kirbyplants/organic/applebush{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "bbU" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -3016,6 +3029,12 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"bll" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/closet/crate, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "blq" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/hangover, @@ -4069,6 +4088,7 @@ /obj/effect/turf_decal/siding/green{ dir = 8 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) "bDN" = ( @@ -4614,6 +4634,13 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/misc/sandy_dirt, /area/station/hallway/secondary/entry) +"bOY" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/conveyor{ + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "bPb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -7056,6 +7083,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/courtroom) "cLH" = ( @@ -10425,6 +10453,7 @@ /obj/effect/turf_decal/siding/red{ dir = 6 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/small, /area/station/security/warden) "dXE" = ( @@ -12966,6 +12995,15 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/circuit, /area/station/maintenance/port/aft) +"ePn" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/directional/south, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "ePu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -15149,6 +15187,9 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"fCd" = ( +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "fCf" = ( /obj/effect/turf_decal/caution{ dir = 4 @@ -16038,6 +16079,9 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"fSe" = ( +/turf/closed/wall/rust, +/area/station/cargo/miningfoundry) "fSf" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -17721,6 +17765,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/small, /area/station/tcommsat/server) +"gxr" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Office" + }, +/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/smooth, +/area/station/cargo/miningfoundry) "gxs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research/glass{ @@ -18084,13 +18137,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"gDR" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/greyscale, -/obj/item/folder/yellow, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "gEc" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -18206,6 +18252,12 @@ }, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) +"gGw" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/newscaster/directional/west, +/obj/structure/chair, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "gGB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19916,12 +19968,6 @@ }, /turf/open/space/basic, /area/space) -"hia" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/central) "hic" = ( /obj/machinery/holopad, /turf/open/floor/wood/large, @@ -20113,11 +20159,6 @@ /obj/machinery/meter, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"hlA" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "hlJ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -20328,6 +20369,16 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/misc/sandy_dirt, /area/station/medical/medbay/lobby) +"hoV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "hpc" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/structure/cable, @@ -20840,6 +20891,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"hyb" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/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/cargo/warehouse) "hyi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21010,11 +21068,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"hAN" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/cargo/warehouse) "hAQ" = ( /obj/structure/table, /obj/effect/mapping_helpers/broken_floor, @@ -21579,14 +21632,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) -"hMq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 10 - }, -/obj/structure/table, -/obj/item/clothing/mask/cigarette, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "hMr" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/closet/secure_closet/security/sec, @@ -21602,17 +21647,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"hMw" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/closet/crate, -/obj/effect/spawner/random/engineering/flashlight, -/obj/effect/spawner/random/engineering/flashlight, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "hMz" = ( /obj/machinery/computer/order_console/cook, /turf/open/floor/iron/freezer, @@ -21790,6 +21824,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/hidden{ dir = 10 }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/circuit, /area/station/tcommsat/server) "hQs" = ( @@ -21831,6 +21866,12 @@ /obj/item/binoculars, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"hRv" = ( +/obj/machinery/transport/power_rectifier{ + configured_transport_id = "bird_1" + }, +/turf/open/floor/plating, +/area/station/security/tram) "hRz" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -22220,6 +22261,18 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room) +"hZe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/conveyor{ + id = "mining" + }, +/obj/machinery/bouldertech/brm, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "hZP" = ( /obj/structure/cable, /obj/structure/sign/poster/official/random/directional/north, @@ -24107,6 +24160,12 @@ /mob/living/basic/pet/dog/corgi/ian, /turf/open/floor/iron/dark/textured_edge, /area/station/command/heads_quarters/hop) +"iJh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "iJt" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -24199,11 +24258,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"iKV" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "iLc" = ( /obj/effect/turf_decal/siding/red{ dir = 4 @@ -24368,14 +24422,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"iNL" = ( -/obj/machinery/door/airlock/wood{ - desc = "Sessions held every Friday."; - name = "The Sunfinder Society" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "iNO" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -25273,15 +25319,6 @@ /obj/effect/landmark/start/captain, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) -"jef" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "jeg" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -25558,12 +25595,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/commons) -"jkw" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table/greyscale, -/obj/item/folder/ancient_paperwork, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "jkz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -25590,14 +25621,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) -"jlb" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "jlt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25755,7 +25778,6 @@ /turf/open/floor/wood/tile, /area/station/command/corporate_showroom) "jns" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, @@ -25766,6 +25788,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/smooth, /area/station/security/evidence) "jnS" = ( @@ -26081,6 +26104,7 @@ /obj/structure/bed, /obj/item/bedsheet/hop, /obj/effect/landmark/start/head_of_personnel, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) "jvB" = ( @@ -26115,6 +26139,20 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"jvR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light_switch/directional/east, +/obj/structure/rack, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jwa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26144,6 +26182,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jwU" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/random/directional/south, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/obj/machinery/bouldertech/refinery/smelter, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "jwZ" = ( /obj/effect/turf_decal/stripes/white/line, /obj/structure/frame/machine, @@ -26506,18 +26554,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"jCR" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/cargo/warehouse) -"jCW" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plating, -/area/station/cargo/warehouse) "jDa" = ( /obj/machinery/holopad, /turf/open/floor/wood/tile, @@ -26954,6 +26990,16 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/cmo, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"jIH" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "jIN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27347,12 +27393,6 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) -"jPm" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, -/turf/open/floor/iron/smooth, -/area/station/cargo/warehouse) "jPq" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/structure/window/reinforced/tinted, @@ -28418,14 +28458,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/teleporter) -"kkl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "kkm" = ( /obj/machinery/door/airlock/medical/glass{ name = "Primary Treatment Centre" @@ -29728,6 +29760,7 @@ /obj/structure/table, /obj/effect/spawner/random/maintenance, /obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) "kIe" = ( @@ -31237,15 +31270,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"lgT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "lgV" = ( /obj/structure/table, /obj/item/camera, @@ -31483,7 +31507,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, @@ -32324,6 +32347,7 @@ /obj/item/stack/sheet/titaniumglass, /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/light/directional/north, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) "lAO" = ( @@ -33253,6 +33277,7 @@ /obj/structure/table, /obj/effect/spawner/random/maintenance, /obj/machinery/light/small/directional/east, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) "lQh" = ( @@ -34100,6 +34125,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"mdX" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/conveyor_switch{ + id = "mining"; + pixel_x = -10 + }, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "meu" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain) @@ -35399,20 +35432,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"mDC" = ( -/obj/structure/closet/crate{ - name = "Game Supplies" - }, -/obj/item/toy/figure/lawyer, -/obj/item/toy/figure/ian, -/obj/item/toy/figure/hop, -/obj/item/toy/figure/syndie, -/obj/item/toy/figure/roboticist, -/obj/item/toy/figure/md, -/obj/item/clothing/head/collectable/paper, -/obj/item/toy/toy_dagger, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "mDG" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -36449,6 +36468,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/prison/safe) +"mWN" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/trinary/filter/critical, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "mWY" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/chair/sofa/bench/left{ @@ -36466,14 +36494,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"mXo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/ash, -/turf/open/floor/iron, -/area/station/maintenance/port/fore) "mXt" = ( /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/stripes/box, @@ -37547,6 +37567,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"nsX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "nta" = ( /obj/machinery/photocopier, /turf/open/floor/plating, @@ -38679,6 +38704,12 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"nLH" = ( +/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/smooth, +/area/station/cargo/warehouse) "nLN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -39022,6 +39053,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/effect/mapping_helpers/broken_floor, /obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/firealarm/directional/west, /turf/open/floor/wood/parquet, /area/station/service/library) "nTi" = ( @@ -39110,6 +39142,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/science/circuits) +"nUx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/warehouse) "nUG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -40462,6 +40501,12 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"ouT" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/smooth, +/area/station/cargo/warehouse) "ouY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -40567,11 +40612,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"owQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "owR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -40781,6 +40821,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) +"oBv" = ( +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock"; + shuttledocked = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/security/processing) "oBA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -41165,6 +41215,7 @@ /obj/machinery/camera/autoname/directional/east, /obj/item/wrench, /obj/item/paper/fluff/jobs/engineering/frequencies, +/obj/machinery/firealarm/directional/east, /turf/open/floor/circuit, /area/station/tcommsat/server) "oJz" = ( @@ -41840,6 +41891,15 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"oVB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/transport/power_rectifier{ + configured_transport_id = "bird_2" + }, +/turf/open/floor/iron, +/area/station/maintenance/department/medical/central) "oVK" = ( /obj/structure/chair{ pixel_y = -2 @@ -42638,6 +42698,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"pjG" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "pjL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -43775,10 +43839,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/education) -"pBV" = ( -/obj/structure/filingcabinet/filingcabinet, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "pCa" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -44136,6 +44196,30 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"pIi" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/rack, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -8; + pixel_y = 11 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/pickaxe, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/miningfoundry) "pIm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44607,6 +44691,7 @@ }, /obj/machinery/mechpad, /obj/machinery/light/small/directional/north, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) "pQE" = ( @@ -44936,6 +45021,17 @@ }, /turf/open/floor/iron/textured_half, /area/station/service/hydroponics/garden) +"pUS" = ( +/obj/machinery/door/airlock/external{ + name = "Labor Camp Shuttle Airlock"; + shuttledocked = 1 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/security/processing) "pVa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -45304,9 +45400,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/science/server) -"qbg" = ( -/turf/open/floor/iron/smooth, -/area/station/cargo/warehouse) "qbj" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/structure/closet/secure_closet/security/sec, @@ -45338,12 +45431,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"qbu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "qbw" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -45421,14 +45508,6 @@ /obj/effect/landmark/navigate_destination/dockarrival, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qcN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table/greyscale, -/obj/item/folder/red, -/obj/item/toy/figure/detective, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "qcQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45437,18 +45516,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"qcU" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table/greyscale, -/obj/item/folder/white, -/obj/item/storage/dice{ - pixel_x = -16; - pixel_y = -6 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "qcX" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/window/reinforced/spawner/directional/east, @@ -46162,6 +46229,9 @@ shuttledocked = 1 }, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/iron/dark/small, /area/station/security/processing) "qnj" = ( @@ -46541,6 +46611,18 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood/parquet, /area/station/service/theater) +"qul" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/light_switch/directional/east, +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/warehouse) "quo" = ( /obj/structure/sign/poster/official/random/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -46950,11 +47032,6 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"qBb" = ( -/obj/item/kirbyplants/organic/applebush, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "qBc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47187,7 +47264,6 @@ /turf/open/misc/sandy_dirt, /area/station/security/tram) "qDP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/stool/directional/north, /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -47834,13 +47910,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/small, /area/station/medical/chemistry) -"qQt" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/table/greyscale, -/obj/item/folder/blue, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "qQv" = ( /turf/open/floor/iron, /area/station/security/prison/rec) @@ -48992,6 +49061,39 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rhm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 10 + }, +/obj/structure/table, +/obj/item/clothing/mask/cigarette, +/obj/item/toy/toy_dagger, +/obj/item/clothing/head/collectable/paper, +/obj/item/toy/figure/roboticist{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/toy/figure/syndie{ + pixel_y = 5; + pixel_x = -6 + }, +/obj/item/toy/figure/md{ + pixel_x = 10 + }, +/obj/item/toy/figure/hop{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/toy/figure/ian{ + pixel_x = -5; + pixel_y = -1 + }, +/obj/item/toy/figure/lawyer{ + pixel_x = -10 + }, +/obj/item/toy/figure/detective, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rho" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49133,10 +49235,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"rjP" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/station/maintenance/port/fore) "rkb" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -49728,6 +49826,7 @@ pixel_y = -2 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/science/lower) "ruC" = ( @@ -50057,6 +50156,15 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"rzL" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/machinery/conveyor{ + id = "mining"; + dir = 10 + }, +/obj/machinery/bouldertech/refinery, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "rzR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, @@ -52252,6 +52360,7 @@ /obj/item/clothing/mask/bandana/skull, /obj/effect/mapping_helpers/broken_floor, /obj/item/toy/basketball, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) "sih" = ( @@ -53399,6 +53508,13 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/wood/tile, /area/station/service/bar) +"szN" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/transport/power_rectifier{ + configured_transport_id = "bird_2" + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "szS" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/full, @@ -54428,7 +54544,6 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "sSA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, /obj/item/folder/yellow, /turf/open/floor/iron, @@ -54532,14 +54647,6 @@ /obj/machinery/telecomms/bus/preset_one, /turf/open/floor/circuit, /area/station/tcommsat/server) -"sTN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/smooth, -/area/station/cargo/warehouse) "sTR" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/medical/general, @@ -55086,6 +55193,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/lockers) +"tdD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/white/corner, +/turf/open/floor/iron/smooth, +/area/station/cargo/warehouse) "tdF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57231,6 +57348,18 @@ }, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"tPa" = ( +/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/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/cargo/miningfoundry) "tPd" = ( /obj/structure/chair/sofa/left/maroon{ dir = 1 @@ -57478,6 +57607,7 @@ dir = 4 }, /obj/structure/flora/bush/flowers_pp/style_random, +/obj/machinery/firealarm/directional/east, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) "tTR" = ( @@ -57776,6 +57906,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tYI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, +/obj/item/storage/dice{ + pixel_x = -16; + pixel_y = -6 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/fore) "tYL" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -57922,11 +58064,6 @@ /obj/structure/flora/tree/stump, /turf/open/floor/grass, /area/station/service/hydroponics/garden/monastery) -"uav" = ( -/obj/structure/chair/stool/directional/west, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "uax" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58549,6 +58686,10 @@ }, /turf/open/floor/iron/grimy, /area/station/tcommsat/server) +"uki" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/station/cargo/miningfoundry) "uku" = ( /obj/machinery/computer/crew{ dir = 8 @@ -59104,6 +59245,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/sorting) +"uuR" = ( +/obj/machinery/door/airlock/wood{ + desc = "Sessions held every Friday."; + name = "The Sunfinder Society" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/station/cargo/miningfoundry) "uuS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/blue{ @@ -61216,7 +61365,7 @@ dir = 8 }, /obj/machinery/button/flasher{ - id = "IsolationFlash"; + id = "IsolationFlash2"; pixel_x = 28 }, /obj/effect/decal/cleanable/dirt, @@ -62064,6 +62213,18 @@ }, /turf/open/space/basic, /area/space/nearstation) +"vrW" = ( +/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/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/warehouse) "vrY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62231,6 +62392,13 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/catwalk_floor/iron, /area/station/science/xenobiology) +"vuH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "vuK" = ( /obj/structure/cable, /obj/structure/table/reinforced, @@ -64371,7 +64539,6 @@ /turf/open/floor/plating, /area/station/maintenance/fore/greater) "wcP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/modular_computer/preset/cargochat/cargo, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -65308,6 +65475,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"wta" = ( +/obj/structure/railing/corner/end/flip, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/cargo/miningfoundry) "wtc" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -65933,7 +66105,9 @@ /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) "wCt" = ( -/obj/machinery/flasher/directional/east, +/obj/machinery/flasher/directional/east{ + id = "hopflash" + }, /turf/open/floor/iron/half, /area/station/hallway/primary/central/fore) "wCx" = ( @@ -67916,6 +68090,7 @@ /area/station/service/library) "xeP" = ( /obj/structure/table/wood, +/obj/machinery/firealarm/directional/west, /turf/open/floor/wood, /area/station/service/chapel/office) "xeT" = ( @@ -69200,6 +69375,12 @@ "xvF" = ( /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"xvJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/cargo/miningfoundry) "xvT" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/maint) @@ -69265,6 +69446,9 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"xwz" = ( +/turf/closed/wall, +/area/station/cargo/miningfoundry) "xwH" = ( /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, @@ -70329,6 +70513,9 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /turf/open/floor/iron/dark/small, /area/station/security/processing) "xLm" = ( @@ -71708,12 +71895,6 @@ /obj/effect/mapping_helpers/mail_sorting/service/bar, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"ydA" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair/stool/directional/west, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/fore) "ydH" = ( /obj/effect/turf_decal/box/corners, /obj/effect/turf_decal/box/corners{ @@ -81665,7 +81846,7 @@ xZV xYG xYG wHh -jef +mWN hlw diK aII @@ -82743,7 +82924,7 @@ iVK ixX jhC lOj -hMw +bll rgo imS lOj @@ -83775,7 +83956,7 @@ hNZ thM kuy lOj -lgT +jvR jir lPi uzJ @@ -85312,7 +85493,7 @@ hyO roi jCi nPX -hAN +ouT jMb kzI kzI @@ -85826,7 +86007,7 @@ slY hfC slY jjq -jCR +hyb jNc qSH vNv @@ -86077,14 +86258,14 @@ dDB dDB slY mEk -mXo +tYI nEA slY oPi xOm pAU -qbg -rif +nLH +nUx rie ipd rTA @@ -86333,15 +86514,15 @@ dDB dDB dDB slY -hMq +rhm cis slY slY oPo xOm -sTN -jCW -jPm +tdD +vrW +qul rif tro rTA @@ -86595,10 +86776,10 @@ slY slY lbW dRD -slY -slY -slY -ueX +xwz +xwz +gxr +fSe ibe ipP rST @@ -86674,7 +86855,7 @@ dwa dBr eWB lzM -aFR +hRv mnb cDt xpV @@ -86851,13 +87032,13 @@ blb dDB slY ohb -slY -ueX -pBV -mDC -slY -slY -slY +xwz +fSe +pIi +tPa +xwz +xwz +mTl rST sgL swO @@ -87108,12 +87289,12 @@ blb dDB ueX xpl -slY -hlA -qbu -qbu -owQ -slY +xwz +gGw +nsX +hoV +vuH +xwz rFa rTD iWb @@ -87365,12 +87546,12 @@ blb dDB slY mFA -slY -iKV -jkw -qcN -qQt -slY +xwz +mdX +fCd +iJh +jwU +xwz rFP rTU sgR @@ -87622,12 +87803,12 @@ blb dDB slY xpl -iNL -kPW -jlb -qcU -gDR -rjP +uuR +wta +jIH +bbK +ePn +uki rFW bCZ lkG @@ -87879,12 +88060,12 @@ mEB ueX slY ohl -slY -qBb -kkl -ydA -uav -slY +xwz +pjG +hZe +bOY +rzL +xwz rGq rUt sgR @@ -88136,12 +88317,12 @@ hNo wZF wZF had -slY -slY -xZh -slY -ueX -slY +xwz +xwz +xvJ +xwz +fSe +xwz xng pjL llN @@ -90254,7 +90435,7 @@ xur nGi yaU xsF -xLl +pUS xur bCf xur @@ -91025,7 +91206,7 @@ nCH blb blb wpO -qnc +oBv xKv blb xKv @@ -91310,7 +91491,7 @@ trp trp trp trp -nFu +szN xqd xul trp @@ -100306,7 +100487,7 @@ kel wgL rWW sSQ -hia +oVB ggl eBQ ndp diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index b3f4ad7a8e1..58c3e559f3d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -340,6 +340,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"aee" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/folder/yellow{ + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = -6 + }, +/obj/machinery/door/window/left/directional/south{ + dir = 1; + req_access = list("cargo"); + name = "Office Desk" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/cargo/office) "aej" = ( /obj/structure/chair/stool/directional/east, /obj/structure/sign/poster/random/directional/west, @@ -6768,19 +6788,6 @@ "bGc" = ( /turf/closed/wall, /area/station/maintenance/department/engine/atmos) -"bGf" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Mining Desk"; - req_access = list("mining") - }, -/obj/effect/turf_decal/delivery, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/cargo/lobby) "bGi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11872,8 +11879,14 @@ "cRR" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table, -/obj/item/storage/medkit/regular, /obj/machinery/light/directional/west, +/obj/item/stack/conveyor/thirty, +/obj/item/boulder_beacon{ + pixel_x = -5 + }, +/obj/item/conveyor_switch_construct{ + pixel_x = 10 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "cRT" = ( @@ -23179,6 +23192,10 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"fIY" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/plating, +/area/station/maintenance/fore) "fJj" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -26162,9 +26179,14 @@ /area/station/service/abandoned_gambling_den) "gty" = ( /obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/gps/mining, +/obj/item/gps/mining{ + pixel_x = -8 + }, /obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/item/storage/medkit/regular{ + pixel_x = 6; + pixel_y = 10 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "gtG" = ( @@ -50740,6 +50762,19 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"mDX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/west{ + dir = 4; + name = "Delivery Desk"; + req_access = list("cargo") + }, +/obj/effect/turf_decal/delivery, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/cargo/lobby) "mEb" = ( /obj/effect/decal/cleanable/glass, /obj/effect/spawner/random/trash/caution_sign, @@ -64002,11 +64037,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/science/xenobiology) -"pWN" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/spawner/random/structure/closet_empty/crate, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/morgue) "pWO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67565,7 +67595,14 @@ dir = 4 }, /obj/structure/table/reinforced, -/obj/item/flashlight/lamp, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/folder/yellow{ + pixel_y = -5; + pixel_x = 5 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "qQE" = ( @@ -69413,6 +69450,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) +"roI" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/department/medical/morgue) "roX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77582,25 +77624,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos/mix) -"tsG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/yellow{ - pixel_x = -6 - }, -/obj/item/pen{ - pixel_x = -6 - }, -/obj/machinery/door/window/left/directional/south{ - dir = 1; - req_access = list("cargo") - }, -/obj/effect/turf_decal/delivery, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/cargo/office) "tsJ" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/black, @@ -78474,10 +78497,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron, /area/station/engineering/main) -"tDk" = ( -/obj/effect/spawner/random/structure/closet_empty/crate, -/turf/open/floor/plating, -/area/station/maintenance/fore) "tDo" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -81830,12 +81849,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"uty" = ( -/obj/item/sign, -/obj/effect/spawner/random/structure/closet_empty/crate, -/obj/item/screwdriver, -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "utz" = ( /obj/structure/bed/dogbed/runtime, /obj/item/radio/intercom/directional/south, @@ -89417,6 +89430,12 @@ dir = 8 }, /area/station/hallway/secondary/entry) +"wnI" = ( +/obj/item/sign, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/item/screwdriver, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "wnQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -136274,7 +136293,7 @@ dla itV rzw fIR -uty +wnI pgF qAV ybV @@ -136895,7 +136914,7 @@ jWI iVU eSD bhw -pWN +roI hYf bhw qpF @@ -138314,7 +138333,7 @@ jdL jdL jdL cOR -tDk +fIY pxT gCB xOP @@ -138598,7 +138617,7 @@ hqK hLa rve iJr -tsG +aee qQE xjx euK @@ -139114,7 +139133,7 @@ vKl wfK hoC yfI -bGf +mDX kGo vSm xhW diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index c6a645250b7..ed298837486 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -143,6 +143,20 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) +"adm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/conveyor{ + id = "mining_internal" + }, +/obj/machinery/bouldertech/refinery, +/turf/open/floor/iron, +/area/mine/production) "adq" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres{ @@ -231,12 +245,6 @@ /obj/structure/sign/warning, /turf/closed/wall, /area/station/maintenance/port/fore) -"afl" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/firealarm/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) "afp" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -1087,18 +1095,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"asJ" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/hydroponics) "asM" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -1874,15 +1870,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) -"aEU" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "aFg" = ( /obj/machinery/button/door/directional/east{ id = "lawyer_blast"; @@ -2013,14 +2000,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/command/meeting_room) -"aHZ" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "aIe" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel" @@ -3025,6 +3004,15 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory/upper) +"aWq" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/closet/mini_fridge{ + name = "mini-fridge" + }, +/obj/item/reagent_containers/condiment/milk, +/obj/structure/table, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "aWD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4024,11 +4012,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/library) -"bmf" = ( -/obj/effect/turf_decal/tile/blue/diagonal_edge, -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "bml" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -4404,6 +4387,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"brX" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/mine/production) "brY" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -5915,19 +5911,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"bMu" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Hydroponics Desk"; - req_access = list("hydroponics") - }, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "bMz" = ( /obj/docking_port/stationary{ dir = 8; @@ -6477,6 +6460,14 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"bVz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/aquarium_kit, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "bVI" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -7464,6 +7455,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cjp" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "cjz" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/rack, @@ -7539,6 +7538,13 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine, /area/station/science/xenobiology) +"ckK" = ( +/obj/effect/turf_decal/siding/white{ + dir = 10 + }, +/obj/effect/spawner/random/entertainment/arcade, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "ckN" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/south, @@ -7837,6 +7843,12 @@ }, /turf/open/floor/plastic, /area/station/commons/dorms/laundry) +"coY" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/rubble, +/turf/open/floor/iron, +/area/mine/production) "cpe" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 8 @@ -8250,6 +8262,7 @@ dir = 4 }, /obj/structure/sign/poster/official/moth_piping/directional/west, +/obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/work) "cvN" = ( @@ -8330,6 +8343,16 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cwZ" = ( +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "cxd" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark/side{ @@ -9103,6 +9126,11 @@ /obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"cHH" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/holopad, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "cHO" = ( /obj/effect/turf_decal/tile/dark_green{ dir = 4 @@ -9416,13 +9444,6 @@ "cMk" = ( /turf/closed/wall/r_wall, /area/mine/production) -"cMs" = ( -/obj/effect/turf_decal/tile/blue/diagonal_edge, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/directional/south, -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "cMv" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -12007,6 +12028,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) +"dAq" = ( +/obj/machinery/conveyor{ + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Mining Ore Smeltery"; + dir = 6 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron, +/area/mine/production) "dAx" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -13538,20 +13576,6 @@ /obj/structure/cable, /turf/open/floor/carpet/red, /area/station/security/prison/work) -"ear" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/mine/production) "eaw" = ( /obj/effect/spawner/random/contraband/prison, /obj/structure/closet/crate, @@ -13663,14 +13687,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ecZ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/reagentgrinder{ - pixel_y = 9 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "edd" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -14144,15 +14160,6 @@ "ejX" = ( /turf/open/floor/plating, /area/station/security/prison/safe) -"eke" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/closet/mini_fridge{ - name = "mini-fridge" - }, -/obj/item/reagent_containers/condiment/milk, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "ekh" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - Central" @@ -14288,15 +14295,6 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plating, /area/station/engineering/lobby) -"enG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/computer/department_orders/service{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "enI" = ( /obj/machinery/door/airlock/maintenance{ name = "Tool Storage Maintenance" @@ -14800,6 +14798,15 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"eut" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/light_switch/directional/east, +/obj/structure/sink/kitchen/directional/west, +/obj/structure/table, +/obj/item/book/manual/chef_recipes, +/obj/item/holosign_creator/robot_seat/restaurant, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "euw" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -16244,15 +16251,6 @@ /obj/item/seeds/tower, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) -"eUw" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/item/storage/bag/tray, -/obj/item/knife/kitchen{ - pixel_y = 2 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "eUA" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/green/corner{ @@ -18046,18 +18044,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"fxY" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/mine/production) "fyc" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"fyh" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/airalarm/directional/east, -/obj/structure/sink/kitchen/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "fyr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ @@ -18233,6 +18229,19 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"fBJ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/duct, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "fBM" = ( /obj/structure/chair{ dir = 4 @@ -18505,12 +18514,6 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/dark, /area/station/maintenance/disposal) -"fFI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) "fFJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18991,12 +18994,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"fMP" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "fNa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -19642,6 +19639,11 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) +"fYv" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "fYF" = ( /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/openspace, @@ -19861,24 +19863,6 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"gbH" = ( -/obj/machinery/conveyor{ - id = "mining_internal" - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Mining Ore Smeltery"; - dir = 6 - }, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron, -/area/mine/production) "gbJ" = ( /obj/machinery/door/airlock/security/glass{ name = "Armory" @@ -20057,6 +20041,11 @@ /obj/structure/railing, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"gen" = ( +/obj/machinery/door/firedoor, +/obj/machinery/biogenerator, +/turf/open/floor/iron, +/area/station/service/hydroponics) "geq" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -20401,6 +20390,18 @@ "gka" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"gko" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/bouldertech/refinery/smelter, +/turf/open/floor/iron, +/area/mine/production) "gks" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -21272,9 +21273,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) -"gzv" = ( -/turf/open/floor/iron, -/area/mine/production) "gzw" = ( /turf/open/openspace, /area/station/hallway/secondary/service) @@ -21636,20 +21634,6 @@ "gEE" = ( /turf/open/openspace, /area/station/service/chapel) -"gEL" = ( -/obj/structure/table/glass, -/obj/item/hand_labeler, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 6 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Service Botany - Upper North" - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "gER" = ( /turf/open/floor/iron, /area/station/command/bridge) @@ -25888,6 +25872,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"hXu" = ( +/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, +/obj/machinery/firealarm/directional/east, +/obj/machinery/door/airlock{ + name = "Service Hall" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_half, +/area/station/hallway/secondary/service) "hXC" = ( /obj/structure/chair{ dir = 8 @@ -26440,6 +26440,18 @@ /obj/item/soap/nanotrasen, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) +"iga" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Service Hallway - Upper West" + }, +/obj/machinery/modular_computer/preset/cargochat/service{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "igi" = ( /obj/item/kirbyplants/organic/plant10, /obj/machinery/camera/directional/west{ @@ -27639,18 +27651,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"izq" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "mining_internal" - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/mine/production) "izw" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -28960,18 +28960,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) -"iUd" = ( -/obj/machinery/conveyor{ - dir = 6; - id = "mining_internal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) "iUm" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -29844,6 +29832,14 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jjM" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jjO" = ( /obj/structure/sink/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30260,6 +30256,13 @@ /obj/structure/cable, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"jrQ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/firealarm/directional/north, +/obj/structure/cable, +/obj/structure/railing/corner/end/flip, +/turf/open/floor/iron, +/area/mine/production) "jrZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -30639,14 +30642,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jwv" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "jwx" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -31125,14 +31120,6 @@ /obj/structure/rack, /turf/open/floor/iron, /area/station/command/gateway) -"jFA" = ( -/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, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "jFJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -31529,10 +31516,6 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/openspace, /area/station/commons/storage/mining) -"jLb" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/production) "jLf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -31749,6 +31732,14 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"jOA" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "jOD" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -31772,15 +31763,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/service) -"jPa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/modular_computer/preset/cargochat/service{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "jPc" = ( /obj/machinery/conveyor_switch/oneway{ id = "QMLoad2" @@ -31867,11 +31849,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"jQo" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/grill, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "jQt" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=1"; @@ -32331,6 +32308,17 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"jXH" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/mine/production) "jXL" = ( /obj/machinery/newscaster/directional/south, /obj/structure/disposalpipe/trunk{ @@ -32432,16 +32420,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/mine/eva) -"jZt" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/item/plate, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -7; - pixel_y = 6 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "jZB" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -32731,17 +32709,6 @@ /obj/docking_port/stationary/escape_pod, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"keq" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 5 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/hydroponics) "keu" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/burgundy{ @@ -34011,6 +33978,14 @@ /obj/structure/closet/cardboard, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"kuO" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/machinery/processor{ + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "kuR" = ( /obj/structure/barricade/wooden, /obj/machinery/door/airlock/maintenance, @@ -34056,13 +34031,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"kvs" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "kvu" = ( /obj/machinery/door/airlock/security{ id_tag = "IsolationCell"; @@ -35370,6 +35338,14 @@ }, /turf/open/floor/plating/elevatorshaft, /area/mine/storage) +"kPp" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/plate, +/obj/item/food/piedough, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "kPq" = ( /obj/effect/spawner/random/structure/steam_vent, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36104,15 +36080,6 @@ "kZu" = ( /turf/closed/wall, /area/mine/production) -"kZz" = ( -/obj/machinery/computer/order_console/cook{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "kZC" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot_white, @@ -37990,6 +37957,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"lDL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/department_orders/service{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) "lDM" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -38541,6 +38517,21 @@ }, /turf/open/floor/iron, /area/mine/laborcamp/security) +"lMI" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "lNa" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -39656,20 +39647,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/dark, /area/mine/eva/lower) -"mfe" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 8; - id = "mining_internal" - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/mine/production) "mfz" = ( /obj/machinery/door/airlock{ name = "Unit B" @@ -40072,21 +40049,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"mnj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Service Hall" - }, -/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, -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/iron/textured_half, -/area/station/hallway/secondary/service) "mnu" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -41153,17 +41115,6 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/testlab) -"mEZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Service Hallway - Upper West" - }, -/obj/structure/table, -/obj/item/aquarium_kit, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) "mFj" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -41281,6 +41232,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/iron/dark, /area/station/science/explab) +"mHe" = ( +/obj/machinery/conveyor{ + dir = 6; + id = "mining_internal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/bouldertech/brm, +/turf/open/floor/iron, +/area/mine/production) "mHu" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, @@ -46596,6 +46560,14 @@ "olf" = ( /turf/open/floor/carpet, /area/station/commons/dorms) +"olj" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_y = 9 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "olH" = ( /obj/machinery/door/airlock/command{ name = "Captain's Quarters" @@ -46979,11 +46951,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plastic, /area/station/commons/dorms/laundry) -"oqy" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/mine/production) "oqz" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -47515,13 +47482,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/mechbay) -"oyV" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "oyW" = ( /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -48929,18 +48889,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"oUK" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "oUL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49352,17 +49300,6 @@ "pbs" = ( /turf/closed/wall, /area/station/ai_monitored/turret_protected/aisat/maint) -"pbv" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/conveyor_switch/oneway{ - id = "mining_internal"; - name = "mining conveyor"; - pixel_x = 12; - pixel_y = -6 - }, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron, -/area/mine/production) "pby" = ( /obj/effect/gibspawner/human, /turf/open/misc/asteroid/snow/icemoon, @@ -51794,6 +51731,15 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/locker) +"pLK" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "pLZ" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -52565,14 +52511,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/janitor) -"pYI" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "pYT" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/iron, @@ -52933,13 +52871,6 @@ dir = 8 }, /area/station/service/chapel) -"qfe" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/item/book/manual/chef_recipes, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "qfh" = ( /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) @@ -53231,6 +53162,13 @@ dir = 8 }, /area/station/science/explab) +"qkI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/iron, +/area/mine/production) "qkL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -53836,6 +53774,18 @@ /obj/machinery/light/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"qud" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "mining_internal"; + name = "mining conveyor"; + pixel_x = 1; + pixel_y = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron, +/area/mine/production) "que" = ( /obj/machinery/camera/directional/south{ c_tag = "Chapel South" @@ -54412,19 +54362,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qDZ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/obj/item/food/piedough, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "qEa" = ( /obj/structure/cable/layer3, /turf/open/floor/iron/dark, @@ -55063,6 +55000,17 @@ }, /turf/open/floor/plating, /area/station/commons/dorms/laundry) +"qMs" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron, +/area/station/service/hydroponics) "qMz" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/white, @@ -55869,16 +55817,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) -"qYD" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/hydroponics) "qYP" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -56797,6 +56735,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rnl" = ( +/obj/structure/railing, +/turf/open/floor/iron, +/area/mine/production) "rns" = ( /obj/structure/table/reinforced, /obj/item/aicard{ @@ -56915,6 +56857,14 @@ /obj/structure/closet/athletic_mixed, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"rpf" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "rpu" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -57277,6 +57227,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/laborcamp) +"rvA" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "rvS" = ( /obj/structure/rack, /obj/item/poster/random_contraband, @@ -57392,6 +57350,13 @@ /obj/structure/sign/warning/electric_shock/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) +"rxG" = ( +/obj/structure/ore_vent/starter_resources{ + icon_state = "ore_vent_ice_active"; + icon_state_tapped = "ore_vent_ice_active" + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "rxK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, @@ -60064,6 +60029,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"snL" = ( +/obj/item/pickaxe{ + pixel_x = 12; + desc = "Someone left their pickaxe out here, must not have known about the boulder processing machines inside." + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "snO" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -61099,6 +61071,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"sCM" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "sCQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61767,16 +61746,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"sMb" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/processor{ - pixel_y = 6 - }, -/obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "sMg" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) @@ -61947,6 +61916,18 @@ /obj/item/storage/bag/trash, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"sPi" = ( +/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, +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/turf/open/floor/iron/half{ + dir = 1 + }, +/area/station/hallway/secondary/service) "sPA" = ( /obj/structure/rack, /obj/item/storage/bag/ore, @@ -62017,6 +61998,11 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/mine/living_quarters) +"sQy" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "sQB" = ( /turf/closed/wall, /area/station/security/brig/upper) @@ -62339,6 +62325,10 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/theater) +"sWU" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, +/area/mine/production) "sXb" = ( /obj/machinery/status_display/ai/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -62496,6 +62486,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/prisoner, +/obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/work) "sZD" = ( @@ -63415,17 +63406,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"tqZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Service Hall" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/iron/textured_half, -/area/station/hallway/secondary/service) "trb" = ( /obj/structure/table, /obj/machinery/computer/security/telescreen{ @@ -63619,6 +63599,15 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/icemoon/underground/explored) +"tuo" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/knife/kitchen{ + pixel_y = 2 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "tur" = ( /turf/open/floor/iron/cafeteria{ dir = 8 @@ -63921,6 +63910,14 @@ /obj/structure/chair/office, /turf/open/floor/wood, /area/station/service/library) +"tyH" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "tyK" = ( /obj/item/mop, /obj/item/reagent_containers/cup/bucket, @@ -65207,14 +65204,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/ordnance) -"tUv" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "tUx" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -66477,6 +66466,13 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/ce) +"uoR" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/item/radio/intercom/directional/west, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "uoS" = ( /obj/machinery/vending/games, /obj/structure/window/reinforced/spawner/directional/east, @@ -66569,15 +66565,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/eva/lower) -"uqB" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/turf_decal/tile/blue/diagonal_edge, -/obj/machinery/vending/wardrobe/chef_wardrobe{ - pixel_x = -2 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "uqG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -68476,6 +68463,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"uYF" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/iron, +/area/mine/production) "uYH" = ( /obj/machinery/atmospherics/pipe/layer_manifold/dark/visible{ dir = 8 @@ -69642,6 +69635,18 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"vrz" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/duct, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "vrC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70938,14 +70943,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/office) -"vMq" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "vMA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71015,13 +71012,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"vNT" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/preopen, -/obj/machinery/light/small/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/mine/production) "vOw" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red{ @@ -71046,6 +71036,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"vOX" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe{ + pixel_x = -2 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "vPh" = ( /obj/machinery/light/directional/north, /obj/machinery/digital_clock/directional/north, @@ -72976,6 +72972,16 @@ }, /turf/open/floor/iron, /area/station/science/ordnance) +"wst" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/cook, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "wsu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -73785,6 +73791,15 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"wEe" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "wEh" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -74094,14 +74109,6 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) -"wKm" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "wKv" = ( /obj/structure/table, /obj/item/radio/off, @@ -75299,14 +75306,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/grimy, /area/station/service/bar/atrium) -"xbn" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/kitchen/diagonal, -/area/station/service/kitchen) "xbo" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -75416,6 +75415,13 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/storage) +"xdm" = ( +/obj/effect/turf_decal/tile/blue/diagonal_edge, +/obj/machinery/computer/order_console/cook{ + dir = 1 + }, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) "xdA" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -76299,6 +76305,19 @@ /obj/effect/mapping_helpers/airlock/access/all/service/general, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/service) +"xqR" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + dir = 8; + name = "Hydroponics Desk"; + req_access = list("hydroponics") + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "xqX" = ( /obj/structure/sign/poster/contraband/random/directional/north, /obj/structure/cable, @@ -76763,6 +76782,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office) +"xyj" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 6 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Service Botany - Upper North" + }, +/obj/item/hand_labeler, +/turf/open/floor/iron, +/area/station/service/hydroponics) "xyl" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -77781,11 +77814,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"xOM" = ( -/obj/structure/table, -/obj/machinery/mineral/processing_unit_console, -/turf/open/floor/iron, -/area/mine/production) "xPu" = ( /obj/machinery/light/directional/east, /turf/open/misc/asteroid/snow/icemoon, @@ -77897,6 +77925,13 @@ dir = 1 }, /area/station/security/processing) +"xQK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/iron, +/area/mine/production) "xQT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, @@ -77906,6 +77941,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"xRt" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/kitchen/diagonal, +/area/station/service/kitchen) +"xRu" = ( +/obj/machinery/door/airlock{ + name = "Service Hall" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_half, +/area/station/hallway/secondary/service) "xRw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -163361,7 +163412,7 @@ vpc kZu aYM tDa -gzv +sWU cMk cMk gjq @@ -163616,10 +163667,10 @@ kZu bDC kZu kZu -vNT +fxY pql -jLb -oqy +qkI +coY cMk gjq gjq @@ -163875,8 +163926,8 @@ ajr uQx vQy ngl -fFI -mfe +xQK +brX cMk gjq gjq @@ -164132,8 +164183,8 @@ tDa sWB tDa pql -gzv -izq +rnl +gko uvM gjq gjq @@ -164387,10 +164438,10 @@ pAT xlQ lCA kZu -afl -pbv -xOM -izq +jrQ +qud +uYF +jXH nWH hFL hFL @@ -164644,9 +164695,9 @@ dQd nWH nWH nWH -iUd -gbH -ear +mHe +dAq +adm dTF nWH qeP @@ -168488,7 +168539,7 @@ iDt rcY scw iDt -iDt +snL scw scw scw @@ -168745,7 +168796,7 @@ iDt rcY iDt scw -iDt +rxG iDt scw uWE @@ -183374,7 +183425,7 @@ eHW dMS fUn mQk -fwB +vOX fwB fwB fwB @@ -244785,11 +244836,11 @@ uDV ojD ykZ vqD -keq -asJ -qYD -oUK -gEL +vrz +qMs +fBJ +pLK +xyj mpU qFC kTO @@ -245043,9 +245094,9 @@ tCs exw exw exw -exw +gen +xqR glQ -bMu exw exw exw @@ -245298,11 +245349,11 @@ exw hvr exw exw -jPa -enG +bVz mdZ vlI nHa +nHa izC hwM aUY @@ -245556,8 +245607,8 @@ xFA aTV rQt tGZ -tGZ -tqZ +xRu +iFc mrF iFc bJA @@ -245813,8 +245864,8 @@ rtc jJf voM etA -jFA -mnj +hXu +sPi uVn nnW wvb @@ -246069,9 +246120,9 @@ tux dsO kQX tGZ -mEZ -mdZ +iga mdZ +ckK dqd bfZ izC @@ -246326,7 +246377,7 @@ gzw kiB kQX kyZ -kZz +lDL mdZ rth hid @@ -248393,7 +248444,7 @@ gtw gtw gtw gtw -uqB +uoR cpY cGZ lCi @@ -248646,11 +248697,11 @@ oDm qZB gtw xHi -aHZ -jwv -pYI +xRt +kuO +cjp mVY -bmf +xdm cpY tLF cwO @@ -248902,12 +248953,12 @@ ggD ifg qZB gtw -jQo -vMq -eUw -jZt -fkk -cMs +xHi +cHH +tuo +olj +jjM +cwZ cpY lkr lso @@ -249160,10 +249211,10 @@ son qZB gtw kpf -xbn -qDZ -eke -fkk +sQy +kPp +aWq +rpf bpG oKb uXm @@ -249417,10 +249468,10 @@ iXH qZB oEh kpf -kvs -qfe -ecZ -fkk +gtw +lMI +fYv +rpf qIv oKb reM @@ -249674,10 +249725,10 @@ son skp eDx fkk -aEU -fMP -fMP -oyV +wEe +sCM +sCM +wst nqL oKb uXm @@ -249929,9 +249980,9 @@ fbm bQP llG bzn -fyh -sMb -wKm +jOA +eut +tyH pAp haN kqA @@ -250223,7 +250274,7 @@ jih rkM iYs rid -tUv +rvA rkM eHU pko diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 14609b7e9fa..70408c1a763 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -3049,6 +3049,14 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/science/genetics) +"aZd" = ( +/obj/machinery/bouldertech/refinery, +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "mining" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "aZe" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, @@ -3085,6 +3093,17 @@ /obj/machinery/duct, /turf/open/floor/wood, /area/station/service/bar/atrium) +"aZI" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/bouldertech/brm, +/obj/machinery/conveyor{ + dir = 1; + id = "mining" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "bax" = ( /turf/closed/wall, /area/station/commons/storage/primary) @@ -3746,6 +3765,11 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall, /area/station/maintenance/starboard/fore) +"bov" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "boE" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -4005,10 +4029,6 @@ /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/item/book/kindred/station_loving{ - pixel_y = -1; - pixel_x = -6 - }, /turf/open/floor/iron/dark, /area/station/service/library) "bsR" = ( @@ -5187,6 +5207,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/bridge) +"bRg" = ( +/obj/structure/ore_box, +/obj/machinery/light/small/directional/west, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "bRh" = ( /obj/structure/transit_tube/diagonal/topleft, /turf/open/space/basic, @@ -5204,17 +5232,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"bRx" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 8; - req_access = null - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/miningoffice) "bRy" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/gibs/old, @@ -11183,6 +11200,19 @@ "dME" = ( /turf/closed/wall, /area/station/cargo/warehouse) +"dMF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "dMH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/directional/north{ @@ -19750,6 +19780,13 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"gzD" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "gAO" = ( /obj/effect/mapping_helpers/airlock/unres{ dir = 8 @@ -26287,16 +26324,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/station/command/bridge) -"izu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "izv" = ( /obj/structure/closet{ name = "chapel locker" @@ -27001,7 +27028,7 @@ /area/station/command/bridge) "iJO" = ( /obj/structure/reflector/single/anchored{ - dir = 10 + dir = 9 }, /obj/effect/turf_decal/box/corners{ dir = 1 @@ -32029,10 +32056,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port/fore) +"kwl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "kwm" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/iron, /area/station/service/chapel/dock) +"kwn" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "kwx" = ( /obj/structure/sign/xenobio_guide, /turf/closed/wall/rust, @@ -43617,6 +43660,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"oqM" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/bouldertech/refinery/smelter, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "oqN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -47250,6 +47305,21 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/dark, /area/station/security/warden) +"pBc" = ( +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "mining"; + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "pBd" = ( /turf/closed/wall/rust, /area/station/medical/paramedic) @@ -48052,19 +48122,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/aft) -"pNY" = ( -/obj/machinery/computer/security/mining{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display/evac/directional/east, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/cargo/miningoffice) "pNZ" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/delivery, @@ -51799,10 +51856,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/primary) -"rcp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "rcB" = ( /turf/open/floor/grass, /area/station/service/chapel) @@ -52684,6 +52737,20 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"rqU" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "rqV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -54141,6 +54208,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/disposal) +"rNT" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/computer/security/mining{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "rNX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -56763,6 +56839,14 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/brig) +"sFY" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "sGF" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -59542,14 +59626,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"twd" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/ore_box, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/cargo/miningoffice) "twg" = ( /obj/machinery/computer/atmos_alert{ dir = 4 @@ -60439,6 +60515,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/tcommsat/computer) +"tMq" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 8; + req_access = null + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "tMu" = ( /obj/machinery/shower/directional/east, /obj/structure/cable, @@ -60567,6 +60657,13 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/security/processing) +"tOj" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "mining" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/miningoffice) "tOo" = ( /obj/machinery/power/smes, /obj/effect/turf_decal/bot, @@ -61454,6 +61551,20 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"udt" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "mining"; + name = "crate return belt" + }, +/obj/machinery/door/window/left/directional/west{ + dir = 1; + name = "Crate Return Door"; + req_access = list("shipping") + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/cargo/storage) "udA" = ( /obj/machinery/door/airlock/external{ name = "Abandoned External Airlock" @@ -69527,14 +69638,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"wCe" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/cargo/miningoffice) "wCR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73279,20 +73382,6 @@ /obj/structure/cable, /turf/open/floor/circuit/red, /area/station/engineering/supermatter/room) -"xOa" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packagereturn"; - name = "crate return belt" - }, -/obj/machinery/door/window/left/directional/west{ - dir = 1; - name = "Crate Return Door"; - req_access = list("shipping") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/cargo/storage) "xOg" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -73370,20 +73459,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/dark, /area/station/command/bridge) -"xPT" = ( -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "xQq" = ( /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/delivery, @@ -113721,7 +113796,7 @@ lJD fLo nFy hfr -xOa +udt nQO lKq lkF @@ -116018,7 +116093,7 @@ lDu xZL xZL rZV -xPT +pBc hbC chT kaX @@ -116275,7 +116350,7 @@ lDu lDu xZL eJy -izu +dMF iRq aLI dVB @@ -116532,13 +116607,13 @@ rcI lDu xZL rZV -pNY -bRx -rcp -mjW -pmk +rqU +chT +chT +kwl +rNT qAR -acm +aaa aaa aaa bBV @@ -116789,12 +116864,12 @@ cGr oLH kxT rZV -gKI +oqM +tMq +bov +mjW +pmk qAR -oUz -dez -oUz -gKI acm aaa aaa @@ -117046,12 +117121,12 @@ uwq oLH wCY sJS -acm +sFY +qAR oUz -twd -hBa -gPO +dez oUz +gKI acm aaa aaa @@ -117303,13 +117378,13 @@ lDu lDu mrt sJS -aaQ +gzD +bRg +kwn +hBa +gPO oUz -wCe -iVn -xzI -oUz -aaQ +acm aaa aaa aaa @@ -117560,13 +117635,13 @@ lDu xZL xZL rZV -qJs -rLR +aZd +tOj +aZI +iVn +xzI oUz -fxY -oUz -fae -qJs +aaQ aaa aaa aaa @@ -117817,13 +117892,13 @@ lDu wCY rZV rZV -aaa -aaa -aaa -pBi -aaa -aaa -aaa +gKI +rLR +oUz +fxY +oUz +fae +qJs aaa aaa aaa @@ -118077,7 +118152,7 @@ aaa aaa aaa aaa -aaa +pBi aaa aaa aaa @@ -120387,13 +120462,13 @@ acm acK acm acm -qJs -acm -acK -acK -acK -acm -qJs +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -120644,13 +120719,13 @@ acK qDp acm acm -aaQ -aeo -aeo +qJs acm -aeo -aeo -aaQ +acK +acK +acK +acm +qJs aaa aaa aaa @@ -120901,13 +120976,13 @@ acm eiW aaa aaa +aaQ +aeo +aeo acm -aaa -aaa -aaa -aaa -aaa -aaa +aeo +aeo +aaQ aaa aaa aaa @@ -121158,9 +121233,6 @@ acm viq aaQ aeo -aeo -acm -aeo acm aaa aaa @@ -121281,6 +121353,9 @@ aaa aaa aaa aaa +aaa +aaa +aaa "} (182,1,1) = {" aaa @@ -121415,10 +121490,10 @@ acm viq aaa acm -aaa -aaa -aaa -aaa +aeo +acm +aeo +acm aaa aaa aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 34d75ce390b..5752ae0227d 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -873,6 +873,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/station/cargo/miningoffice) "aqG" = ( @@ -4965,6 +4966,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"bMp" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/food/fortunecookie, +/obj/structure/safe/floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "bMA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -5383,6 +5390,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/spawner/random/entertainment/dice, +/obj/item/storage/toolbox/emergency, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bUo" = ( @@ -9925,6 +9934,14 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"dJn" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "dJo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13942,6 +13959,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) +"fed" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "fee" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/trunk{ @@ -13953,6 +13980,12 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) +"feC" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "feF" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/structure/cable, @@ -14648,6 +14681,11 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"fow" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "foB" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/stripes/line{ @@ -22673,6 +22711,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"inW" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/conveyor{ + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "inX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -24338,6 +24383,13 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"iPw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "iPx" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron, @@ -25023,6 +25075,17 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/medical/storage) +"iZt" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "iZF" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -25899,19 +25962,6 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"jpI" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/deck, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "jpO" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -26838,11 +26888,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"jFk" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "jFr" = ( /obj/structure/sign/poster/party_game, /turf/closed/wall, @@ -27573,14 +27618,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "jRC" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Dock Maintenance" - }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/obj/structure/railing/corner/end/flip, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "jRD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -31324,6 +31366,7 @@ /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "llk" = ( @@ -32418,9 +32461,10 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "lJo" = ( -/obj/structure/closet/emcloset, -/obj/machinery/firealarm/directional/east, /obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/north, +/obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/station/cargo/miningoffice) "lJr" = ( @@ -33550,11 +33594,27 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"mdW" = ( -/obj/structure/safe/floor, -/obj/item/food/fortunecookie, +"mdM" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/plating, -/area/station/maintenance/port/fore) +/area/station/cargo/miningoffice) +"mdW" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/conveyor{ + dir = 10; + id = "mining" + }, +/obj/machinery/bouldertech/refinery, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "mei" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, @@ -35167,13 +35227,15 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "mFw" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 }, -/obj/item/storage/box/bandages{ - pixel_x = 4; - pixel_y = 6 +/obj/machinery/conveyor{ + dir = 9; + id = "mining" + }, +/obj/structure/railing{ + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/miningoffice) @@ -37380,12 +37442,12 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "nsM" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/stripes/end{ - dir = 4 +/obj/machinery/conveyor{ + id = "mining" }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/obj/machinery/bouldertech/brm, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "nsO" = ( /obj/machinery/computer/records/security, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -42183,6 +42245,15 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"pgF" = ( +/obj/structure/railing/corner/end, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/rubble, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "pgJ" = ( /obj/structure/chair/stool/directional/north, /obj/machinery/camera/directional/west{ @@ -46031,12 +46102,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qAS" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qAX" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -48333,7 +48398,6 @@ /turf/open/floor/iron, /area/station/science/explab) "ror" = ( -/obj/effect/spawner/random/structure/crate, /obj/structure/disposalpipe/segment{ dir = 5 }, @@ -50766,12 +50830,14 @@ /turf/open/floor/iron/white, /area/station/medical/cryo) "sfG" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown{ +/obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/obj/machinery/bouldertech/refinery/smelter, /turf/open/floor/iron, /area/station/cargo/miningoffice) "sfK" = ( @@ -51330,6 +51396,15 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/engineering/break_room) +"ssn" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "ssr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -53805,6 +53880,12 @@ /obj/effect/spawner/random/food_or_drink/seed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"tjg" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/hand_labeler_refill, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tjh" = ( /turf/closed/wall, /area/station/security/brig) @@ -57318,6 +57399,11 @@ dir = 8 }, /area/station/service/chapel) +"uul" = ( +/obj/structure/cable, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "uur" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57478,12 +57564,7 @@ /turf/open/floor/plating, /area/station/maintenance/fore) "uxd" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/spawner/random/entertainment/dice, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, +/obj/structure/railing, /turf/open/floor/iron, /area/station/cargo/miningoffice) "uxf" = ( @@ -62797,11 +62878,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"wjH" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "wjK" = ( /obj/item/clothing/head/hats/tophat, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65245,6 +65321,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port) +"xfe" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/machinery/conveyor_switch/oneway{ + id = "mining"; + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "xff" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65572,11 +65656,19 @@ /turf/open/floor/wood/parquet, /area/station/medical/psychology) "xkb" = ( -/obj/item/hand_labeler_refill, -/obj/structure/rack, -/obj/machinery/light/small/dim/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/spawner/random/entertainment/deck, +/obj/structure/table, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "xko" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -66303,6 +66395,7 @@ "xxp" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, /area/station/maintenance/port/fore) "xxF" = ( @@ -67048,11 +67141,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"xJV" = ( -/obj/effect/landmark/start/shaft_miner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "xKk" = ( /obj/machinery/photocopier, /turf/open/floor/iron/white, @@ -86636,12 +86724,12 @@ tiK qvl jXu beo -cSP +dJn aZj -qAS +cSP cLj kRe -aFd +pgF mFw oor oor @@ -86894,10 +86982,10 @@ bSm jXu jXu jXu -jXu +hKg lJo -xJV -jpI +cLj +kRe uxd sfG oor @@ -87146,17 +87234,17 @@ twr gQg xxp twr -sxn +sHu xkX ror twr fhn -jXu -jXu +hKg +xfe jRC -jXu -jXu -jXu +ssn +fed +iZt jXu tBU kOX @@ -87406,13 +87494,13 @@ fUr fUr fUr aps -xgB -jZW -jXu +uul +fow +hKg xkb -xgB +feC nsM -twr +inW mdW jXu hvo @@ -87664,13 +87752,13 @@ cVL jXu uur xgB -jXu -jXu -jFk -xgB -sHu -twr twr +hKg +hKg +mdM +hKg +hKg +hKg jXu jmR xap @@ -88179,10 +88267,10 @@ jXu bSm sHu bPM -sxn -uUu +sHu +tjg jXu -rNP +iPw rNP mgv mWE @@ -88958,7 +89046,7 @@ rlU rlU aaf jXu -wjH +sxn mgv cUD cfv @@ -89716,7 +89804,7 @@ jXu uUu dEH pOi -bPM +bMp jXu loQ fsQ diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index e26ac494a0f..ddca03ffee4 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -166,6 +166,14 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/carpet/royalblue, /area/mine/living_quarters) +"bq" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "bt" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -188,6 +196,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 }, +/obj/structure/ore_box, /turf/open/floor/iron/dark, /area/mine/production) "by" = ( @@ -520,6 +529,12 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"dp" = ( +/obj/structure/ore_vent/starter_resources{ + icon_state = "ore_vent_active" + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "dq" = ( /obj/structure/stone_tile{ dir = 4 @@ -609,6 +624,14 @@ }, /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) +"dW" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "ee" = ( /obj/machinery/shower/directional/south, /obj/machinery/door/window/right/directional/south, @@ -870,6 +893,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 }, +/obj/structure/closet/crate/bin, /turf/open/floor/iron/dark, /area/mine/production) "fU" = ( @@ -1693,12 +1717,23 @@ /turf/open/floor/plating, /area/mine/maintenance/living/north) "kx" = ( -/obj/machinery/computer/order_console/mining, /obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/table, +/obj/item/paper/fluff/stations/lavaland/orm_notice, /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, /area/mine/production) +"ky" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "kB" = ( /obj/structure/stone_tile/surrounding_tile, /obj/structure/stone_tile/surrounding_tile{ @@ -2064,6 +2099,18 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lT" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "lV" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -2129,6 +2176,19 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/mine/hydroponics) +"mh" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "mj" = ( /obj/structure/stone_tile/block, /obj/structure/stone_tile/block{ @@ -2485,13 +2545,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/laborcamp) -"nt" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/mine/production) "nv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -3481,11 +3534,10 @@ /turf/open/floor/plating, /area/mine/storage) "tO" = ( -/obj/structure/table, -/obj/item/paper/fluff/stations/lavaland/orm_notice, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/table, /turf/open/floor/iron/dark/smooth_edge{ dir = 1 }, @@ -4258,6 +4310,15 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) +"yQ" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "yR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4437,10 +4498,10 @@ /area/lavaland/surface/outdoors) "Ac" = ( /obj/effect/turf_decal/bot, -/obj/structure/ore_box, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 }, +/obj/machinery/computer/order_console/mining, /turf/open/floor/iron/dark, /area/mine/production) "Ae" = ( @@ -4557,6 +4618,13 @@ "AX" = ( /turf/open/floor/plating, /area/mine/laborcamp/security/maintenance) +"AY" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "Bb" = ( /obj/machinery/camera/autoname/directional/east{ network = list("mine") @@ -4944,6 +5012,16 @@ /obj/effect/turf_decal/sand/plating/volcanic, /turf/open/floor/plating/lavaland_atmos, /area/mine/maintenance/service/disposals) +"Ep" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "Eq" = ( /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Monitoring" @@ -5288,6 +5366,13 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"GV" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "GW" = ( /obj/structure/chair/office{ dir = 1 @@ -5798,6 +5883,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/laborcamp/security/maintenance) +"JO" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "JP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6871,6 +6963,16 @@ }, /turf/open/floor/iron/dark, /area/mine/mechbay) +"Qm" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "Qw" = ( /obj/structure/stone_tile/cracked, /obj/structure/stone_tile{ @@ -7083,6 +7185,7 @@ dir = 1 }, /obj/structure/barricade/wooden/crude, +/obj/structure/barricade/wooden, /turf/open/floor/iron/dark, /area/mine/production) "RV" = ( @@ -7565,6 +7668,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/structure/ore_box, /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) "UZ" = ( @@ -21444,7 +21548,7 @@ uU uU uU uU -uU +pU uU uU uU @@ -21700,8 +21804,8 @@ uU uU uU uU -uU -uU +pU +pU pU uU uU @@ -21955,7 +22059,7 @@ uU uU uU uU -pU +uU pU pU pU @@ -45841,9 +45945,9 @@ pU aj aj aj -aj -aj -aj +AY +lT +JO aj oA Lu @@ -46098,9 +46202,9 @@ aj aj aj aj -aj -aj -aj +bq +dp +Qm aj oA Lz @@ -46355,9 +46459,9 @@ pU pU aj aj -aj -aj -aj +yQ +mh +ky NU NU NU @@ -46613,7 +46717,7 @@ pU pU aj aj -aj +dW aj Le Lh @@ -46869,8 +46973,8 @@ pU pU AQ ZM -ZM -ZM +GV +Ep ZM Ki Uq @@ -48422,7 +48526,7 @@ RY RY dQ Cg -nt +lb pK Ob IL diff --git a/_maps/map_files/NSVBlueshift/Blueshift.dmm b/_maps/map_files/NSVBlueshift/Blueshift.dmm index a418013250b..14d5b818ede 100644 --- a/_maps/map_files/NSVBlueshift/Blueshift.dmm +++ b/_maps/map_files/NSVBlueshift/Blueshift.dmm @@ -35529,9 +35529,9 @@ /area/station/hallway/primary/starboard) "gLI" = ( /obj/machinery/door/airlock/maintenance_hatch{ - name = "Security Maintenance"; - welded = 1 + name = "Security Maintenance" }, +/obj/effect/mapping_helpers/airlock/welded, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 5979af0bd3b..2a613eb35bb 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -1435,15 +1435,6 @@ dir = 4 }, /area/station/hallway/secondary/exit) -"asu" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor1/aft) "asw" = ( /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit/telecomms, @@ -4211,6 +4202,15 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) +"bdo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/structure/table, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/miningdock) "bdx" = ( /obj/structure/railing/corner, /obj/structure/chair/stool/bar/directional/east, @@ -4488,6 +4488,12 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) +"bgw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/reagentgrinder, +/obj/structure/table, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/miningdock) "bgz" = ( /obj/machinery/mech_bay_recharge_port{ dir = 1 @@ -6593,15 +6599,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/command/bridge) -"bEp" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "bED" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical{ @@ -10252,6 +10249,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"cCC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "cCE" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -10480,6 +10484,14 @@ /obj/item/pen/fountain, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) +"cGM" = ( +/obj/structure/cable, +/obj/machinery/conveyor{ + dir = 5; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "cGQ" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 4 @@ -10627,6 +10639,14 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/wood, /area/station/service/bar/atrium) +"cIt" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "cIE" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -11253,19 +11273,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark, /area/station/command/bridge) -"cRk" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "cRs" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -13181,20 +13188,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"dsJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/item/toy/plush/lizard_plushie/space/green{ - name = "Warns-The-Fool"; - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/iron/dark/airless, -/area/station/hallway/floor1/aft) "dtb" = ( /obj/machinery/door/airlock/science/glass{ name = "Break Room" @@ -14643,6 +14636,12 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"dMO" = ( +/obj/structure/sign/warning/chem_diamond/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor1/aft) "dMV" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 9 @@ -17709,6 +17708,16 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"eCD" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "eCJ" = ( /obj/structure/railing, /obj/structure/table, @@ -20647,13 +20656,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor1/aft) -"fvS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless, -/area/station/hallway/floor1/aft) "fvV" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -20971,20 +20973,6 @@ dir = 1 }, /area/station/command/bridge) -"fBE" = ( -/obj/structure/disposalpipe/segment{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/mining/glass{ - name = "Mail Sorting" - }, -/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/any/supply/general, -/turf/open/floor/iron/smooth, -/area/station/cargo/storage) "fBM" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, @@ -21313,6 +21301,12 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) +"fFT" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/floor1/aft) "fFY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -23337,11 +23331,6 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"gha" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "ghg" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 10 @@ -24271,11 +24260,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) -"gun" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "gup" = ( /obj/structure/frame/machine{ anchored = 1 @@ -24501,14 +24485,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/fore) -"gxB" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "gxH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25229,14 +25205,6 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain) -"gGP" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "gHi" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29057,14 +29025,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"hGT" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/chair, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "hGW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30344,13 +30304,6 @@ }, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"hXO" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/table, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "hXQ" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, @@ -32266,17 +32219,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"iyY" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "iyZ" = ( /obj/structure/flora/bush/snow/style_random, /turf/open/misc/snow/actually_safe{ @@ -35481,6 +35423,14 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/circuit, /area/station/science/xenobiology) +"jqV" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "jrl" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -35835,6 +35785,11 @@ dir = 1 }, /area/station/hallway/floor3/fore) +"jwr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/hallway/floor1/aft) "jwu" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -37924,6 +37879,14 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) +"jXW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "jXX" = ( /obj/machinery/camera/directional/north{ c_tag = "Holodeck - Fore"; @@ -39591,16 +39554,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"ksD" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "ksH" = ( /obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -44109,13 +44062,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/side, /area/station/security/office) -"lAq" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "lAD" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 10 @@ -47425,14 +47371,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"mqn" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/item/ammo_casing/spent, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "mqt" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48020,6 +47958,12 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) +"myd" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "myp" = ( /obj/effect/turf_decal/tile/red/anticorner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -48283,6 +48227,14 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/command/gateway) +"mBF" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "mBM" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 4 @@ -49713,6 +49665,18 @@ dir = 1 }, /area/station/hallway/floor3/fore) +"mUw" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/autoname/directional/south, +/obj/item/ammo_casing/spent, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "mUA" = ( /turf/open/floor/plating, /area/station/maintenance/floor3/port) @@ -50483,11 +50447,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/cargo/storage) -"ney" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "neB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/south{ @@ -51629,13 +51588,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/cargo/lobby) -"nsr" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "nss" = ( /obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -53045,6 +52997,13 @@ /mob/living/basic/cow, /turf/open/floor/grass, /area/station/service/hydroponics) +"nKc" = ( +/obj/structure/cable, +/obj/machinery/conveyor/inverted{ + dir = 10 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "nKn" = ( /obj/structure/sign/directions/dorms/directional/east, /obj/structure/sign/directions/evac/directional/east{ @@ -53782,6 +53741,14 @@ "nVq" = ( /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) +"nVs" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "nVw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/side{ @@ -54048,9 +54015,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) -"nYw" = ( -/turf/open/floor/iron, -/area/station/cargo/miningdock) "nYE" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/royalblack, @@ -55443,6 +55407,16 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/security/lockers) +"orx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Mail Sorting" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) "orD" = ( /obj/effect/turf_decal/trimline/white/filled/line, /obj/structure/cable, @@ -57219,12 +57193,6 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) -"oRi" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/structure/crate, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "oRq" = ( /obj/machinery/door/window/left/directional/north{ name = "Pen 3"; @@ -58217,15 +58185,6 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"pfO" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/newscaster/directional/west, -/obj/structure/table, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "pfX" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/machinery/firealarm/directional/north, @@ -59176,6 +59135,22 @@ dir = 1 }, /area/station/hallway/floor4/aft) +"pto" = ( +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/door/airlock/mining/glass{ + name = "Mail Sorting" + }, +/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/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/turf/open/floor/iron/smooth, +/area/station/cargo/storage) "ptu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60446,6 +60421,15 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron/freezer, /area/station/hallway/secondary/service) +"pLI" = ( +/obj/structure/railing/corner/end{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "pLJ" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 @@ -61500,6 +61484,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/hydroponics/garden) +"qas" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "qat" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/checker, @@ -63283,14 +63278,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"qyG" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "qyH" = ( /obj/machinery/atmospherics/components/binary/pump/off/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -64190,6 +64177,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar) +"qJe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/storage/box/donkpockets, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "qJj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64982,6 +64975,13 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) +"qUW" = ( +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "qVa" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -65275,6 +65275,13 @@ }, /turf/open/floor/plating, /area/station/security/eva) +"qYA" = ( +/obj/structure/railing/corner/end, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "qYJ" = ( /obj/item/kirbyplants/organic/plant21, /obj/effect/turf_decal/trimline/purple/line{ @@ -70858,6 +70865,19 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/aft) +"sBK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "sBN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -71958,6 +71978,15 @@ /obj/structure/sign/directions/evac/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"sQH" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "sQT" = ( /obj/effect/turf_decal/stripes, /obj/effect/decal/cleanable/dirt, @@ -72149,6 +72178,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) +"sUp" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "sUt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -72822,6 +72860,14 @@ /obj/machinery/light/red/dim/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) +"tbt" = ( +/obj/structure/cable, +/obj/machinery/bouldertech/refinery/smelter, +/obj/machinery/conveyor/inverted{ + dir = 10 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "tbu" = ( /obj/effect/spawner/random/trash/hobo_squat, /obj/effect/decal/cleanable/dirt, @@ -73283,6 +73329,15 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) +"thH" = ( +/obj/structure/cable, +/obj/machinery/bouldertech/brm, +/obj/machinery/conveyor{ + dir = 4; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "thM" = ( /obj/structure/railing{ dir = 1 @@ -73500,6 +73555,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) +"tkZ" = ( +/obj/structure/cable, +/obj/machinery/conveyor/inverted{ + dir = 6 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "tlb" = ( /mob/living/simple_animal/slime, /turf/open/floor/engine{ @@ -73964,10 +74026,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"tqo" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/hallway/floor1/aft) "tqr" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -75518,13 +75576,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"tLH" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "tMd" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -76030,6 +76081,13 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"tTv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/miningdock) "tTw" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 8 @@ -77328,14 +77386,6 @@ dir = 8 }, /area/station/service/chapel) -"ulv" = ( -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/obj/machinery/door/airlock/mining{ - name = "Mining Decontamination" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_large, -/area/station/cargo/storage) "ulB" = ( /obj/structure/hedge, /turf/open/floor/carpet/green, @@ -77543,6 +77593,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/station/service/library/printer) +"upc" = ( +/obj/machinery/atmospherics/components/trinary/filter/critical{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "uph" = ( /obj/machinery/door/airlock/hatch{ name = "Elevator Shaft Access" @@ -78873,6 +78930,12 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark, /area/station/science/cytology) +"uIh" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron/textured_large, +/area/station/cargo/storage) "uIi" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/pump, @@ -79782,6 +79845,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"uSC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/bouldertech/refinery, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "uSN" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -80913,6 +80985,19 @@ }, /turf/open/floor/iron/dark/small, /area/station/service/chapel/office) +"viG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "viL" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 5 @@ -81196,16 +81281,6 @@ "vmr" = ( /turf/closed/wall, /area/station/engineering/atmos/hfr_room) -"vmu" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "vmA" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 6 @@ -82827,6 +82902,13 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/fore) +"vHa" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "vHd" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -82919,11 +83001,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"vIe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/catwalk_floor/iron, -/area/station/cargo/miningdock) "vIh" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -83950,6 +84027,12 @@ dir = 1 }, /area/station/security/prison) +"vWp" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "vWw" = ( /turf/closed/wall/r_wall, /area/station/security/office) @@ -84781,6 +84864,14 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_half, /area/station/engineering/storage/tech) +"wgu" = ( +/obj/structure/cable, +/obj/machinery/conveyor{ + dir = 9; + id = "mining" + }, +/turf/open/floor/iron/checker, +/area/station/cargo/miningdock) "wgO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -89238,16 +89329,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/carpet/red, /area/station/service/theater) -"xkE" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/reagentgrinder, -/obj/structure/table, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/checker, -/area/station/cargo/miningdock) "xkN" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/item/hatchet, @@ -91824,6 +91905,18 @@ dir = 5 }, /area/station/hallway/floor4/fore) +"xUS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/toy/plush/lizard_plushie/space/green{ + name = "Warns-The-Fool"; + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/catwalk_floor/iron, +/area/station/cargo/miningdock) "xUU" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -93020,12 +93113,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"ylD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/airless, -/area/station/hallway/floor1/aft) "ylE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -119143,7 +119230,7 @@ cMA mnR acv hNz -fBE +pto nlu aAZ iRK @@ -119907,16 +119994,16 @@ dOs dOs oCK bZr -gun +uIh tHL nAm hLP -rbT +nAm tHL tHL cUL ggO -ulv +orx ncc jhV pAb @@ -120168,7 +120255,7 @@ hBw bcZ hBw hLP -ney +hBw tHL kOS hDf @@ -120421,7 +120508,7 @@ dOs dOs oCK bZr -rbT +nAm nTZ iyU aat @@ -120935,7 +121022,7 @@ dOs dOs oCK mjQ -nAm +rbT ijL rbT hLP @@ -121451,7 +121538,7 @@ gcE fXm mqt uKO -oRi +mqt aat ydt oYn @@ -125057,11 +125144,11 @@ mRt bAL vOx yiw -hGT -hXO -pfO -dpH -ylD +jqV +pLI +qUW +vWp +cIt rjD cax cKC @@ -125314,12 +125401,12 @@ bLt qeW rim njk -gxB -cRk -vmu -gha -fvS -tqo +viG +cGM +wgu +thH +jXW +jwr sAK cKC bfC @@ -125569,15 +125656,15 @@ kLn ehG apM quB -nYw +myd ehG -gGP -nsr -qyG -dpH -fvS +sQH +vHa +uSC +vHa +nVs rjD -asu +fFT cKC mkO xgH @@ -125828,12 +125915,12 @@ oCf quB mRt dAc -lAq -ksD -mqn -gha -fvS -tqo +sBK +tbt +tkZ +nKc +qas +jwr cax cKC kSN @@ -126085,13 +126172,13 @@ bBV wBB xxx yiw -iyY -bEp -xkE -dpH -dsJ +eCD +sUp +mBF +qYA +mUw rjD -cax +dMO cqY kSN xgH @@ -126325,13 +126412,13 @@ dpH ehG tFc yim -yim -mRt -yim -vIe +bgw +cCC +tTv +bdo vyN -mRt -yim +qJe +xUS qcW tIn bMD @@ -140232,7 +140319,7 @@ uyD uyD uyD uyD -tLH +upc kfo mvg dEc diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index 6c4cfd024bd..d5589ca885b 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -16263,7 +16263,6 @@ /obj/effect/turf_decal/box, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; - dir = 4; location = "QM #2" }, /turf/open/floor/iron/smooth_edge, @@ -19102,7 +19101,6 @@ "fzg" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=1"; - dir = 1; location = "Janitor" }, /obj/structure/plasticflaps/opaque{ @@ -24574,7 +24572,6 @@ "hcH" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; - dir = 4; location = "Atmospherics" }, /obj/effect/turf_decal/delivery, @@ -38172,7 +38169,6 @@ }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; - dir = 4; location = "Medbay" }, /obj/effect/turf_decal/delivery/blue, @@ -54934,7 +54930,6 @@ /obj/effect/turf_decal/box, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; - dir = 4; location = "QM #3" }, /turf/open/floor/iron/smooth_edge, @@ -69582,7 +69577,6 @@ }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; - dir = 4; location = "Medbay" }, /obj/effect/turf_decal/delivery, @@ -70789,7 +70783,6 @@ /obj/machinery/firealarm/directional/north, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; - dir = 4; location = "QM #4" }, /obj/effect/turf_decal/box, @@ -75312,7 +75305,6 @@ }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; - dir = 4; location = "Robotics" }, /turf/open/floor/iron/dark/smooth_large, @@ -82982,7 +82974,6 @@ }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; - dir = 4; location = "QM #1" }, /obj/effect/turf_decal/box, @@ -86917,7 +86908,6 @@ }, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; - dir = 4; location = "Engineering" }, /turf/open/floor/iron/smooth_large, diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 0638947a9ac..c8a2d32ce84 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1946,6 +1946,7 @@ "sH" = ( /obj/structure/table, /obj/item/storage/box/shipping, +/obj/item/boulder_beacon, /turf/open/floor/iron, /area/station/commons/storage/primary) "tE" = ( diff --git a/_maps/map_files/generic/CentCom_skyrat_z2.dmm b/_maps/map_files/generic/CentCom_skyrat_z2.dmm index ad1baba7504..620b51c80b4 100644 --- a/_maps/map_files/generic/CentCom_skyrat_z2.dmm +++ b/_maps/map_files/generic/CentCom_skyrat_z2.dmm @@ -310,12 +310,7 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "ahk" = ( -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "ahs" = ( /obj/structure/flora/bush/leavy/style_2, @@ -363,7 +358,7 @@ /obj/machinery/door/airlock{ id_tag = "CCD2" }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "ahQ" = ( /obj/structure/flora/bush/sparsegrass, @@ -475,12 +470,7 @@ color = "#B22222"; name = "Curtain" }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "ajK" = ( /obj/structure/flora/rock/pile{ @@ -592,12 +582,7 @@ "alk" = ( /obj/item/bedsheet/dorms_double, /obj/structure/bed/double, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "alm" = ( /obj/effect/turf_decal/tile/blue{ @@ -775,9 +760,6 @@ }, /turf/open/floor/iron/freezer, /area/centcom/holding/cafe) -"amF" = ( -/turf/open/floor/carpet/royalblack, -/area/centcom/holding/cafe) "amG" = ( /obj/structure/chair/sofa/corp/left, /turf/open/floor/carpet/purple, @@ -1115,7 +1097,7 @@ }, /obj/structure/bed/double/pod, /obj/item/bedsheet/dorms_double, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aqy" = ( /obj/machinery/vending/wardrobe/cargo_wardrobe/ghost_cafe, @@ -1221,12 +1203,7 @@ "asz" = ( /obj/structure/table/wood/fancy/blue, /obj/machinery/light/directional/north, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "asC" = ( /obj/effect/turf_decal/tile/blue{ @@ -1645,11 +1622,7 @@ light_range = 10; nightshift_light_power = 10 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "axF" = ( /obj/structure/bed/dogbed, @@ -2064,12 +2037,7 @@ /obj/structure/mirror{ pixel_y = 32 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aAY" = ( /obj/effect/turf_decal/tile/blue{ @@ -2150,7 +2118,7 @@ /obj/structure/chair/sofa/corp/right{ dir = 4 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aBH" = ( /obj/effect/turf_decal/tile/neutral{ @@ -2173,7 +2141,7 @@ /area/centcom/holding/cafe) "aBT" = ( /obj/structure/table/wood, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aBW" = ( /obj/machinery/hydroponics/constructable, @@ -3260,11 +3228,7 @@ light_range = 10; nightshift_light_power = 10 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "aOZ" = ( /obj/machinery/light/directional/north, @@ -3286,12 +3250,7 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aPx" = ( -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aPC" = ( /obj/structure/railing{ @@ -3434,12 +3393,7 @@ /obj/structure/fireplace{ dir = 4 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aQR" = ( /obj/effect/turf_decal/stripes/line{ @@ -3540,11 +3494,7 @@ /obj/structure/toilet{ pixel_y = 14 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "aRC" = ( /obj/machinery/light/directional/north, @@ -3824,7 +3774,7 @@ /obj/structure/chair/sofa/corp/left{ dir = 4 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aUw" = ( /obj/structure/stone_tile/surrounding_tile{ @@ -3926,11 +3876,7 @@ /area/centcom/holding/cafepark) "aVC" = ( /obj/machinery/shower/directional/west, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "aVI" = ( /obj/structure/fake_stairs/directional/east, @@ -4820,7 +4766,7 @@ /obj/structure/chair/sofa/corp{ dir = 4 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "bQZ" = ( /obj/structure/reagent_dispensers/plumbed, @@ -4858,12 +4804,7 @@ /obj/structure/fireplace{ dir = 8 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "bTR" = ( /obj/structure/table/reinforced, @@ -4979,7 +4920,7 @@ /area/centcom/interlink) "bZt" = ( /obj/structure/chair/sofa/corp/corner, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "cal" = ( /obj/structure/railing{ @@ -5094,7 +5035,7 @@ /obj/structure/chair/sofa/corp/left{ dir = 8 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "cmh" = ( /obj/effect/turf_decal/siding{ @@ -5351,7 +5292,7 @@ /obj/structure/sign/painting/library_secure{ pixel_x = 32 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "cHY" = ( /obj/effect/turf_decal/weather/dirt{ @@ -5584,11 +5525,7 @@ /obj/structure/toilet{ pixel_y = 14 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "dbZ" = ( /obj/effect/turf_decal/weather/dirt{ @@ -5782,7 +5719,7 @@ /obj/structure/chair/sofa/corp/corner{ dir = 4 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "dzn" = ( /obj/structure/fence{ @@ -5827,7 +5764,7 @@ /area/centcom/interlink) "dDF" = ( /obj/structure/chair/sofa/corp, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "dFj" = ( /obj/machinery/door/airlock/medical/glass{ @@ -6067,7 +6004,7 @@ id_tag = "CCD1" }, /obj/structure/fans/tiny/invisible, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "dXe" = ( /obj/structure/flora/grass/jungle/b/style_2, @@ -7009,7 +6946,7 @@ /area/centcom/interlink) "fPs" = ( /obj/item/kirbyplants/random, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "fQt" = ( /mob/living/basic/crab{ @@ -7647,12 +7584,7 @@ /obj/structure/dresser{ pixel_y = 7 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "hbE" = ( /obj/structure/fence/interlink{ @@ -8456,7 +8388,7 @@ /area/centcom/interlink) "ioZ" = ( /obj/machinery/light/directional/east, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "ipc" = ( /obj/structure/sign/poster/random/directional/east, @@ -8598,11 +8530,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/thinplating_new/end, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "iCz" = ( /obj/structure/fans/tiny/invisible, @@ -9346,7 +9274,7 @@ "jYf" = ( /obj/structure/table/wood, /obj/item/paper_bin, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "jYy" = ( /obj/effect/turf_decal/sand, @@ -11267,12 +11195,7 @@ /obj/structure/chair/sofa/corp/left{ dir = 8 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "nii" = ( /obj/structure/fireplace, @@ -11429,12 +11352,7 @@ /obj/structure/chair/sofa/corp/right{ dir = 8 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "npe" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, @@ -12391,7 +12309,7 @@ dir = 4 }, /obj/machinery/light/directional/west, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "pao" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -12412,7 +12330,7 @@ specialfunctions = 4 }, /obj/item/kirbyplants/random, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "pbz" = ( /obj/effect/turf_decal/tile/blue{ @@ -13017,12 +12935,7 @@ /obj/structure/chair/sofa/corp/right{ dir = 4 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "pTO" = ( /obj/structure/table/reinforced, @@ -13192,12 +13105,7 @@ /area/centcom/interlink) "qfy" = ( /obj/structure/table/wood/fancy/blue, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "qgh" = ( /obj/structure/stone_tile/surrounding, @@ -13509,8 +13417,8 @@ /turf/open/floor/iron/white, /area/centcom/interlink) "qGA" = ( -/obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/vending/wardrobe/sec_wardrobe, /turf/open/floor/iron/dark, /area/centcom/holding/cafe) "qGW" = ( @@ -13522,12 +13430,7 @@ /obj/item/stack/sheet/mineral/wood/fifty, /obj/item/stack/sheet/mineral/wood/fifty, /obj/item/lighter, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "qHJ" = ( /obj/structure/extinguisher_cabinet/directional/north, @@ -13629,7 +13532,7 @@ /obj/structure/chair/sofa/corp{ dir = 8 }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "qQl" = ( /obj/machinery/light/directional/south, @@ -13711,11 +13614,7 @@ /area/centcom/holding/cafepark) "qWc" = ( /obj/machinery/shower/directional/west, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "qWv" = ( /obj/effect/turf_decal/tile/blue{ @@ -14589,12 +14488,7 @@ }, /obj/structure/bed/double, /obj/item/bedsheet/dorms_double, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "ssn" = ( /obj/machinery/status_display/shuttle{ @@ -14665,11 +14559,7 @@ "sys" = ( /obj/machinery/shower/directional/west, /obj/structure/sink/directional/south, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "sAC" = ( /obj/effect/turf_decal/box, @@ -15164,11 +15054,7 @@ /turf/open/floor/fakebasalt, /area/centcom/holding/cafepark) "tky" = ( -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafe) "tlu" = ( /obj/effect/turf_decal/siding/wood{ @@ -16262,11 +16148,7 @@ /obj/structure/mirror{ pixel_y = 32 }, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "vui" = ( /obj/effect/turf_decal/siding/wood{ @@ -16589,12 +16471,7 @@ /obj/structure/chair/sofa/corp/left{ dir = 4 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "vZv" = ( /obj/structure/window/reinforced/spawner/directional/south, @@ -16896,11 +16773,7 @@ /area/centcom/holding/cafepark) "wBX" = ( /obj/structure/sink/directional/south, -/turf/open/indestructible/hoteltile{ - icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; - icon_state = "titanium_blue_old"; - name = "bathroom floor" - }, +/turf/open/indestructible/bathroom, /area/centcom/holding/cafedorms) "wCl" = ( /obj/item/kirbyplants/random, @@ -17241,7 +17114,7 @@ light_power = 10; name = "Super Light" }, -/turf/open/floor/carpet/royalblack, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "xgz" = ( /obj/effect/turf_decal/siding/wood{ @@ -17634,12 +17507,7 @@ /obj/structure/sign/painting/library_secure{ pixel_y = -32 }, -/turf/open/indestructible/hotelwood{ - desc = "It's really cozy! Great for soft paws!"; - icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; - icon_state = "carpet"; - name = "soft carpet" - }, +/turf/open/indestructible/carpet, /area/centcom/holding/cafe) "xRx" = ( /obj/item/stack/sheet/mineral/wood/fifty, @@ -56583,9 +56451,9 @@ aFP ayI ayI dWE -amF -amF -amF +aPx +aPx +aPx axD tky aqf @@ -56841,7 +56709,7 @@ ayI ayI aqf paJ -amF +aPx cGX aqf qWc @@ -63522,7 +63390,7 @@ dyU bQR paj fPs -amF +aPx aqf aFP ayI @@ -63778,8 +63646,8 @@ aPZ dDF jYf xga -amF -amF +aPx +aPx aqf aFP ayI @@ -64035,8 +63903,8 @@ aqf bZt qPy clF -amF -amF +aPx +aPx ahP aFP ayI @@ -64291,9 +64159,9 @@ jeI aqf aqf aqf -amF -amF -amF +aPx +aPx +aPx aqf kWr ayI @@ -64548,9 +64416,9 @@ jeI aqf dbn axD -amF -amF -amF +aPx +aPx +aPx aqf lwv lwv @@ -64805,7 +64673,7 @@ jeI aqf sys aqf -amF +aPx ioZ aqw aqf diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 35dbcc63b41..05b9c49700d 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -395,10 +395,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/escapepodbay) -"abE" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/station/maintenance/port/central) "abF" = ( /obj/effect/turf_decal/tile/bar{ dir = 8 @@ -1065,6 +1061,21 @@ /obj/effect/spawner/random/trash/cigbutt, /turf/open/misc/asteroid, /area/station/asteroid) +"adt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/turf/open/floor/iron, +/area/station/service/janitor) "adu" = ( /obj/machinery/duct, /obj/machinery/door/firedoor, @@ -1606,24 +1617,6 @@ /obj/structure/flora/bush/grassy, /turf/open/floor/grass, /area/station/asteroid) -"afi" = ( -/obj/effect/landmark/start/shaft_miner, -/obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) -"afj" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "afl" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -2414,6 +2407,12 @@ /obj/effect/turf_decal/trimline/white/filled/line, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"ajn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "ajo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, @@ -2735,6 +2734,9 @@ }, /obj/item/book/manual/wiki/atmospherics, /obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 6 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "amL" = ( @@ -2858,6 +2860,7 @@ /area/station/engineering/storage/tech) "any" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "anB" = ( @@ -2887,6 +2890,7 @@ /obj/structure/sign/warning/secure_area{ pixel_x = 32 }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "anU" = ( @@ -3066,28 +3070,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/tcommsat/computer) -"apW" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrigright"; - name = "Brig" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig_right" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/entrance, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination/sec, -/turf/open/floor/iron, -/area/station/security/brig) "aqf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -3425,6 +3407,14 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"auq" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Utilities Access Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "aur" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/grimy, @@ -3782,6 +3772,13 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, /area/station/security/brig) +"axr" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "axt" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -3962,12 +3959,6 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/glass/reinforced, /area/station/security/brig) -"azC" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/center) "azN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -4008,6 +3999,17 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) +"aAz" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "aAE" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 1 @@ -4427,15 +4429,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"aEm" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "aEn" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -4605,6 +4598,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"aGi" = ( +/obj/machinery/door_buttons/airlock_controller{ + idExterior = "middleright_lower_upper_eva_external"; + idInterior = "middleright_lower_upper_eva_internal"; + idSelf = "middleright_lower_upper_eva_airlock_control"; + name = "External Access Console"; + pixel_y = -24 + }, +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "aGk" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -5332,6 +5337,15 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) +"aMt" = ( +/obj/structure/sign/warning/electric_shock, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/station/maintenance/tram/right) "aMv" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -5897,10 +5911,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/execution/education) -"aRT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/service/janitor) "aSe" = ( /obj/structure/closet/wardrobe/black, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -6055,14 +6065,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"aUx" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "aUC" = ( /obj/machinery/camera/directional/south{ c_tag = "Civilian - Chapel South" @@ -6127,6 +6129,21 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white, /area/station/science/lower) +"aWJ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Primary Tool Storage" + }, +/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/landmark/navigate_destination/tools, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "aWL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -6195,7 +6212,7 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 1 }, -/obj/structure/sign/clock/directional/north, +/obj/machinery/light_switch/directional/north, /turf/open/floor/iron, /area/station/service/janitor) "aYn" = ( @@ -6229,11 +6246,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"aZr" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/right) "aZQ" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -6368,27 +6380,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"bdX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external{ - autoclose = 0; - frequency = 1449; - id_tag = "middleright_upper_eva_internal"; - name = "External Access" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "middleright_upper_eva_internal"; - idSelf = "middleright_upper_eva_airlock_control"; - name = "External Access Button"; - pixel_y = -24 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "bej" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/trimline/green/filled/line, @@ -6630,10 +6621,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) -"bjn" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "bjK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -6812,10 +6799,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"boi" = ( -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "bok" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -7000,22 +6983,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"brE" = ( -/obj/structure/closet/l3closet/janitor, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 10 - }, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/obj/machinery/light_switch/directional/east{ - pixel_x = 23; - pixel_y = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/service/janitor) "brG" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/wood/parquet, @@ -7198,6 +7165,13 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/station/command/meeting_room) +"bvA" = ( +/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/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "bvH" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -7217,22 +7191,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"bvL" = ( -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/warning, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/janitor) "bvM" = ( /obj/machinery/computer/mech_bay_power_console, /turf/open/floor/circuit/green, @@ -7499,15 +7457,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"bAa" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +"bAj" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Tram Mechanical Room" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/right) "bAK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7517,6 +7477,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"bAP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "bAT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -7893,6 +7860,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"bIs" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/exit) "bIz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7909,15 +7882,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"bII" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light/small/dim/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "bIJ" = ( /obj/structure/bodycontainer/crematorium{ dir = 8; @@ -7946,18 +7910,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) -"bJY" = ( -/obj/machinery/button/elevator/directional/north{ - id = "tram_upper_center_lift" - }, -/obj/machinery/lift_indicator/directional/north{ - linked_elevator_id = "tram_upper_center_lift" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "bKb" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -8179,6 +8131,23 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"bLS" = ( +/obj/machinery/requests_console/directional/south{ + department = "Janitorial"; + name = "Janitorial Requests Console" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 6 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "bLT" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -8220,12 +8189,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) -"bMX" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "bMZ" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 6 @@ -8510,19 +8473,6 @@ /obj/structure/closet/secure_closet/brig, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"bTc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, -/obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, -/obj/effect/mapping_helpers/mail_sorting/medbay/general, -/obj/effect/mapping_helpers/mail_sorting/medbay/virology, -/obj/machinery/light/small/dim/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "bTm" = ( /obj/machinery/field/generator, /turf/open/floor/plating, @@ -8847,6 +8797,18 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"bXs" = ( +/obj/machinery/door_buttons/airlock_controller{ + idExterior = "middleright_lower_lower_eva_external"; + idInterior = "middleright_lower_lower_eva_internal"; + idSelf = "middleright_lower_lower_eva_airlock_control"; + name = "External Access Console"; + pixel_y = -24 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "bXv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -9110,6 +9072,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"cbc" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "cbe" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -9128,6 +9094,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/commons/dorms) +"cbA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "cbG" = ( /obj/effect/landmark/start/security_officer, /obj/structure/chair{ @@ -9206,6 +9178,11 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"ccU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/center) "ccX" = ( /obj/machinery/vending/engivend, /turf/open/floor/iron, @@ -9494,13 +9471,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/plating, /area/station/security/prison/work) -"cgF" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "cgR" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -9715,6 +9685,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"clO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "clT" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) @@ -9737,6 +9714,16 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"cmM" = ( +/obj/structure/disposalpipe/segment{ + 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/atmospherics/pipe/smart/simple/cyan/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos) "cmW" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 2 @@ -9747,14 +9734,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"cmZ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "cnt" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/corner{ @@ -9849,6 +9828,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"cpR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "cpY" = ( /obj/machinery/duct, /obj/structure/cable, @@ -9857,6 +9841,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"cqj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "cqn" = ( /obj/structure/table, /obj/machinery/camera/directional/south{ @@ -9946,6 +9937,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/cargo/miningdock) +"crQ" = ( +/obj/structure/chair/sofa/bench/tram/left{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "crR" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -10046,9 +10044,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) +"csl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "csA" = ( /turf/closed/wall, /area/station/solars/starboard/fore) +"csH" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "csN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -10086,6 +10101,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"cuf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "cuM" = ( /obj/structure/table, /obj/item/radio/intercom/prison/directional/north, @@ -10546,6 +10570,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/medical/virology) +"cBD" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "cBP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10569,10 +10600,6 @@ /obj/machinery/light/warm/directional/east, /turf/open/floor/wood, /area/station/service/theater) -"cCw" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/station/hallway/primary/tram/right) "cCD" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/duct, @@ -10687,12 +10714,10 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/security/execution/transfer) -"cEV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) +"cFb" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/station/hallway/secondary/exit) "cFg" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -11252,18 +11277,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"cOu" = ( -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleright_lower_lower_eva_external"; - idInterior = "middleright_lower_lower_eva_internal"; - idSelf = "middleright_lower_lower_eva_airlock_control"; - name = "External Access Console"; - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "cOC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -11286,7 +11299,8 @@ /obj/machinery/light/small/directional/west, /obj/machinery/flasher/directional/west{ pixel_x = -24; - pixel_y = -8 + pixel_y = -8; + id = "hopflash" }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) @@ -11308,6 +11322,18 @@ dir = 8 }, /area/station/service/kitchen) +"cPg" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/sign/warning/electric_shock/directional/west, +/obj/machinery/camera/emp_proof{ + c_tag = "Engineering - SMES"; + dir = 10; + network = list("ss13","engineering") + }, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "cPl" = ( /obj/structure/railing/corner{ dir = 4 @@ -11589,6 +11615,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/garden) +"cTc" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall, +/area/station/hallway/primary/tram/center) "cTl" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -11622,6 +11652,13 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"cUB" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "cUE" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -11761,6 +11798,14 @@ dir = 9 }, /area/station/service/chapel) +"cWA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "cWF" = ( /turf/closed/wall, /area/station/security/execution/transfer) @@ -11837,6 +11882,25 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"cYe" = ( +/obj/machinery/door/airlock/engineering{ + name = "Tram Mechanical Room" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/decal/cleanable/dirt, +/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/unres{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/port/central) +"cYh" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "cYl" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -11931,6 +11995,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/engineering/atmos) +"cZQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "cZT" = ( /obj/structure/alien/weeds, /obj/item/clothing/mask/facehugger/dead, @@ -12074,6 +12144,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningdock) +"dci" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "dck" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12094,13 +12168,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"dcw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing, -/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/hallway/secondary/exit) "dcz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -12173,6 +12240,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/safe) +"ddY" = ( +/obj/structure/sign/poster/official/jim_nortons/directional/north, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "dec" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -12221,6 +12296,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/solars/starboard/fore) +"deU" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/right) "deX" = ( /obj/machinery/duct, /obj/structure/disposalpipe/segment, @@ -12453,6 +12533,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningdock) +"djS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "dka" = ( /obj/structure/chair/sofa/right{ dir = 1 @@ -13396,6 +13483,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"dCJ" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "dCU" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -13466,9 +13557,40 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"dEo" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "dEv" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) +"dEH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + autoclose = 0; + frequency = 1449; + id_tag = "middleleft_upper_eva_internal"; + name = "External Access" + }, +/obj/machinery/door_buttons/access_button{ + idDoor = "middleleft_upper_eva_internal"; + idSelf = "middleleft_upper_eva_airlock_control"; + name = "External Access Button"; + pixel_y = -24 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "dEM" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -13696,15 +13818,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/left) -"dIJ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "dIK" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/freezerchamber) @@ -13738,6 +13851,10 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) +"dJk" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall, +/area/station/hallway/primary/tram/right) "dJm" = ( /obj/structure/chair{ dir = 4 @@ -13763,12 +13880,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"dJq" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/landmark/navigate_destination/dockaux, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "dJG" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate/freezer/blood, @@ -13875,6 +13986,18 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/engineering/main) +"dLD" = ( +/obj/effect/turf_decal/bot, +/obj/item/mop, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 5 + }, +/obj/structure/mop_bucket/janitorialcart, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "dLI" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "EVA Maintenance Hatch" @@ -13920,6 +14043,16 @@ /obj/machinery/light/dim/directional/south, /turf/open/floor/catwalk_floor, /area/station/solars/port) +"dMw" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "dME" = ( /turf/closed/wall, /area/station/service/theater) @@ -14081,14 +14214,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"dPt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/hallway/secondary/exit) "dPu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -14281,13 +14406,6 @@ /obj/item/stack/medical/gauze, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"dRS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "dRY" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/trimline/brown/line, @@ -15065,18 +15183,17 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"ejh" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "ejm" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"ejo" = ( +/obj/effect/turf_decal/sand, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "ejD" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -15118,13 +15235,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/kitchen) -"ejL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "ejR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -15176,6 +15286,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/work) +"eki" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "ekB" = ( /turf/closed/wall, /area/station/service/janitor) @@ -15241,6 +15360,20 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/lower) +"emp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit) "ems" = ( /obj/structure/bed, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -15607,10 +15740,6 @@ "euC" = ( /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"euF" = ( -/obj/machinery/light/small/dim/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "euI" = ( /obj/structure/table/wood, /turf/open/floor/carpet, @@ -15747,6 +15876,14 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) +"ext" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "exv" = ( /obj/structure/railing{ dir = 1 @@ -15979,6 +16116,12 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos) +"eAV" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "eAX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16034,13 +16177,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) -"eBu" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "eBy" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -16384,6 +16520,13 @@ /obj/effect/spawner/random/armory/riot_shield, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"eJI" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "eJQ" = ( /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) @@ -16423,13 +16566,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"eKI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/dim/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "eLl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -16982,6 +17118,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/warehouse) +"eVy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "eVz" = ( /turf/open/floor/grass, /area/station/service/hydroponics) @@ -17094,6 +17236,16 @@ }, /turf/open/space/openspace, /area/space) +"eYr" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "eYs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -17173,6 +17325,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) +"eZE" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + 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/directional/west, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/service/janitor) "eZO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -17285,9 +17451,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) -"fcR" = ( -/turf/open/openspace, -/area/station/hallway/secondary/exit) +"fdc" = ( +/obj/machinery/bouldertech/brm, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "fdr" = ( /obj/machinery/duct, /obj/structure/cable, @@ -17303,6 +17474,14 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"fdM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/hallway/secondary/exit) "fdU" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -17409,18 +17588,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"ffF" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/sign/warning/electric_shock, -/obj/machinery/camera/emp_proof{ - c_tag = "Engineering - SMES"; - dir = 10; - network = list("ss13","engineering") - }, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/engineering/engine_smes) "ffL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17464,18 +17631,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"fgs" = ( -/obj/machinery/door/airlock/vault{ - name = "High Security Vault" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/access/all/supply/vault, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/navigate_destination/vault, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "fgH" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner, @@ -17655,6 +17810,9 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"fiW" = ( +/turf/open/openspace, +/area/station/hallway/secondary/exit) "fja" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -17935,6 +18093,14 @@ /obj/structure/cable, /turf/open/space/openspace, /area/station/solars/port) +"fnL" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/hallway/primary/tram/left) "fnO" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -18037,13 +18203,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"fpx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "fpQ" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/structure/cable, @@ -18291,15 +18450,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) -"fuc" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "fuj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, @@ -18344,6 +18494,9 @@ }, /obj/item/tank/internals/emergency_oxygen, /obj/item/clothing/mask/breath, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ + dir = 9 + }, /turf/open/floor/iron, /area/station/engineering/atmos) "fvx" = ( @@ -18355,6 +18508,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"fvD" = ( +/obj/effect/decal/cleanable/dirt, +/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/hallway/secondary/exit) "fvK" = ( /obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, @@ -18616,6 +18776,10 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"fCP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/service/janitor) "fCS" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -18668,16 +18832,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/research) -"fDF" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Tram Mechanical Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "fDS" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room" @@ -18719,11 +18873,6 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"fEr" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "fEG" = ( /obj/machinery/deepfryer, /obj/structure/extinguisher_cabinet/directional/east, @@ -18846,6 +18995,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"fFO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/disposals, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal) "fFR" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -19069,20 +19223,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lower) -"fKL" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - 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/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/service/janitor) "fKO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -19323,17 +19463,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"fPk" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "fPv" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ @@ -19389,6 +19518,13 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"fQF" = ( +/obj/machinery/newscaster/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "fQH" = ( /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ @@ -19634,6 +19770,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) +"fUT" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Command Wing Hallway" + }, +/obj/structure/disposalpipe/segment, +/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/secondary/command) "fVg" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -19665,6 +19818,15 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) +"fVN" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "fVX" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 @@ -19676,13 +19838,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) -"fWa" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "fWi" = ( /obj/structure/rack, /obj/structure/window/spawner/directional/north, @@ -19797,12 +19952,6 @@ }, /turf/open/floor/iron, /area/station/escapepodbay) -"fXN" = ( -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/exit) "fXQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -19816,6 +19965,15 @@ "fYf" = ( /turf/open/floor/iron/textured_large, /area/station/security/execution/education) +"fYl" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "fYo" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -20146,18 +20304,6 @@ "gfK" = ( /turf/closed/wall/r_wall, /area/station/security/execution/education) -"gfO" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleleft_upper_lower_eva_external"; - idInterior = "middleleft_upper_lower_eva_internal"; - idSelf = "middleleft_upper_lower_eva_airlock_control"; - name = "External Access Console"; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "gfV" = ( /obj/structure/table/wood/fancy/green, /obj/effect/spawner/round_default_module, @@ -20555,17 +20701,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"gmp" = ( -/obj/machinery/vending/wardrobe/jani_wardrobe, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 +"gmm" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Utilities Access Hatch" }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/janitor) +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "gmq" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -20734,6 +20878,13 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"goY" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "gpb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20955,11 +21106,6 @@ /obj/structure/cable, /turf/open/openspace, /area/station/solars/starboard/fore) -"gtY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "gtZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/airalarm/directional/south, @@ -21008,6 +21154,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"guI" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/dorms, +/turf/open/floor/iron, +/area/station/commons/dorms) "guL" = ( /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) @@ -21114,13 +21267,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"gxw" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "gxO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -21478,6 +21624,14 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter) +"gDQ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Hallway - Central Tram Platform North-East" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "gDU" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -21726,6 +21880,7 @@ dir = 1 }, /obj/item/airlock_painter/decal, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "gIG" = ( @@ -21748,35 +21903,18 @@ /obj/machinery/light/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"gIU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external{ - autoclose = 0; - frequency = 1449; - id_tag = "middleleft_lower_eva_internal"; - name = "External Access" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_lower_eva_internal"; - idSelf = "middleleft_lower_eva_airlock_control"; - name = "External Access Button"; - pixel_y = 24 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) -"gIV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "gJs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) +"gJt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "gJw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/falsewall, @@ -22344,6 +22482,18 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"gTY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door_buttons/airlock_controller{ + idExterior = "middleleft_lower_lower_eva_external"; + idInterior = "middleleft_lower_lower_eva_internal"; + idSelf = "middleleft_lower_lower_eva_airlock_control"; + name = "External Access Console"; + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "gUn" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 9 @@ -22486,23 +22636,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"gXj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external{ - autoclose = 0; - frequency = 1449; - id_tag = "middleright_lower_eva_internal"; - name = "External Access" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "middleright_lower_eva_internal"; - idSelf = "middleright_lower_eva_airlock_control"; - name = "External Access Button"; - pixel_y = 24 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "gXo" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/misc/grass/jungle, @@ -22718,18 +22851,6 @@ }, /turf/open/floor/engine, /area/station/science/explab) -"hdk" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/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/tram/left) "hdn" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -23423,8 +23544,9 @@ /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 10 }, -/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ - dir = 8 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8; + name = "Exfiltrate Port" }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) @@ -23792,15 +23914,6 @@ }, /turf/open/floor/glass, /area/station/command/meeting_room) -"hyH" = ( -/obj/structure/sign/warning/electric_shock, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/plating, -/area/station/maintenance/tram/right) "hyK" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/door/window/right/directional/east{ @@ -24266,6 +24379,10 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/dark, /area/station/service/janitor) +"hIt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "hIE" = ( /obj/structure/closet/secure_closet/engineering_electrical, /obj/effect/decal/cleanable/dirt, @@ -24534,7 +24651,7 @@ /area/station/service/library) "hNE" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /turf/open/floor/plating, /area/station/engineering/atmos) "hNI" = ( @@ -24593,16 +24710,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"hOy" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 5 - }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "hOE" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -24794,6 +24901,13 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) +"hSm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/dim/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "hSs" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -25146,6 +25260,17 @@ "hZr" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"hZv" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "hZA" = ( /obj/effect/decal/cleanable/dirt, /mob/living/basic/mouse, @@ -25446,6 +25571,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "ifn" = ( @@ -25705,6 +25831,13 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"ikI" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "ikL" = ( /obj/structure/table/wood, /obj/item/storage/fancy/candle_box, @@ -25786,6 +25919,17 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"imm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/port/central) "imn" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/power/apc/auto_name/directional/south, @@ -25960,16 +26104,6 @@ }, /turf/open/floor/iron, /area/station/science/explab) -"iqe" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "iqg" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/freezer, @@ -26357,6 +26491,13 @@ /obj/structure/closet/crate/mod, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"ixy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "ixC" = ( /obj/machinery/computer/upload/ai{ dir = 8 @@ -26656,13 +26797,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/commons/lounge) -"iEu" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "iEz" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ @@ -26954,17 +27088,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"iKp" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "AI Upload Access" - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, -/obj/effect/landmark/navigate_destination/aiupload, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) "iKr" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -27026,6 +27149,13 @@ /obj/effect/turf_decal/stripes/asteroid/box, /turf/open/floor/plating/airless, /area/space/nearstation) +"iLY" = ( +/obj/structure/closet/secure_closet/miner, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "iMd" = ( /obj/structure/table, /obj/item/folder/white{ @@ -27132,7 +27262,6 @@ /turf/open/floor/iron, /area/station/commons/dorms) "iNR" = ( -/obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 }, @@ -27140,8 +27269,8 @@ dir = 8 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/clock/directional/west, /turf/open/floor/iron, /area/station/service/janitor) "iNV" = ( @@ -27354,10 +27483,6 @@ /obj/structure/reagent_dispensers/foamtank, /turf/open/floor/plating, /area/station/engineering/engine_smes) -"iRg" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall/r_wall, -/area/station/hallway/secondary/exit) "iRn" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -27864,6 +27989,18 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"iZK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/disposalpipe/trunk/multiz/down{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "iZL" = ( /obj/structure/chair/stool/bar/directional/east, /obj/structure/cable, @@ -28004,10 +28141,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"jce" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "jcm" = ( /obj/structure/disposaloutlet{ dir = 8 @@ -28105,29 +28238,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"jdG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external{ - autoclose = 0; - frequency = 1449; - id_tag = "middleleft_upper_eva_internal"; - name = "External Access" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "middleleft_upper_eva_internal"; - idSelf = "middleleft_upper_eva_airlock_control"; - name = "External Access Button"; - pixel_y = -24 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "jdN" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -28517,6 +28627,26 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"jkn" = ( +/obj/machinery/door/airlock{ + name = "Custodial Closet" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "jkt" = ( /turf/open/floor/carpet, /area/station/service/chapel) @@ -28834,6 +28964,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"jpR" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "jpV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -28922,6 +29060,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"jrz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "jrI" = ( /obj/structure/disposalpipe/trunk/multiz{ dir = 4 @@ -28941,6 +29087,14 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) +"jsx" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "jsy" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 9 @@ -29136,6 +29290,13 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"jvA" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "jvE" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -29211,6 +29372,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"jwy" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "jwz" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -29685,18 +29855,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"jEz" = ( -/obj/effect/turf_decal/bot, -/obj/item/mop, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 5 - }, -/obj/structure/mop_bucket/janitorialcart, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/service/janitor) "jEF" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -29872,34 +30030,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) -"jHj" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "jHr" = ( /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"jHD" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Command Wing Hallway" - }, -/obj/structure/disposalpipe/segment, -/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/secondary/command) "jHE" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -30468,13 +30601,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"jUp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "jUz" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -30626,7 +30752,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/structure/cable, /turf/open/floor/iron, @@ -30647,21 +30773,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/service/library) -"jXA" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Primary Tool Storage" - }, -/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/landmark/navigate_destination/tools, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jXE" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/closed/wall/r_wall, @@ -31048,11 +31159,6 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/monastery) -"kbZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/navigate_destination/disposals, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal) "kcm" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -31186,6 +31292,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"kdd" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "kdr" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -31202,6 +31318,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"kdz" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "kdI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -31263,6 +31389,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"keN" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "keQ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -31319,13 +31449,6 @@ "kfO" = ( /turf/open/floor/plating, /area/station/cargo/drone_bay) -"kfR" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination/dorms, -/turf/open/floor/iron, -/area/station/commons/dorms) "kgd" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -31425,6 +31548,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"kip" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "kis" = ( /obj/machinery/computer/atmos_alert{ dir = 8 @@ -31436,6 +31570,11 @@ /obj/structure/sign/clock/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) +"kix" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "kiC" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/south, @@ -31698,6 +31837,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"kmb" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Tram Mechanical Room" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/unres, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "kmf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -31739,13 +31888,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/brig) -"kmH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "kmM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -31840,7 +31982,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "kpq" = ( -/obj/machinery/atmospherics/pipe/color_adapter, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, /turf/closed/wall/r_wall, /area/station/engineering/atmos) "kpt" = ( @@ -31881,15 +32023,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"kqa" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/janitor) "kqf" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -31964,6 +32097,27 @@ }, /turf/open/floor/iron, /area/station/security/prison/workout) +"krh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + autoclose = 0; + frequency = 1449; + id_tag = "middleright_upper_eva_internal"; + name = "External Access" + }, +/obj/machinery/door_buttons/access_button{ + idDoor = "middleright_upper_eva_internal"; + idSelf = "middleright_upper_eva_airlock_control"; + name = "External Access Button"; + pixel_y = -24 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "krk" = ( /obj/structure/floodlight_frame, /obj/machinery/light/directional/north, @@ -32011,6 +32165,27 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/brig) +"krM" = ( +/obj/machinery/camera{ + c_tag = "Hallway - Central Tram Platform South-East"; + dir = 6 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) +"krV" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "ksa" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -32131,6 +32306,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"ktW" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "ktX" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -32305,6 +32486,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) +"kxV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "kye" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -32382,6 +32570,16 @@ "kzx" = ( /turf/open/floor/iron, /area/station/commons/storage/primary) +"kzC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/obj/effect/turf_decal/trimline/purple/corner, +/turf/open/floor/iron, +/area/station/service/janitor) "kzQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, @@ -33237,6 +33435,13 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"kNG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "kNM" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/dark_green/fourcorners, @@ -33488,6 +33693,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"kSI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/center) "kSL" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -33512,6 +33722,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"kTn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "kTr" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -34193,6 +34413,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"leX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, +/obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, +/obj/effect/mapping_helpers/mail_sorting/medbay/general, +/obj/effect/mapping_helpers/mail_sorting/medbay/virology, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "lfq" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 4 @@ -34374,22 +34607,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"ljo" = ( -/obj/structure/table, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/grenade/chem_grenade/cleaner, -/obj/item/reagent_containers/spray/cleaner, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/warning, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/key/janitor, -/turf/open/floor/iron, -/area/station/service/janitor) "ljw" = ( /obj/structure/chair{ dir = 4 @@ -34420,12 +34637,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) -"ljU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "ljZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ dir = 1 @@ -34697,6 +34908,10 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) +"loc" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall, +/area/station/hallway/primary/tram/left) "lof" = ( /obj/item/toy/balloon, /turf/open/floor/eighties/red, @@ -34706,6 +34921,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness) +"loj" = ( +/obj/structure/ladder, +/obj/machinery/light/small/dim/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "lox" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -34832,13 +35053,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/science) -"lqp" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "lqu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -35035,6 +35249,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"ltd" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "ltl" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -35914,6 +36132,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) +"lIR" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Hallway - Upper East Power Hatch" + }, +/turf/open/openspace, +/area/station/hallway/secondary/exit) "lIS" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -36047,16 +36271,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/cargo/storage) -"lLA" = ( -/obj/machinery/door/airlock/engineering{ - name = "Tram Mechanical Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/right) "lLB" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/ethanol{ @@ -36260,6 +36474,12 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"lOx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "lOC" = ( /obj/machinery/door/window/brigdoor/right/directional/east{ id = "scicell"; @@ -37212,6 +37432,13 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"meg" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "men" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -37293,7 +37520,6 @@ /obj/structure/sign/painting/library_private{ pixel_y = -32 }, -/obj/structure/displaycase/curator, /turf/open/floor/engine/cult, /area/station/service/library) "mfN" = ( @@ -37363,6 +37589,17 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) +"mgj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "mgq" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/side{ @@ -37533,29 +37770,6 @@ "mjM" = ( /turf/closed/wall, /area/station/security/medical) -"mjQ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/warning, -/obj/machinery/light/directional/south, -/obj/effect/landmark/navigate_destination/janitor, -/turf/open/floor/iron, -/area/station/service/janitor) "mki" = ( /obj/machinery/door/airlock/command{ name = "Head of Personnel" @@ -37730,14 +37944,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningdock) -"mod" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "mon" = ( /mob/living/basic/sloth/paperwork, /turf/open/floor/glass, @@ -37894,17 +38100,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"mqS" = ( -/obj/machinery/door/airlock/engineering{ - name = "Tram Mechanical Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ +"mqT" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "mrb" = ( /obj/structure/table/wood, /obj/item/folder/yellow, @@ -37967,6 +38169,16 @@ }, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"mrT" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 5 + }, +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "msg" = ( /obj/structure/closet/secure_closet/brig/genpop, /obj/effect/turf_decal/bot, @@ -38164,14 +38376,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"mwN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/dim/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "mxf" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -38508,15 +38712,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom/holding) -"mDP" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "mDS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -38698,6 +38893,15 @@ "mHc" = ( /turf/open/floor/iron/checker, /area/station/commons/lounge) +"mHj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "mHm" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/structure/table/reinforced, @@ -38709,6 +38913,17 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"mHt" = ( +/obj/machinery/door/airlock/engineering{ + name = "Tram Mechanical Room" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/mid) "mHw" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -38801,6 +39016,15 @@ dir = 8 }, /area/station/command/bridge) +"mIF" = ( +/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/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "mIN" = ( /obj/structure/table, /obj/item/radio/intercom/prison, @@ -38808,6 +39032,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) +"mIQ" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit) "mIU" = ( /obj/effect/turf_decal/bot_white/right, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -39059,16 +39294,6 @@ /obj/machinery/photocopier, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) -"mNZ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Hallway - Service Wing Left Stairway" - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "mOi" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -39272,27 +39497,17 @@ /obj/structure/sign/clock/directional/east, /turf/open/floor/carpet, /area/station/medical/psychology) +"mTg" = ( +/obj/effect/decal/cleanable/rubble, +/obj/structure/closet/crate, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "mTh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/chapel{ dir = 6 }, /area/station/service/chapel) -"mTw" = ( -/obj/machinery/door/airlock/engineering{ - name = "Tram Mechanical Room" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/decal/cleanable/dirt, -/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/unres{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/port/central) "mTR" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -39449,6 +39664,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) +"mXI" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "mXU" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -39523,18 +39744,6 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"mZg" = ( -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleright_lower_upper_eva_external"; - idInterior = "middleright_lower_upper_eva_internal"; - idSelf = "middleright_lower_upper_eva_airlock_control"; - name = "External Access Console"; - pixel_y = -24 - }, -/obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) "mZt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -39794,6 +40003,23 @@ }, /turf/open/floor/catwalk_floor, /area/station/command/gateway) +"neh" = ( +/obj/structure/closet/l3closet/janitor, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 10 + }, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23; + pixel_y = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 10 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/service/janitor) "nel" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -39910,10 +40136,6 @@ "ngp" = ( /turf/closed/wall, /area/station/tcommsat/computer) -"ngr" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/hallway/secondary/exit) "ngv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -40238,17 +40460,12 @@ /obj/machinery/camera/directional/east{ c_tag = "Hallway - Engineering Entry East" }, -/obj/machinery/atmospherics/components/unary/portables_connector/layer4{ - dir = 4 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4; + name = "Oxygen Tank Injection Port" }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"nkw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "nky" = ( /obj/machinery/conveyor{ dir = 8; @@ -40823,6 +41040,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"nvp" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "nvA" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -40939,6 +41164,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"nxN" = ( +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "nxT" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, @@ -41067,10 +41296,32 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) +"nzx" = ( +/obj/machinery/door/airlock/engineering{ + name = "Power Access Hatch" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit) "nzz" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) +"nzF" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/conveyor_switch/oneway{ + id = "mining"; + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "nzH" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -41158,6 +41409,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/lobby) +"nAT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + autoclose = 0; + frequency = 1449; + id_tag = "middleleft_lower_eva_internal"; + name = "External Access" + }, +/obj/machinery/door_buttons/access_button{ + idDoor = "middleleft_lower_eva_internal"; + idSelf = "middleleft_lower_eva_airlock_control"; + name = "External Access Button"; + pixel_y = 24 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "nBj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -41222,14 +41490,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"nCJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "nDj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -41457,6 +41717,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"nHA" = ( +/obj/structure/transport/linear/public, +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 4 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "nHM" = ( /obj/effect/turf_decal/caution/stand_clear/white{ dir = 4 @@ -41845,6 +42112,16 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) +"nOo" = ( +/obj/machinery/door/airlock/engineering{ + name = "Tram Mechanical Room" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/tram/right) "nOq" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron, @@ -42332,6 +42609,12 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"nXb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "nXh" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -42696,10 +42979,6 @@ /obj/machinery/reagentgrinder, /turf/open/floor/wood, /area/station/service/bar/backroom) -"ocw" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "ocK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/sign/warning/secure_area{ @@ -43201,6 +43480,15 @@ /obj/effect/turf_decal/trimline/dark_blue/corner, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"omN" = ( +/obj/machinery/door/poddoor/preopen{ + id = "atmos"; + name = "Atmospherics Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos) "onc" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -43559,15 +43847,10 @@ /turf/open/floor/engine/cult, /area/station/service/library) "ovi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"ovk" = ( -/obj/structure/ladder, -/obj/machinery/light/small/dim/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/tram/mid) "ovC" = ( /obj/structure/railing/corner{ dir = 4 @@ -43802,6 +44085,17 @@ "oAV" = ( /turf/closed/wall, /area/station/cargo/office) +"oAY" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Starboard Tram Platform North-West" + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "oBc" = ( /obj/structure/rack, /obj/effect/turf_decal/stripes/corner, @@ -43895,6 +44189,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"oDs" = ( +/obj/structure/cable, +/obj/item/radio/intercom/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "oDH" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -44058,17 +44360,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"oHK" = ( -/obj/machinery/camera{ - c_tag = "Hallway - Central Tram Platform South-East"; - dir = 6 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "oHO" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -44241,6 +44532,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"oNl" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "oNp" = ( /obj/structure/sink{ pixel_y = 15 @@ -44426,13 +44724,6 @@ /obj/machinery/light/dim/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"oQT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "oQU" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/misc/grass/jungle, @@ -44671,6 +44962,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"oVg" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/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/cargo/miningdock) "oVM" = ( /turf/closed/wall/r_wall, /area/station/security/prison/mess) @@ -44769,17 +45069,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"oXK" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "oXP" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -44959,6 +45248,11 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"pbC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/center) "pbH" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -44984,13 +45278,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"pbS" = ( -/obj/structure/transport/linear/public, -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 4 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "pbV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/musician/piano, @@ -45254,21 +45541,6 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter) -"phd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/warning, -/turf/open/floor/iron, -/area/station/service/janitor) "phl" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) @@ -45652,14 +45924,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/medical/pharmacy) -"pod" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "pof" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -45896,8 +46160,9 @@ /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 6 }, -/obj/machinery/atmospherics/components/unary/portables_connector/layer4{ - dir = 4 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4; + name = "Oxygen Tank Injection Port" }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) @@ -46233,17 +46498,6 @@ dir = 1 }, /area/station/service/chapel) -"pxp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/port/central) "pxs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, @@ -46382,6 +46636,14 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"pzb" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "pzc" = ( /obj/machinery/camera{ c_tag = "Security - Interrogation Observation"; @@ -46436,6 +46698,18 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"pAA" = ( +/obj/machinery/door/airlock/vault{ + name = "High Security Vault" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/supply/vault, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/vault, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "pAC" = ( /obj/effect/turf_decal/siding/thinplating/end, /obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ @@ -46898,6 +47172,17 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"pIF" = ( +/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/brown/opposingcorners, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "pIQ" = ( /obj/structure/cable, /turf/closed/wall/r_wall, @@ -47044,6 +47329,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel) +"pLg" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrigright"; + name = "Brig" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig_right" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/sec, +/turf/open/floor/iron, +/area/station/security/brig) "pLs" = ( /obj/structure/transport/linear/tram, /obj/structure/tram/split, @@ -47274,8 +47581,9 @@ dir = 10 }, /obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ - dir = 8 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8; + name = "Exfiltrate Port" }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) @@ -47887,23 +48195,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"qbx" = ( -/obj/machinery/requests_console/directional/south{ - department = "Janitorial"; - name = "Janitorial Requests Console" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 6 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/janitor) "qbT" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/filingcabinet, @@ -48459,13 +48750,6 @@ dir = 4 }, /area/station/command/bridge) -"qkk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/dim/directional/south, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "qkr" = ( /obj/machinery/camera/directional/west{ c_tag = "Security - Main West"; @@ -48490,6 +48774,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "qkM" = ( @@ -48800,18 +49085,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"qrc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "middleleft_lower_lower_eva_external"; - idInterior = "middleleft_lower_lower_eva_internal"; - idSelf = "middleleft_lower_lower_eva_airlock_control"; - name = "External Access Console"; - pixel_y = -24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "qrg" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -48837,6 +49110,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) +"qrx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) +"qrI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/secondary/exit) "qrW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -48995,26 +49283,6 @@ /obj/machinery/telecomms/server/presets/medical, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"quE" = ( -/obj/machinery/door/airlock{ - name = "Custodial Closet" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/warning, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/janitor, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "quF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49113,6 +49381,12 @@ "qxm" = ( /turf/closed/wall, /area/station/maintenance/starboard/central) +"qxG" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/closed/wall, +/area/station/cargo/miningdock/cafeteria) "qxT" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -49215,6 +49489,14 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"qzh" = ( +/obj/machinery/bouldertech/refinery/smelter, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "qzn" = ( /obj/machinery/vending/wardrobe/curator_wardrobe, /turf/open/floor/engine/cult, @@ -49338,23 +49620,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"qBI" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Tram Mechanical Room" - }, -/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/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "qBL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -49407,12 +49672,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"qCg" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "qCh" = ( /obj/structure/closet/secure_closet/captains, /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -49420,6 +49679,29 @@ /obj/machinery/light/warm/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"qCm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/machinery/light/directional/south, +/obj/effect/landmark/navigate_destination/janitor, +/turf/open/floor/iron, +/area/station/service/janitor) "qCz" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, @@ -49875,9 +50157,9 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "qKE" = ( @@ -49976,6 +50258,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"qMI" = ( +/obj/machinery/light/warm/directional/north, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "qMQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50094,12 +50384,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/service/theater) -"qPp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/closed/wall, -/area/station/maintenance/tram/mid) "qPE" = ( /obj/structure/chair/greyscale{ dir = 4 @@ -50194,6 +50478,14 @@ /obj/structure/railing, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/left) +"qRC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "qRK" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -50246,15 +50538,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/science/xenobiology) -"qTh" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "qTp" = ( /obj/machinery/door/airlock{ id_tag = "private_b"; @@ -50264,6 +50547,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"qTt" = ( +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/janitor) "qTv" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -50561,6 +50860,11 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"qXv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "qXA" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, @@ -50624,10 +50928,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/engineering/atmos) -"qYw" = ( -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/right) "qYx" = ( /obj/machinery/door/airlock{ id_tag = "Toilet5"; @@ -51055,11 +51355,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/commons/dorms) -"reK" = ( -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) +"reC" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "AI Upload Access" + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, +/obj/effect/landmark/navigate_destination/aiupload, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) "reU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/south{ @@ -51216,6 +51522,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /turf/open/floor/iron, /area/station/engineering/atmos) "rin" = ( @@ -51465,16 +51772,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"rmw" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "rmz" = ( /obj/effect/turf_decal/siding/thinplating/dark, /obj/structure/table, @@ -51645,6 +51942,23 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"roH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/external{ + autoclose = 0; + frequency = 1449; + id_tag = "middleright_lower_eva_internal"; + name = "External Access" + }, +/obj/machinery/door_buttons/access_button{ + idDoor = "middleright_lower_eva_internal"; + idSelf = "middleright_lower_eva_airlock_control"; + name = "External Access Button"; + pixel_y = 24 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "roQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -51936,14 +52250,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/asteroid) -"rwc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/secondary/exit) "rws" = ( /obj/structure/table/glass, /obj/item/storage/box/monkeycubes{ @@ -51955,6 +52261,14 @@ /obj/effect/turf_decal/tile/dark_green/fourcorners, /turf/open/floor/iron/white, /area/station/science/genetics) +"rwF" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "rwN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52103,17 +52417,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"rzF" = ( -/obj/machinery/door/airlock/engineering{ - name = "Power Access Hatch" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit) "rzO" = ( /obj/structure/chair, /obj/machinery/airalarm/directional/north, @@ -52286,7 +52589,7 @@ dir = 1 }, /obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden, /obj/machinery/camera/emp_proof/directional/north{ c_tag = "Engineering - Atmospherics North" }, @@ -52384,13 +52687,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"rFw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "rGj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, @@ -52485,6 +52781,15 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/security/prison) +"rIm" = ( +/obj/machinery/lift_indicator/directional/north{ + linked_elevator_id = "tram_upper_center_lift" + }, +/obj/machinery/button/elevator/directional/north{ + id = "tram_upper_center_lift" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "rIp" = ( /obj/effect/landmark/start/depsec/supply, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -52788,14 +53093,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/engineering/supermatter) -"rNN" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Hallway - Central Tram Platform North-East" - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "rNO" = ( /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/engine/hull, @@ -53208,6 +53505,12 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"rTn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "rTt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -53326,6 +53629,10 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"rWn" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rWt" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -53532,11 +53839,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"sac" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "saj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -53574,6 +53876,15 @@ /obj/item/wirecutters, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"saI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "saJ" = ( /obj/structure/plasticflaps/opaque, /turf/open/floor/plating, @@ -53627,12 +53938,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/central) -"sce" = ( -/obj/effect/landmark/start/shaft_miner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "scn" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -53773,6 +54078,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"sfn" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "sfv" = ( /obj/machinery/duct, /obj/structure/railing/corner{ @@ -53883,18 +54192,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"shP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/disposalpipe/trunk/multiz/down{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "shQ" = ( /obj/machinery/modular_computer/preset/engineering{ dir = 8 @@ -53950,6 +54247,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"siF" = ( +/obj/machinery/bouldertech/refinery, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "siL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -54013,17 +54318,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"sjq" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Starboard Tram Platform North-West" - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "sjE" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -54165,6 +54459,23 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/prison/garden) +"slr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing, +/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/hallway/secondary/exit) +"slw" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 1 + }, +/obj/structure/transport/linear/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "slx" = ( /obj/structure/hoop{ dir = 4 @@ -54306,20 +54617,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) -"snF" = ( -/obj/machinery/camera{ - c_tag = "Hallway - Starboard Tram Platform South-West"; - dir = 10 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "snK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -54345,16 +54642,6 @@ "soq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science) -"soP" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "spm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/heavy, @@ -54391,6 +54678,13 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) +"spE" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/transport/power_rectifier, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "spF" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) @@ -54400,11 +54694,6 @@ /obj/effect/spawner/random/armory/rubbershot, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"sqg" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/right) "sql" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -54887,6 +55176,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) +"swd" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/center) "swg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -54906,28 +55201,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/tram/right) -"swL" = ( -/obj/structure/railing{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/transport/linear/public, -/obj/machinery/elevator_control_panel/directional/north{ - linked_elevator_id = "tram_upper_center_lift"; - preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) -"swR" = ( -/obj/structure/cable/multilayer/multiz, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/central) "swX" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark/smooth_edge{ @@ -55016,6 +55289,23 @@ /obj/item/flashlight/lamp, /turf/open/floor/carpet, /area/station/cargo/miningdock) +"syX" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Tram Mechanical Room" + }, +/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/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "szb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -55048,6 +55338,12 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"szr" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "szs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -55058,6 +55354,18 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"szw" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/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/tram/left) "szM" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -55097,13 +55405,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"sBc" = ( -/obj/structure/chair/sofa/bench/tram/right{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "sBt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55135,16 +55436,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"sCR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/effect/turf_decal/trimline/purple/corner, -/turf/open/floor/iron, -/area/station/service/janitor) "sDe" = ( /obj/structure/table/wood, /obj/item/radio/intercom/directional/south, @@ -55186,6 +55477,13 @@ dir = 4 }, /area/station/maintenance/central/greater) +"sDG" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/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/cargo/miningdock) "sDO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -55225,16 +55523,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"sEp" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "sEx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -55354,7 +55642,7 @@ "sGO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/structure/cable, /turf/open/floor/iron, @@ -55455,6 +55743,17 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) +"sIk" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "sIq" = ( /obj/structure/table/glass, /obj/item/wrench/medical, @@ -55594,16 +55893,6 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/station/solars/starboard/fore) -"sLl" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 1 - }, -/obj/structure/transport/linear/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "sLz" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -55617,13 +55906,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"sLC" = ( -/obj/machinery/newscaster/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "sLR" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -56118,6 +56400,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) +"sUc" = ( +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/right) "sUf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -56331,14 +56617,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"sXZ" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Utilities Access Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "sYd" = ( /obj/structure/cable, /obj/effect/turf_decal/sand/plating, @@ -56507,13 +56785,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/engineering/engine_smes) -"tbg" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "tbi" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56809,6 +57080,18 @@ /obj/machinery/light/small/dim/directional/west, /turf/open/floor/iron/freezer, /area/station/security/prison) +"tgE" = ( +/obj/machinery/camera{ + c_tag = "Medical - Central North-West"; + dir = 10; + network = list("ss13","medbay") + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "tgN" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -56982,10 +57265,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tkc" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "tki" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/door/poddoor/shutters/preopen{ @@ -57026,12 +57305,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) -"tkB" = ( -/obj/structure/disposalpipe/junction/flip, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningdock) "tkH" = ( /obj/machinery/firealarm/directional/west{ pixel_y = 3 @@ -57204,6 +57477,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/office) +"toh" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Hallway - Service Wing Left Stairway" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "toq" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -57459,18 +57742,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"tse" = ( -/obj/machinery/camera{ - c_tag = "Medical - Central North-West"; - dir = 10; - network = list("ss13","medbay") - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "tsg" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -57560,13 +57831,16 @@ /obj/structure/sign/poster/official/obey/directional/south, /turf/open/floor/iron/white, /area/station/security/execution/education) -"ttM" = ( -/obj/structure/chair/sofa/bench/tram/left{ - dir = 1 +"ttA" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 }, -/obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, -/area/station/hallway/primary/tram/center) +/area/station/cargo/miningdock) "tuf" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table, @@ -57609,14 +57883,6 @@ /obj/machinery/light/dim/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"tvu" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Hallway - Central Tram Platform North-West" - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "tvP" = ( /obj/structure/rack, /obj/item/storage/box/lights/tubes{ @@ -57957,13 +58223,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tAL" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "tBa" = ( /obj/structure/table, /obj/item/raw_anomaly_core/random{ @@ -58101,10 +58360,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"tDI" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/station/hallway/primary/tram/left) "tDP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -58298,6 +58553,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) +"tGV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "tHb" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -58320,6 +58585,9 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/escapepodbay) +"tHj" = ( +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "tHt" = ( /obj/structure/railing{ dir = 1 @@ -58736,6 +59004,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/ordnance/office) +"tOJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "tPb" = ( /obj/structure/table, /obj/item/storage/dice, @@ -58750,15 +59023,6 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"tPw" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "tPz" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -58842,11 +59106,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"tRi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/dim/directional/north, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/center) "tRn" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -59034,7 +59293,7 @@ /turf/open/floor/iron/white, /area/station/medical/surgery/fore) "tTW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ +/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ dir = 5 }, /turf/open/floor/iron, @@ -59637,11 +59896,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/grass, /area/station/commons/dorms) -"ueV" = ( -/obj/effect/turf_decal/sand, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "ufh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59822,6 +60076,18 @@ "uje" = ( /turf/closed/wall, /area/station/science/robotics/lab) +"ujf" = ( +/obj/machinery/door/airlock/mining, +/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/brown/half/contrasted{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "ujm" = ( /obj/machinery/door/airlock/external{ autoclose = 0; @@ -60216,6 +60482,14 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"unH" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "unS" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -60321,6 +60595,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"uqa" = ( +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "uqc" = ( /obj/structure/sign/clock/directional/east, /turf/open/floor/iron/cafeteria, @@ -60860,7 +61138,6 @@ /obj/item/storage/box, /obj/item/storage/box, /obj/machinery/firealarm/directional/south, -/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/engineering/atmos) "uyJ" = ( @@ -60889,13 +61166,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"uyX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/dim/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "uyZ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -61383,12 +61653,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/prison/garden) -"uFK" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Hallway - Upper East Power Hatch" - }, -/turf/open/openspace, -/area/station/hallway/secondary/exit) "uFX" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -61780,13 +62044,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/commons/dorms) -"uLp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "uLt" = ( /obj/structure/table/glass, /obj/item/reagent_containers/cup/beaker{ @@ -61880,13 +62137,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"uMD" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "uME" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -62238,6 +62488,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"uUe" = ( +/obj/structure/table, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/grenade/chem_grenade/cleaner, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/key/janitor, +/turf/open/floor/iron, +/area/station/service/janitor) "uUs" = ( /obj/machinery/vending/wardrobe/sec_wardrobe, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -62306,6 +62572,16 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"uVc" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "uVo" = ( /turf/open/floor/carpet, /area/station/command/meeting_room) @@ -62492,6 +62768,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"uYI" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/closed/wall, +/area/station/maintenance/tram/mid) "uYX" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -62589,22 +62871,6 @@ "vay" = ( /turf/open/floor/plating, /area/station/commons/dorms) -"vaF" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/command{ - name = "MiniSat Access" - }, -/obj/effect/mapping_helpers/airlock/access/any/command/minisat, -/obj/effect/landmark/navigate_destination/minisat_access_ai, -/turf/open/floor/iron/dark, -/area/station/science/lower) "vaK" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -62994,6 +63260,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) +"vhF" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "vhG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -63039,6 +63310,13 @@ }, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"viU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "viW" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/crayon{ @@ -63305,17 +63583,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"vms" = ( -/obj/structure/cable/multilayer/multiz, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit) "vmB" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -63464,6 +63731,20 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"vpt" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/transport/linear/public, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "tram_upper_center_lift"; + preset_destination_names = list("2" = "Lower Deck", "3" = "Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "vpG" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -63524,6 +63805,18 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/catwalk_floor, /area/station/science/xenobiology) +"vqx" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door_buttons/airlock_controller{ + idExterior = "middleleft_upper_lower_eva_external"; + idInterior = "middleleft_upper_lower_eva_internal"; + idSelf = "middleleft_upper_lower_eva_airlock_control"; + name = "External Access Console"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "vqH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -63795,6 +64088,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"vvd" = ( +/obj/machinery/camera{ + c_tag = "Hallway - Starboard Tram Platform South-West"; + dir = 10 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "vvk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -63867,14 +64174,6 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) -"vwx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/tram/mid) "vwz" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -64162,14 +64461,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) -"vBy" = ( -/obj/structure/cable/multilayer/multiz, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/hallway/primary/tram/left) "vBB" = ( /obj/machinery/power/terminal{ dir = 1 @@ -64274,6 +64565,13 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) +"vDd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "vDg" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/effect/landmark/event_spawn, @@ -64326,13 +64624,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) -"vEf" = ( -/obj/effect/decal/cleanable/dirt, -/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/hallway/secondary/exit) "vEl" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/misc/grass/jungle, @@ -64379,6 +64670,15 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"vFe" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/sign/poster/official/midtown_slice/directional/north, +/obj/machinery/conveyor{ + dir = 8; + id = "mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "vFh" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -64439,11 +64739,6 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"vGf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/dim/directional/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/center) "vGi" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -64609,7 +64904,8 @@ /turf/open/floor/iron/checker, /area/station/commons/lounge) "vJA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/break_room) "vJC" = ( @@ -64622,7 +64918,7 @@ "vKd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ dir = 5 }, /obj/structure/disposalpipe/segment, @@ -65200,6 +65496,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/dorms) +"vUk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vUu" = ( /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) @@ -65271,17 +65573,6 @@ "vWx" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningdock/oresilo) -"vWy" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Tram Mechanical Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/right) "vWI" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -65344,6 +65635,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/office) +"vYn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/tram/mid) "vYo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65419,6 +65717,18 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/wood/large, /area/station/service/barber) +"vZT" = ( +/obj/machinery/button/elevator/directional/north{ + id = "tram_upper_center_lift" + }, +/obj/machinery/lift_indicator/directional/north{ + linked_elevator_id = "tram_upper_center_lift" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "vZX" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -65664,13 +65974,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/execution/transfer) -"weo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "wev" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 @@ -65957,6 +66260,10 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/eva) +"wjB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/station/engineering/break_room) "wjP" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -65981,11 +66288,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"wki" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ladder, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/center) "wkk" = ( /turf/open/floor/iron/freezer, /area/station/security/prison) @@ -66137,6 +66439,13 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/monastery) +"wnP" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/right) "woB" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/white/smooth_corner{ @@ -66204,6 +66513,13 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"wpH" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "wpK" = ( /turf/closed/wall, /area/station/science/lobby) @@ -66425,6 +66741,13 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"wus" = ( +/obj/structure/disposalpipe/junction/flip, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningdock) "wuC" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -66508,20 +66831,6 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/commons/fitness) -"wwH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit) "wwI" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66743,6 +67052,10 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) +"wzJ" = ( +/obj/structure/sign/warning/electric_shock, +/turf/closed/wall/r_wall, +/area/station/maintenance/port/central) "wAa" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -66811,6 +67124,13 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/monastery) +"wAB" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "wAG" = ( /obj/effect/turf_decal/bot, /obj/structure/reagent_dispensers/foamtank, @@ -66893,11 +67213,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"wCZ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "wDh" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -66959,15 +67274,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"wEg" = ( -/obj/machinery/lift_indicator/directional/north{ - linked_elevator_id = "tram_upper_center_lift" - }, -/obj/machinery/button/elevator/directional/north{ - id = "tram_upper_center_lift" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "wEl" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -67034,6 +67340,12 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"wFf" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "wFq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67457,6 +67769,22 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"wNv" = ( +/obj/structure/closet, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 7 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "wNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/violet/visible, /turf/open/floor/iron, @@ -67487,6 +67815,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"wOf" = ( +/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/cargo/miningdock) "wOs" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -67559,6 +67893,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"wPR" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "wQm" = ( /turf/open/floor/iron, /area/station/engineering/atmos) @@ -67603,6 +67946,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"wRu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "wRv" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/iron/white, @@ -67780,6 +68130,10 @@ /obj/machinery/door/window/right/directional/north, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"wWv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "wWF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -67958,6 +68312,14 @@ /obj/effect/turf_decal/siding/thinplating/dark, /turf/open/floor/iron/white, /area/station/science/research) +"xae" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Hallway - Central Tram Platform North-West" + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "xat" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68046,6 +68408,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"xbT" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "xcd" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -68088,6 +68459,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"xcU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing, +/turf/open/floor/iron, +/area/station/cargo/miningfoundry) "xdw" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron/dark, @@ -68141,6 +68517,9 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/maintenance/tram/mid) +"xdZ" = ( +/turf/closed/wall, +/area/station/cargo/miningfoundry) "xei" = ( /obj/machinery/atmospherics/components/binary/pump/on, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ @@ -68611,6 +68990,12 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"xnH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/navigate_destination/dockaux, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "xnI" = ( /turf/open/floor/iron, /area/station/maintenance/tram/left) @@ -68639,10 +69024,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"xnY" = ( -/obj/structure/sign/warning/electric_shock, -/turf/closed/wall, -/area/station/hallway/primary/tram/center) "xog" = ( /obj/machinery/door/airlock/security/glass{ name = "Isolation Wing" @@ -69064,6 +69445,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) +"xwO" = ( +/obj/machinery/door/airlock/hatch{ + name = "Emergency Exit" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "xxe" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -69401,6 +69789,13 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) +"xCp" = ( +/obj/structure/chair/sofa/bench/tram/right{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "xCr" = ( /obj/structure/railing{ dir = 8 @@ -69466,6 +69861,10 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xEZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/hallway/secondary/exit) "xFb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -69520,12 +69919,6 @@ "xFx" = ( /turf/open/floor/iron, /area/station/commons/fitness) -"xGn" = ( -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "xGw" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -69536,16 +69929,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, /area/station/security/processing) -"xGM" = ( -/obj/machinery/door/airlock/hatch{ - name = "Emergency Exit" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "xGX" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 @@ -70176,9 +70559,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/treatment_center) -"xTq" = ( +"xTn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) +/area/station/maintenance/tram/mid) "xTr" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner{ dir = 8 @@ -70424,15 +70812,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) -"xYm" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Utilities Access Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "xYp" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -70533,6 +70912,22 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/commons/dorms) +"yaj" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/command{ + name = "MiniSat Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/landmark/navigate_destination/minisat_access_ai, +/turf/open/floor/iron/dark, +/area/station/science/lower) "yar" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -86516,9 +86911,9 @@ qQq qQq qQq lQM -swR -pxp -abE +jpR +imm +wzJ dIy pZW tUM @@ -86775,7 +87170,7 @@ qQq lQM tFW pal -mTw +cYe qCf pZW uof @@ -89578,7 +89973,7 @@ afn lKe gOh rbD -fgs +pAA qaM sfM kwe @@ -89619,7 +90014,7 @@ elr elr elr xPP -kfR +guI xFx vAF swX @@ -99349,9 +99744,9 @@ abM abM gjb eco -fKL +eZE iNR -brE +neh ekB qjU qjU @@ -99610,7 +100005,7 @@ sHm foY cYX ekB -swL +vpt pWP gAJ qjU @@ -99642,7 +100037,7 @@ pkp anr anH nkF -ffF +cPg uQm uYH nPN @@ -99865,9 +100260,9 @@ ekB bYF ulM isa -ljo +uUe ekB -sLl +slw tID gPT qjU @@ -100119,17 +100514,17 @@ aaa aaa aaa ekB -gmp -aRT -sCR -qbx +aAz +fCP +kzC +bLS ekB -hOy -pbS -mod +mrT +nHA +rwF qjU -dRS -ueV +vYn +ejo qjU abM abM @@ -100137,8 +100532,8 @@ ada abM abM qjU -ueV -fpx +ejo +djS jnq abM jnq @@ -100376,16 +100771,16 @@ aaa aaa aaa ekB -jEz -kqa -phd +dLD +eki +adt qjU qjU qjU qtV ceb qjU -gfO +vqx ecX qjU acQ @@ -100395,7 +100790,7 @@ acQ acQ qjU nNs -qrc +gTY jnq abM jnq @@ -100635,15 +101030,15 @@ aaa ekB gEx uTz -mjQ +qCm qjU -ovk -mqS +loj +mHt sKN -jce -rmw -nkw -qkk +cYh +csH +eVy +vDd qjU ujK ujK @@ -100651,8 +101046,8 @@ rQk ujK ujK qjU -uyX -nCJ +viU +qRC jnq abM jnq @@ -100892,12 +101287,12 @@ aaa ekB bxX hIg -bvL +qTt qjU qjU -qPp -bJY -wCZ +uYI +vZT +qXv qjU qjU nag @@ -101149,10 +101544,10 @@ dJJ dJJ dJJ dJJ -quE +jkn dJJ -tbg -iEu +axr +gJt jra ahy mxR @@ -101412,7 +101807,7 @@ qjT kJY ovL ahy -fEr +vhF qjU gmj pnF @@ -101666,7 +102061,7 @@ kCQ vZZ kCQ lOe -mNZ +toh xpb jeS bMZ @@ -104260,9 +104655,9 @@ fal pcu llU tpm +wjB vJA -vJA -ulV +wjB gYI cEq gYI @@ -104519,7 +104914,7 @@ cgd vIC pOZ hoT -hZr +wWv amA pvC qsP @@ -104776,7 +105171,7 @@ akM wRi oFd ntL -hZr +wWv gIu ifk qkG @@ -105035,14 +105430,14 @@ nku pso hZr amC -lJm +cmM any anO -aog +omN kpq rDj tTW -bZW +vUk wQm skM bZW @@ -105243,7 +105638,7 @@ acF vWI sNs vWI -jXA +aWJ vWI sNs alg @@ -105290,7 +105685,7 @@ oNq kcP hNE ovi -hZr +hIt fvn lJm rfW @@ -105541,7 +105936,7 @@ aaa hZr gZE hJN -wQm +rWn xml vTF akP @@ -105782,8 +106177,8 @@ mGw dau wxa mGw -cEV -qkk +lOx +vDd qjU hUz hUz @@ -105791,8 +106186,8 @@ ghW hUz hUz qjU -kmH -vwx +hSm +xTn qjU aaa hZr @@ -106039,8 +106434,8 @@ mGw eep eep mGw -sac -mZg +cpR +aGi qjU acP acP @@ -106049,7 +106444,7 @@ acP acP qjU ecX -cOu +bXs qjU aaa hZr @@ -106296,8 +106691,8 @@ bIm eep eep mGw -rFw -tkc +ixy +cbc qjU abM abM @@ -106305,8 +106700,8 @@ ade abM abM qjU -tkc -rFw +cbc +ixy qjU aaa hZr @@ -116547,11 +116942,11 @@ aac aac aaa aaa -aaa -aaa -aaa -aaa -aaa +xdZ +xdZ +xdZ +xdZ +xdZ unl hKV rMq @@ -116804,11 +117199,11 @@ aac aac aaa aaa -aaa -aaa -aaa -aaa -aaa +xdZ +mTg +meg +nxN +pzb unl ikc bvk @@ -116816,7 +117211,7 @@ aeu pzd njK eyR -sce +cUB afu uGW fvM @@ -117060,12 +117455,12 @@ aac aac aac aac -aac -aaa -aaa -aaa -aaa aaa +xdZ +qzh +mqT +cqj +mgj unl oNp rMq @@ -117073,7 +117468,7 @@ qBT oCe lDw lJt -oTd +cbA cJX uGW fvM @@ -117316,13 +117711,13 @@ aac aac aac aac -aac -aac -aaa -aaa -aaa aaa aaa +xdZ +vFe +cZQ +ajn +szr unl rbM gJs @@ -117330,7 +117725,7 @@ uRR rMq unl npb -oTd +cbA cJX uGW uGW @@ -117574,20 +117969,20 @@ aac aac aac aac -aac aaa -aaa -aaa -aaa -aaa -unl +xdZ +qMI +cZQ +xcU +sfn +njK xiZ nTG nTG taK unl nLK -tkB +wus vLL chf sOI @@ -117830,21 +118225,21 @@ aac aac aac aac -aac -aac aaa aaa -aaa -aaa -aaa -unl +xdZ +siF +cZQ +xcU +goY +njK flZ ktb mNp qal unl -gxw -gIV +ext +cuf cJX pCL dwA @@ -118087,21 +118482,21 @@ aac aac aac aac -aac -aac -aaa -aaa -aaa aaa aaa +xdZ +jsx +mqT +xcU +eAV +qxG unl unl unl unl unl -unl -eyR -bAa +cBD +kip cJX uGW uGW @@ -118345,20 +118740,20 @@ aac aac aac aac -aac aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -uGW -bwM +xdZ +ddY +kxV +nXb +wAB +nzF +wNv +xdZ +dci pni -bMX -ljU +kaF +ikI +cWA lGz bBs afR @@ -118603,19 +118998,19 @@ aac aac aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -uGW -bwM -eyR -kDi -afi +xdZ +fdc +cZQ +jwy +bvA +pIF +mIF +ujf +sDG +oVg +wOf +wOf +uVc kDi cJX wMu @@ -118860,26 +119255,26 @@ aac aac aac aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +xdZ +xdZ +xdZ +xdZ +xdZ +xdZ +xdZ uGW bwM -dwA +eJI +iLY dAl -afj +ttA cZY jhN kDF vso nbo wqs -kbZ +fFO lHU qGM emT @@ -119124,7 +119519,7 @@ aaa aaa aaa aaa -aaa +uGW uGW uGW uGW @@ -119147,7 +119542,7 @@ abM abM qxm qxm -lLA +nOo myD myD myD @@ -119407,7 +119802,7 @@ hKj hKj myD sVs -hyH +aMt stO aiB hKj @@ -120224,7 +120619,7 @@ pKC cPE qah erv -vaF +yaj egK aGY pRm @@ -120734,7 +121129,7 @@ mBW hJl nrf hJl -iKp +reC xnS hJl dNT @@ -144609,7 +145004,7 @@ pMW avE nmY hng -dJq +xnH nmY nmY nmY @@ -152052,8 +152447,8 @@ cOE mHX jtg jvf -vBy -shP +fnL +iZK yiM pBj nXn @@ -152823,8 +153218,8 @@ jvf fKO tki jvf -tDI -qBI +loc +syX yiM mjx heY @@ -153080,7 +153475,7 @@ wHH uUc wid kqY -hdk +szw cEg yiM nMW @@ -153842,7 +154237,7 @@ aQO aQO aQO aQO -qhM +kTn nYq yiM cFs @@ -157162,7 +157557,7 @@ aBN sDO jFh msW -apW +pLg nSV aPk sGG @@ -157182,7 +157577,7 @@ nsn nsn hPM fmJ -jHD +fUT fRW xBV xlT @@ -157441,7 +157836,7 @@ tlg kOE yiM yiM -soP +kdd yiM cFs nVr @@ -157449,7 +157844,7 @@ laU jGG cFs yiM -uMD +xwO yiM yiM fpg @@ -165408,7 +165803,7 @@ eSz eSz izU vYA -vGf +kSI izU eSz nSP @@ -165416,7 +165811,7 @@ fXy lwN eSz izU -tRi +ccU ghg jyH jyH @@ -165664,7 +166059,7 @@ eSz eSz eSz izU -jdG +dEH izU izU eSz @@ -165674,7 +166069,7 @@ lwN eSz izU izU -gIU +nAT jyH lCA jRS @@ -165931,7 +166326,7 @@ lwN eSz izU seG -xTq +tHj jyH pvp kSh @@ -166173,22 +166568,22 @@ nTz rQl qez izU -azC +swd izU -wEg -ttM +rIm +crQ izU -bTc -qCg -xYm +leX +rTn +gmm lEj rWQ iCj fkZ lEj -xYm -uLp -bII +gmm +wRu +mHj jyH aQi jbg @@ -166431,11 +166826,11 @@ aBQ rWd izU ghg -xnY +cTc rOu -sBc +xCp izU -fPk +sIk izU izU eSz @@ -166445,7 +166840,7 @@ lwN eSz izU izU -xGM +dMw jyH wmy iYv @@ -166687,22 +167082,22 @@ bra mfN diN izU -ejh -fDF -oQT -jUp -pod -sEp -jHj -tvu +mXI +kmb +kNG +wpH +unH +krV +oDs +xae kNT brr mNB fbk kNT -tse -boi -mDP +tgE +uqa +fYl jyH pob xbN @@ -166946,7 +167341,7 @@ bhs izU izU izU -weo +bAP rOu rOu rOu @@ -167203,9 +167598,9 @@ lWy jGD izU izU -fWa -aUx -cgF +jvA +nvp +oNl aEl wQW cFS @@ -167462,8 +167857,8 @@ izU izU izU izU -hce -tAL +izU +spE sOD izU kkR @@ -170032,8 +170427,8 @@ izU izU izU izU -izU -aEm +hce +tGV gnK izU kBG @@ -170804,17 +171199,17 @@ scZ eSz eSz eSz -fuc -sLC -rNN +wPR +fQF +gDQ kNT brr xFj fbk kNT -oHK -bjn -ejL +krM +keN +csl vic izU izU @@ -171061,7 +171456,7 @@ lZW lZW izU izU -dIJ +fVN izU izU eSz @@ -171071,7 +171466,7 @@ lwN eSz izU izU -dIJ +fVN izU wza izU @@ -171318,16 +171713,16 @@ aaa aaa aaa izU -xGn -gtY -sXZ +wFf +tOJ +auq vfk fhx iJl wUG vfk -sXZ -ocw +auq +ltd qtS gnj wza @@ -171575,8 +171970,8 @@ aaa aaa aaa izU -eKI -wki +clO +pbC izU eSz nSP @@ -171585,7 +171980,7 @@ lwN eSz izU seG -euF +dCJ izU wza izU @@ -171832,7 +172227,7 @@ aaa aaa aaa izU -bdX +krh izU izU eSz @@ -171842,7 +172237,7 @@ lwN eSz izU izU -gXj +roH izU wza izU @@ -172089,7 +172484,7 @@ aaa aaa aaa izU -mwN +jrz wYw izU eSz @@ -180057,7 +180452,7 @@ oSB nVd vUE bMb -iqe +kdz pxO brm gay @@ -180065,7 +180460,7 @@ lZj jwH brm pxO -lqp +wnP bMb lVi abM @@ -180315,14 +180710,14 @@ ldp wkz hsN psy -sjq +oAY seR kTK eFJ gOF seR -snF -qTh +vvd +xbT rmH lVi jxi @@ -180570,7 +180965,7 @@ jnJ ged whL vUE -aEz +eYr yeB ipC seR @@ -184168,7 +184563,7 @@ yiV uCO aDI aDV -eBu +qrx yeB hZc seR @@ -184425,10 +184820,10 @@ pEe uCO hPi bMb -cmZ -tPw +dEo +saI raY -oXK +hZv ljn ujw ljn @@ -184682,8 +185077,8 @@ vPB mRb sYJ bMb -vWy -cCw +bAj +dJk vUE vUE vUE @@ -184939,14 +185334,14 @@ vPB uCO fZS bMb -reK -aZr +kix +deU lCy -fcR -vms -fXN -wwH -fcR +fiW +mIQ +bIs +emp +fiW nSI hPQ vDI @@ -185196,14 +185591,14 @@ vPB uCO fZS bMb -sqg -qYw +ktW +sUc lCy -fcR -dPt -ngr -dcw -uFK +fiW +fdM +xEZ +slr +lIR nSI axt eRb @@ -185456,11 +185851,11 @@ bMb bMb bMb lCy -fcR -rwc -vEf -dcw -fcR +fiW +qrI +fvD +slr +fiW nSI qrs xts @@ -185715,8 +186110,8 @@ veA lCy lCy lCy -rzF -iRg +nzx +cFb lCy nSI tXz diff --git a/_maps/shuttles/cargo_birdshot.dmm b/_maps/shuttles/cargo_birdshot.dmm index 4706a71d082..a0cc7901c18 100644 --- a/_maps/shuttles/cargo_birdshot.dmm +++ b/_maps/shuttles/cargo_birdshot.dmm @@ -69,9 +69,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/supply) -"t" = ( -/turf/closed/wall/mineral/titanium/nosmooth, -/area/shuttle/supply) "w" = ( /obj/effect/turf_decal/stripes/box, /obj/machinery/conveyor{ @@ -247,7 +244,7 @@ T X W Z -t +T M J w @@ -289,7 +286,7 @@ T R m i -t +T P e I diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index c84250b13d9..96aba76e5f7 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -154,9 +154,9 @@ /area/shuttle/pirate) "aD" = ( /obj/machinery/power/apc/auto_name/directional/north{ - cell_type = /obj/item/stock_parts/cell/bluespace; - start_charge = 100 + cell_type = /obj/item/stock_parts/cell/bluespace }, +/obj/effect/mapping_helpers/apc/full_charge, /obj/effect/mapping_helpers/apc/cut_AI_wire, /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 @@ -356,7 +356,7 @@ /turf/open/floor/iron/dark, /area/shuttle/pirate) "bu" = ( -/obj/structure/window/reinforced, +/obj/structure/window/reinforced/spawner/directional/south, /obj/item/storage/box/handcuffs, /turf/open/floor/iron/dark, /area/shuttle/pirate) @@ -364,7 +364,7 @@ /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 4 }, -/obj/structure/window/reinforced, +/obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/unanchored/spawner/directional/north, /obj/structure/bed, /obj/machinery/door/window/brigdoor/right/directional/west{ @@ -507,7 +507,7 @@ /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 }, -/obj/structure/window/reinforced, +/obj/structure/window/reinforced/spawner/directional/south, /obj/structure/bed{ dir = 1 }, diff --git a/_maps/shuttles/skyrat/ruin_tarkon_driver.dmm b/_maps/shuttles/skyrat/ruin_tarkon_driver.dmm new file mode 100644 index 00000000000..d0e3819e11c --- /dev/null +++ b/_maps/shuttles/skyrat/ruin_tarkon_driver.dmm @@ -0,0 +1,658 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"bF" = ( +/obj/machinery/light/directional/east, +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/snack, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"cP" = ( +/obj/machinery/door/airlock/titanium/glass, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"cS" = ( +/obj/machinery/door/airlock/titanium, +/obj/docking_port/mobile{ + name = "Tarkon Driver"; + port_direction = 2; + preferred_direction = 8; + shuttle_id = "tarkon_driver" + }, +/obj/structure/fans/tiny/invisible, +/obj/structure/cable, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"ef" = ( +/turf/open/floor/iron/recharge_floor, +/area/shuttle/tarkon_driver) +"fg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"fy" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor{ + id = "driverwindows" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"fE" = ( +/obj/machinery/light/directional/west, +/obj/structure/table/reinforced, +/obj/item/clothing/mask/gas, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"gu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"hH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/mineral/titanium/spaceship, +/area/shuttle/tarkon_driver) +"hW" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"if" = ( +/obj/machinery/door/airlock/titanium, +/obj/structure/fans/tiny/invisible, +/obj/structure/cable, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"ik" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"io" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"iF" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"jG" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"ni" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"nn" = ( +/obj/structure/rack/shelf, +/obj/effect/spawner/random/medical/medkit, +/obj/effect/spawner/random/medical/medkit, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"nz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/titanium/glass, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"oz" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"rr" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"st" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/portables_connector/layer4{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"tV" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/tarkon_driver) +"uk" = ( +/obj/machinery/door/airlock/titanium, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"vo" = ( +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"zo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"zL" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Al" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/tarkon_driver, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Ap" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"AX" = ( +/obj/machinery/light/directional/north, +/obj/structure/tank_dispenser, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"BH" = ( +/obj/machinery/recharge_station, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"BS" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/all_access, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Cf" = ( +/obj/structure/rack/shelf, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Cn" = ( +/obj/structure/rack/shelf, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/machinery/door/window/right/directional/west, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Cv" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"DF" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 2 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Em" = ( +/turf/template_noop, +/area/template_noop) +"Fi" = ( +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Fp" = ( +/obj/structure/table/reinforced, +/obj/item/crowbar/red, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"GN" = ( +/turf/closed/wall/mineral/titanium/spaceship, +/area/shuttle/tarkon_driver) +"GX" = ( +/obj/machinery/light/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"HI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"HY" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"IP" = ( +/obj/structure/closet/crate/internals, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/clothing/mask/breath, +/obj/item/clothing/suit/space/eva, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/suit/space/eva, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/clothing/mask/breath, +/obj/machinery/door/window/right/directional/east, +/obj/machinery/light/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Jo" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/directional/south, +/obj/item/pickaxe/drill, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"JF" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/tarkon_driver) +"JS" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "driverwindows"; + name = "Blast Shield Control" + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"JY" = ( +/obj/machinery/computer/shuttle/tarkon_driver, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Kv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"LG" = ( +/turf/closed/wall/mineral/titanium/spaceship/nodiagonal, +/area/shuttle/tarkon_driver) +"Mh" = ( +/obj/machinery/door/airlock/titanium, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Ml" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"Nj" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Ow" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"OJ" = ( +/obj/machinery/suit_storage_unit/industrial/tarkon, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Pn" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Qe" = ( +/obj/structure/rack/shelf, +/obj/effect/spawner/random/engineering/material, +/obj/effect/spawner/random/engineering/material, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Rg" = ( +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Rn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Sd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"St" = ( +/obj/structure/closet/crate/internals, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/clothing/mask/breath, +/obj/item/clothing/suit/space/eva, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/suit/space/eva, +/obj/item/clothing/head/helmet/space/eva, +/obj/item/clothing/mask/breath, +/obj/machinery/door/window/right/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Tp" = ( +/obj/structure/rack/shelf, +/obj/item/oxygen_candle, +/obj/item/oxygen_candle, +/obj/item/oxygen_candle, +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"TS" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Ue" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Ut" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Uu" = ( +/obj/machinery/door/airlock/titanium/glass, +/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Vp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/computer/mech_bay_power_console{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Vt" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"VM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/tarkon_driver) +"Ww" = ( +/obj/structure/rack/shelf, +/obj/effect/spawner/random/maintenance/three, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Xb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"XN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Ye" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Zm" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"Zo" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) + +(1,1,1) = {" +Zo +LG +LG +JF +JF +JF +JF +Em +Em +Zo +GN +GN +GN +GN +LG +GN +"} +(2,1,1) = {" +Em +Zo +LG +AX +OJ +OJ +JF +fy +fy +tV +LG +DF +ef +BH +GN +Cv +"} +(3,1,1) = {" +Em +Em +uk +Kv +gu +oz +JF +St +St +IP +LG +Vp +Xb +XN +hH +zL +"} +(4,1,1) = {" +JF +fy +tV +JF +Uu +JF +tV +Ap +TS +TS +LG +rr +Kv +XN +LG +GN +"} +(5,1,1) = {" +fy +JS +fE +Fi +gu +TS +Ut +Rg +fg +Rg +LG +Rn +Rg +ni +st +GN +"} +(6,1,1) = {" +fy +Al +Zm +Kv +gu +gu +nz +gu +gu +gu +Mh +gu +VM +VM +vo +if +"} +(7,1,1) = {" +fy +JY +Zm +Ye +gu +vo +cP +vo +HI +vo +HY +io +vo +Ml +Ow +cS +"} +(8,1,1) = {" +fy +Fp +bF +Ue +gu +BS +Ut +Rg +aP +Rg +LG +zo +Rg +iF +Jo +GN +"} +(9,1,1) = {" +JF +fy +tV +JF +Uu +JF +tV +Nj +hW +hW +LG +GX +Sd +iF +LG +GN +"} +(10,1,1) = {" +Em +Em +uk +Kv +gu +Xb +JF +Tp +Cf +Cn +LG +ik +Xb +jG +hH +zL +"} +(11,1,1) = {" +Em +Zo +LG +Ww +Qe +nn +JF +fy +fy +tV +LG +Pn +Vt +Pn +GN +Cv +"} +(12,1,1) = {" +Zo +LG +LG +JF +JF +JF +JF +Em +Em +Zo +LG +GN +GN +GN +LG +GN +"} diff --git a/_maps/shuttles/skyrat/ruin_tarkon_driverdc2.dmm b/_maps/shuttles/skyrat/ruin_tarkon_driverdc2.dmm deleted file mode 100644 index 5d89675d603..00000000000 --- a/_maps/shuttles/skyrat/ruin_tarkon_driverdc2.dmm +++ /dev/null @@ -1,505 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aj" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"cU" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"eC" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"eG" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"ip" = ( -/obj/machinery/door/airlock/titanium/glass, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"jH" = ( -/obj/machinery/door/window/right/directional/east{ - opacity = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"kb" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/tarkon_driver) -"kC" = ( -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"kQ" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/table/reinforced, -/obj/item/clothing/mask/gas, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"lV" = ( -/turf/template_noop, -/area/template_noop) -"mZ" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"nd" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light/warm/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"oi" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"oo" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/tarkon_driver) -"oK" = ( -/mob/living/simple_animal/hostile/cult/magic, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"pL" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"rT" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"tk" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 2 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"wt" = ( -/obj/structure/statue/bone/rib, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"wZ" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"xg" = ( -/obj/machinery/door/airlock/titanium, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"xi" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/tarkon_driver, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"xy" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"zR" = ( -/obj/machinery/door/airlock/titanium, -/obj/docking_port/mobile{ - shuttle_id = "tarkon_driver"; - name = "Tarkon Driver"; - port_direction = 2; - preferred_direction = 8 - }, -/obj/structure/fans/tiny/invisible, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Bv" = ( -/obj/structure/rack/shelf, -/obj/item/oxygen_candle, -/obj/item/oxygen_candle, -/obj/item/oxygen_candle, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"Cm" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/machinery/door/poddoor{ - id = "driverwindows" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Dw" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Dx" = ( -/obj/machinery/door/window/left/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"DX" = ( -/obj/machinery/computer/shuttle/tarkon_driver, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Ea" = ( -/obj/structure/rack/shelf, -/obj/item/flashlight/flare, -/obj/item/flashlight/flare, -/obj/item/flashlight/flare, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"EM" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"FA" = ( -/mob/living/simple_animal/hostile/cult/warrior, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"FS" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/bed/pod, -/obj/item/bedsheet, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Gg" = ( -/turf/open/floor/iron/recharge_floor, -/area/shuttle/tarkon_driver) -"GC" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"HD" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"HO" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Ig" = ( -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Ms" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "driverwindows"; - name = "Blast Shield Control" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Oa" = ( -/obj/structure/closet/crate/internals, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"Op" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/fans/tiny/invisible, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Qj" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/warm/directional/south, -/obj/item/pickaxe/drill, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Sd" = ( -/obj/machinery/door/window/right/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"SG" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/medical/medkit, -/obj/effect/spawner/random/medical/medkit, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Ti" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar/red, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Tt" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"UE" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"UY" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/material, -/obj/effect/spawner/random/engineering/material, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"VD" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"XQ" = ( -/obj/structure/rack/shelf, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) -"Yh" = ( -/obj/machinery/recharge_station, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"YA" = ( -/turf/open/floor/cult, -/area/shuttle/tarkon_driver) - -(1,1,1) = {" -aj -oo -oo -oo -oo -oo -oo -lV -lV -aj -oo -oo -oo -oo -oo -oo -"} -(2,1,1) = {" -lV -aj -oo -tk -Gg -Yh -oo -Cm -Cm -oo -kb -HO -eC -HO -oo -cU -"} -(3,1,1) = {" -lV -lV -xg -Ig -Ig -Ig -oo -Oa -Oa -Oa -oi -Ig -Ig -Ig -oo -cU -"} -(4,1,1) = {" -oo -Cm -kb -oo -ip -oo -kb -YA -GC -mZ -eG -rT -jH -rT -kb -oo -"} -(5,1,1) = {" -Cm -Ms -kQ -xy -Ig -Ig -wZ -Ig -mZ -YA -Ig -Ig -Ig -wZ -nd -oo -"} -(6,1,1) = {" -Cm -xi -Tt -Sd -Ig -Ig -YA -Ig -YA -mZ -FA -Ig -Ig -Ig -Ig -Op -"} -(7,1,1) = {" -Cm -DX -Tt -Dx -Ig -wZ -Ig -oK -YA -Ig -Ig -YA -wZ -Ig -Ig -zR -"} -(8,1,1) = {" -Cm -Ti -Dw -VD -wZ -Ig -Ig -YA -YA -YA -wZ -Ig -Ig -Ig -Qj -oo -"} -(9,1,1) = {" -oo -Cm -kb -oo -ip -oo -kb -mZ -wt -YA -UE -pL -kC -pL -kb -oo -"} -(10,1,1) = {" -lV -lV -xg -Ig -Ig -Ig -oo -Bv -Ea -XQ -FS -Ig -Ig -Ig -oo -cU -"} -(11,1,1) = {" -lV -aj -oo -HD -UY -SG -oo -Cm -Cm -oo -kb -EM -eC -EM -oo -cU -"} -(12,1,1) = {" -aj -oo -oo -oo -oo -oo -oo -lV -lV -aj -oo -oo -oo -oo -oo -oo -"} diff --git a/_maps/shuttles/skyrat/ruin_tarkon_driverdc3.dmm b/_maps/shuttles/skyrat/ruin_tarkon_driverdc3.dmm deleted file mode 100644 index 6b3677487d7..00000000000 --- a/_maps/shuttles/skyrat/ruin_tarkon_driverdc3.dmm +++ /dev/null @@ -1,492 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"b" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"d" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "driverwindows"; - name = "Blast Shield Control" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"e" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/tarkon_driver, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"f" = ( -/mob/living/simple_animal/hostile/alien/drone, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"g" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"h" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"i" = ( -/obj/machinery/computer/shuttle/tarkon_driver, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"j" = ( -/obj/machinery/door/airlock/titanium/glass, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"k" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"l" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar/red, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"n" = ( -/obj/structure/rack/shelf, -/obj/item/flashlight/flare, -/obj/item/flashlight/flare, -/obj/item/flashlight/flare, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"o" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"p" = ( -/obj/machinery/door/airlock/titanium, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"q" = ( -/obj/machinery/door/airlock/titanium, -/obj/docking_port/mobile{ - shuttle_id = "tarkon_driver"; - name = "Tarkon Driver"; - port_direction = 2; - preferred_direction = 8 - }, -/obj/structure/fans/tiny/invisible, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"r" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/tarkon_driver) -"s" = ( -/turf/template_noop, -/area/template_noop) -"t" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/table/reinforced, -/obj/item/clothing/mask/gas, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"u" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"v" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"w" = ( -/obj/structure/rack/shelf, -/obj/item/oxygen_candle, -/obj/item/oxygen_candle, -/obj/item/oxygen_candle, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"x" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"y" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 2 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"z" = ( -/obj/structure/closet/crate/internals, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"A" = ( -/obj/machinery/door/window/right/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"B" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"C" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/warm/directional/south, -/obj/item/pickaxe/drill, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"D" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"E" = ( -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"F" = ( -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"G" = ( -/obj/machinery/door/window/right/directional/east{ - opacity = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"H" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"I" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/machinery/door/poddoor{ - id = "driverwindows" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"J" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/bed/pod, -/obj/item/bedsheet, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"K" = ( -/mob/living/simple_animal/hostile/alien, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"L" = ( -/obj/machinery/recharge_station, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"M" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"N" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"O" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/material, -/obj/effect/spawner/random/engineering/material, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"P" = ( -/obj/machinery/door/window/left/directional/south, -/obj/structure/alien/weeds/node, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Q" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/tarkon_driver) -"R" = ( -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"S" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/fans/tiny/invisible, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"T" = ( -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/floor/iron/recharge_floor, -/area/shuttle/tarkon_driver) -"U" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"V" = ( -/obj/structure/alien/weeds/node, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"W" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light/warm/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"X" = ( -/obj/structure/rack/shelf, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Y" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/medical/medkit, -/obj/effect/spawner/random/medical/medkit, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) - -(1,1,1) = {" -b -r -r -r -r -r -r -s -s -b -r -r -r -r -r -r -"} -(2,1,1) = {" -s -b -r -y -T -L -r -I -I -r -Q -g -a -g -r -U -"} -(3,1,1) = {" -s -s -p -F -V -F -r -z -z -z -h -F -F -V -r -U -"} -(4,1,1) = {" -r -I -Q -r -j -r -Q -V -F -F -D -H -G -H -Q -r -"} -(5,1,1) = {" -I -d -t -x -F -F -F -F -F -K -F -F -F -K -W -r -"} -(6,1,1) = {" -I -e -u -A -F -F -F -F -F -F -V -F -F -F -F -S -"} -(7,1,1) = {" -I -i -u -P -F -F -F -f -F -F -F -F -F -F -V -q -"} -(8,1,1) = {" -I -l -v -N -F -F -V -F -F -F -F -F -E -F -C -r -"} -(9,1,1) = {" -r -I -Q -r -j -r -Q -F -F -V -k -M -R -M -Q -r -"} -(10,1,1) = {" -s -s -p -f -F -V -r -w -n -X -J -F -V -F -r -U -"} -(11,1,1) = {" -s -b -r -o -O -Y -r -I -I -r -Q -B -a -B -r -U -"} -(12,1,1) = {" -b -r -r -r -r -r -r -s -s -b -r -r -r -r -r -r -"} diff --git a/_maps/shuttles/skyrat/ruin_tarkon_driverdc54.dmm b/_maps/shuttles/skyrat/ruin_tarkon_driverdc54.dmm deleted file mode 100644 index bea3eba3a4e..00000000000 --- a/_maps/shuttles/skyrat/ruin_tarkon_driverdc54.dmm +++ /dev/null @@ -1,474 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"b" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"d" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "driverwindows"; - name = "Blast Shield Control" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"e" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/tarkon_driver, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"g" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"h" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"i" = ( -/obj/machinery/computer/shuttle/tarkon_driver, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"j" = ( -/obj/machinery/door/airlock/titanium/glass, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"k" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"l" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar/red, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"n" = ( -/obj/structure/rack/shelf, -/obj/item/flashlight/flare, -/obj/item/flashlight/flare, -/obj/item/flashlight/flare, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"o" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"p" = ( -/obj/machinery/door/airlock/titanium, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"q" = ( -/obj/machinery/door/airlock/titanium, -/obj/docking_port/mobile{ - shuttle_id = "tarkon_driver"; - name = "Tarkon Driver"; - port_direction = 2; - preferred_direction = 8 - }, -/obj/structure/fans/tiny/invisible, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"r" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/tarkon_driver) -"s" = ( -/turf/template_noop, -/area/template_noop) -"t" = ( -/obj/machinery/light/dim/directional/west, -/obj/structure/table/reinforced, -/obj/item/clothing/mask/gas, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"u" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"v" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"w" = ( -/obj/structure/rack/shelf, -/obj/item/oxygen_candle, -/obj/item/oxygen_candle, -/obj/item/oxygen_candle, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"x" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"y" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 2 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"z" = ( -/obj/structure/closet/crate/internals, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/eva, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/suit/space/eva, -/obj/item/clothing/head/helmet/space/eva, -/obj/item/clothing/mask/breath, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"A" = ( -/obj/machinery/door/window/right/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"B" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"C" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/warm/directional/south, -/obj/item/pickaxe/drill, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"D" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"F" = ( -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"G" = ( -/obj/machinery/door/window/right/directional/east{ - opacity = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"H" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"I" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/machinery/door/poddoor{ - id = "driverwindows" - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"J" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/north, -/obj/structure/bed/pod, -/obj/item/bedsheet, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"L" = ( -/obj/machinery/recharge_station, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"M" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"N" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"O" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/engineering/material, -/obj/effect/spawner/random/engineering/material, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"P" = ( -/obj/machinery/door/window/left/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Q" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/tarkon_driver) -"R" = ( -/obj/machinery/door/window/left/directional/west{ - opacity = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"S" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/fans/tiny/invisible, -/obj/effect/mapping_helpers/airlock/access/all/tarkon/general, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"T" = ( -/turf/open/floor/iron/recharge_floor, -/area/shuttle/tarkon_driver) -"U" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"W" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light/warm/directional/south, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"X" = ( -/obj/structure/rack/shelf, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) -"Y" = ( -/obj/structure/rack/shelf, -/obj/effect/spawner/random/medical/medkit, -/obj/effect/spawner/random/medical/medkit, -/turf/open/floor/mineral/titanium, -/area/shuttle/tarkon_driver) - -(1,1,1) = {" -b -r -r -r -r -r -r -s -s -b -r -r -r -r -r -r -"} -(2,1,1) = {" -s -b -r -y -T -L -r -I -I -r -Q -g -a -g -r -U -"} -(3,1,1) = {" -s -s -p -F -F -F -r -z -z -z -h -F -F -F -r -U -"} -(4,1,1) = {" -r -I -Q -r -j -r -Q -F -F -F -D -H -G -H -Q -r -"} -(5,1,1) = {" -I -d -t -x -F -F -F -F -F -F -F -F -F -F -W -r -"} -(6,1,1) = {" -I -e -u -A -F -F -F -F -F -F -F -F -F -F -F -S -"} -(7,1,1) = {" -I -i -u -P -F -F -F -F -F -F -F -F -F -F -F -q -"} -(8,1,1) = {" -I -l -v -N -F -F -F -F -F -F -F -F -F -F -C -r -"} -(9,1,1) = {" -r -I -Q -r -j -r -Q -F -F -F -k -M -R -M -Q -r -"} -(10,1,1) = {" -s -s -p -F -F -F -r -w -n -X -J -F -F -F -r -U -"} -(11,1,1) = {" -s -b -r -o -O -Y -r -I -I -r -Q -B -a -B -r -U -"} -(12,1,1) = {" -b -r -r -r -r -r -r -s -s -b -r -r -r -r -r -r -"} diff --git a/_maps/shuttles/skyrat/whiteship_blueshift.dmm b/_maps/shuttles/skyrat/whiteship_blueshift.dmm index 533ea6484b0..036d09d0909 100644 --- a/_maps/shuttles/skyrat/whiteship_blueshift.dmm +++ b/_maps/shuttles/skyrat/whiteship_blueshift.dmm @@ -4292,7 +4292,7 @@ dir = 8 }, /obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/computer/secure_data, +/obj/machinery/computer/records/security, /turf/open/floor/iron/dark, /area/shuttle/abandoned) "Pm" = ( diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index cce5cddd607..50f40bba54a 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -403,9 +403,9 @@ dir = 4; name = "Old Mining Turret"; lethal_projectile = /obj/projectile/kinetic/miner; - lethal_projectile_sound = 'sound/weapons/kenetic_accel.ogg'; + lethal_projectile_sound = 'sound/weapons/kinetic_accel.ogg'; stun_projectile = /obj/projectile/kinetic/miner; - stun_projectile_sound = 'sound/weapons/kenetic_accel.ogg' + stun_projectile_sound = 'sound/weapons/kinetic_accel.ogg' }, /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned/bar) diff --git a/_maps/skyrat/automapper/automapper_config.toml b/_maps/skyrat/automapper/automapper_config.toml index f38522c62c2..6dd20e0ec93 100644 --- a/_maps/skyrat/automapper/automapper_config.toml +++ b/_maps/skyrat/automapper/automapper_config.toml @@ -304,12 +304,12 @@ required_map = "north_star.dmm" coordinates = [105, 117, 2] trait_name = "Station" -# Northstar Prison -[templates.northstar_prison] -map_files = ["northstar_prison.dmm"] +# Northstar Armory +[templates.northstar_armory] +map_files = ["northstar_armory.dmm"] directory = "_maps/skyrat/automapper/templates/northstar/" required_map = "north_star.dmm" -coordinates = [149, 109, 4] +coordinates = [121, 109, 4] trait_name = "Station" # Northstar NTR Office @@ -336,6 +336,10 @@ required_map = "Lavaland.dmm" coordinates = [223, 224, 1] trait_name = "Mining" +# Kilostation Armory +[templates.kilostation_armory] +map_files = ["kilostation_armory.dmm"] +directory = "_maps/skyrat/automapper/templates/kilostation/" #BUBBER EDITS ------------------------------- # ADD ALL BUBBER EDITS BENEATH THIS! @@ -415,7 +419,7 @@ trait_name = "Station" # Kilostation Arrivals [templates.kilostation_arrivals] map_files = ["kilostation_arrivals.dmm"] -directory = "_maps/bubber/automapper/templates/kilostation/" +directory = "_maps/skyrat/automapper/templates/kilostation/" required_map = "KiloStation.dmm" coordinates = [151, 80, 1] trait_name = "Station" @@ -423,7 +427,7 @@ trait_name = "Station" # Kilostation ERT Bay and Barber [templates.kilostation_ert_bay] map_files = ["kilostation_ert_bay.dmm"] -directory = "_maps/bubber/automapper/templates/kilostation/" +directory = "_maps/skyrat/automapper/templates/kilostation/" required_map = "KiloStation.dmm" coordinates = [77, 151, 1] trait_name = "Station" @@ -431,7 +435,7 @@ trait_name = "Station" # Kilostation Cryo [templates.kilostation_cryo] map_files = ["kilostation_cryo.dmm"] -directory = "_maps/bubber/automapper/templates/kilostation/" +directory = "_maps/skyrat/automapper/templates/kilostation/" required_map = "KiloStation.dmm" coordinates = [59, 118, 1] trait_name = "Station" @@ -439,7 +443,7 @@ trait_name = "Station" # Kilostation Supermatter Chamber [templates.kilostation_supermatter] map_files = ["kilostation_supermatter.dmm"] -directory = "_maps/bubber/automapper/templates/kilostation/" +directory = "_maps/skyrat/automapper/templates/kilostation/" required_map = "KiloStation.dmm" coordinates = [140, 72, 1] trait_name = "Station" diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm new file mode 100644 index 00000000000..dd3e19188ea --- /dev/null +++ b/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm @@ -0,0 +1,448 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/effect/spawner/random/armory/riot_shield, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"b" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/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, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"c" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"d" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"e" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"f" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"h" = ( +/obj/item/storage/box/teargas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/handcuffs, +/obj/item/storage/box/flashbangs{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"j" = ( +/obj/structure/table, +/obj/item/key/security, +/obj/item/key/security, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/e_gun/dragnet{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/spawner/random/armory/barrier_grenades, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"k" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"l" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"m" = ( +/obj/structure/closet/secure_closet{ + name = "shotgun rubber rounds locker"; + req_access = list("armory") + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/spawner/random/armory/rubbershot, +/obj/effect/spawner/random/armory/rubbershot, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"o" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/flasher/portable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"p" = ( +/obj/structure/cable, +/obj/structure/closet/secure_closet{ + name = "contraband locker"; + req_access = list("armory") + }, +/obj/effect/spawner/random/contraband/armory, +/obj/effect/spawner/random/maintenance/three, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"t" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/obj/machinery/suit_storage_unit/security, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"v" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"w" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"x" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable, +/mob/living/simple_animal/bot/secbot/beepsky/armsky, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"y" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"z" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/effect/spawner/random/armory/disablers, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"A" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"B" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/spawner/armory_spawn/smg, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"C" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/security, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"F" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"G" = ( +/obj/item/storage/box/chemimp{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/box/trackimp{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/structure/table, +/obj/machinery/light/directional/south, +/obj/structure/reagent_dispensers/wall/peppertank/directional/south, +/obj/item/storage/box/firingpins, +/obj/item/storage/box/firingpins, +/obj/item/storage/lockbox/loyalty, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"J" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"K" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"M" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/closet/secure_closet/armory_kiboko, +/obj/item/ammo_box/c980grenade/riot, +/obj/item/ammo_box/c980grenade/smoke, +/obj/structure/sign/poster/official/carwo_grenade/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"N" = ( +/obj/structure/rack, +/obj/item/gun/energy/ionrifle{ + pixel_y = 4 + }, +/obj/item/gun/energy/temperature/security, +/obj/effect/turf_decal/bot, +/obj/item/clothing/suit/hooded/ablative, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"P" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/armory/e_gun, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"S" = ( +/obj/machinery/flasher/portable, +/obj/machinery/camera/motion/directional/east{ + c_tag = "Armoury Internal" + }, +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"T" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"V" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"W" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"Y" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/spawner/armory_spawn/shotguns, +/turf/open/floor/iron/showroomfloor, +/area/station/ai_monitored/security/armory) +"Z" = ( +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas/sechailer, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/airalarm/directional/west, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) + +(1,1,1) = {" +Z +l +a +w +m +j +"} +(2,1,1) = {" +M +T +f +J +c +G +"} +(3,1,1) = {" +W +b +P +Y +y +C +"} +(4,1,1) = {" +K +k +B +z +y +t +"} +(5,1,1) = {" +o +F +x +V +v +p +"} +(6,1,1) = {" +e +S +d +A +N +h +"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm new file mode 100644 index 00000000000..ead5fdba2a2 --- /dev/null +++ b/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm @@ -0,0 +1,425 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/airless, +/area/station/hallway/secondary/entry) +"b" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"e" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"f" = ( +/turf/closed/wall/rust, +/area/station/hallway/secondary/entry) +"g" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Shuttle Airlock"; + space_dir = 2 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "arrival-airlock-east" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"h" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"i" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/flora/grass/jungle/a/style_random, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"j" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/west, +/obj/machinery/status_display/shuttle/directional/west{ + shuttle_id = "arrivals_shuttle" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"k" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"n" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"o" = ( +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"p" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/stripes/corner, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"q" = ( +/turf/closed/wall, +/area/station/hallway/secondary/entry) +"r" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/bluespace_vendor/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"s" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/flora/bush/pale/style_random, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"t" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/east, +/obj/machinery/status_display/shuttle/directional/east{ + shuttle_id = "arrivals_shuttle" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"v" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/flora/grass/jungle/a/style_random, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"x" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"y" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"z" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer/shuttle/arrivals/recall{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"A" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"D" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"E" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"F" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"G" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Shuttle Airlock"; + space_dir = 2 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"I" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall, +/area/station/hallway/secondary/entry) +"J" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"K" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/structure/flora/bush/ferny/style_random, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"M" = ( +/turf/closed/mineral/random/labormineral, +/area/station/hallway/secondary/entry) +"O" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 1; + height = 13; + shuttle_id = "arrivals_stationary"; + name = "arrivals"; + width = 5 + }, +/turf/open/floor/plating/airless, +/area/station/hallway/secondary/entry) +"P" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/station/hallway/secondary/entry) +"S" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/flora/grass/jungle/b/style_random, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"T" = ( +/obj/structure/sign/warning/secure_area{ + name = "EMERGENCY STORAGE" + }, +/turf/closed/wall, +/area/station/hallway/secondary/entry) +"U" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/misc/asteroid/airless, +/area/station/hallway/secondary/entry) +"V" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"W" = ( +/obj/machinery/door/airlock/external{ + name = "Arrival Shuttle Airlock" + }, +/obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "arrival-airlock-east" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"X" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/entry) +"Y" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) + +(1,1,1) = {" +x +f +M +S +a +a +a +a +"} +(2,1,1) = {" +X +q +M +v +a +O +a +a +"} +(3,1,1) = {" +T +f +q +I +a +a +a +a +"} +(4,1,1) = {" +r +E +j +G +a +a +a +a +"} +(5,1,1) = {" +A +F +F +F +a +a +a +a +"} +(6,1,1) = {" +h +n +F +s +a +a +a +a +"} +(7,1,1) = {" +Y +V +k +v +a +a +a +a +"} +(8,1,1) = {" +J +z +F +D +a +a +a +a +"} +(9,1,1) = {" +b +e +F +U +a +a +a +a +"} +(10,1,1) = {" +p +y +F +K +a +a +a +a +"} +(11,1,1) = {" +f +W +F +F +a +a +a +a +"} +(12,1,1) = {" +q +o +t +g +a +a +a +a +"} +(13,1,1) = {" +f +q +f +I +a +a +a +a +"} +(14,1,1) = {" +f +M +M +i +P +a +a +a +"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm new file mode 100644 index 00000000000..d3035bcc07a --- /dev/null +++ b/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm @@ -0,0 +1,204 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall, +/area/station/common/cryopods) +"c" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/greater) +"d" = ( +/obj/effect/turf_decal/bot, +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/greater) +"e" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "greylair"; + name = "Lair Privacy Shutter" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"g" = ( +/turf/open/floor/iron, +/area/station/common/cryopods) +"j" = ( +/obj/machinery/computer/cryopod/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/common/cryopods) +"l" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/common/cryopods) +"o" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/common/cryopods) +"r" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "greylair"; + name = "Lair Privacy Shutter" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"u" = ( +/obj/effect/turf_decal/bot, +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/greater) +"x" = ( +/obj/machinery/cryopod, +/obj/effect/turf_decal/siding/white, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/common/cryopods) +"z" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cryopods" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/common/cryopods) +"A" = ( +/obj/machinery/cryopod, +/obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/common/cryopods) +"D" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/common/cryopods) +"J" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/camera/directional/east, +/obj/machinery/time_clock/directional/east, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/common/cryopods) +"O" = ( +/obj/machinery/cryopod, +/obj/effect/turf_decal/siding/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/common/cryopods) +"Q" = ( +/obj/structure/table, +/obj/item/storage/briefcase/secure, +/obj/item/taperecorder, +/obj/structure/sign/warning/electric_shock/directional/south, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/greater) +"R" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "greylair"; + name = "Lair Privacy Shutter" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"S" = ( +/obj/machinery/cryopod{ + dir = 1 + }, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/common/cryopods) +"U" = ( +/turf/closed/wall, +/area/station/maintenance/port/greater) +"W" = ( +/obj/machinery/cryopod, +/obj/effect/turf_decal/siding/white, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/common/cryopods) +"X" = ( +/obj/effect/turf_decal/bot, +/obj/structure/frame/computer{ + anchored = 1; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/greater) + +(1,1,1) = {" +Q +a +a +a +a +a +"} +(2,1,1) = {" +d +r +W +o +g +l +"} +(3,1,1) = {" +X +e +O +g +g +z +"} +(4,1,1) = {" +u +R +A +D +S +l +"} +(5,1,1) = {" +c +r +x +j +J +l +"} +(6,1,1) = {" +U +a +a +a +a +a +"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm new file mode 100644 index 00000000000..34e0fbcad74 --- /dev/null +++ b/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm @@ -0,0 +1,3119 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ad" = ( +/obj/structure/transit_tube/diagonal/topleft, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"an" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"aK" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"bb" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Transit Intersection" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"bj" = ( +/obj/machinery/bluespace_vendor/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Salon Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"bB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/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/fore) +"bH" = ( +/obj/structure/transit_tube/diagonal/crossing/topleft, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"bV" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"ca" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"cc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"cf" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"cm" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"cW" = ( +/obj/structure/fans/tiny/forcefield{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external/directional/east, +/obj/machinery/door/poddoor/preopen{ + name = "Dock Shutter" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"cX" = ( +/obj/structure/closet/secure_closet/nanotrasen_consultant/station, +/obj/item/assembly/flash/handheld, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"df" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/primary/fore) +"ds" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/primary/fore) +"dC" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"dG" = ( +/obj/machinery/camera/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"dV" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/transit_tube, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"dY" = ( +/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, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"dZ" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"ew" = ( +/obj/structure/sign/departments/custodian, +/turf/closed/wall, +/area/station/maintenance/fore) +"ey" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/obj/machinery/vending/barbervend, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"eL" = ( +/obj/structure/closet{ + name = "maid locker" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/color/white, +/obj/item/clothing/accessory/maidapron{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/item/clothing/shoes/laceup, +/obj/structure/mirror/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/fore) +"eQ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/mousetraps{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/flashlight, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/fore) +"eZ" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/barricade/wooden/crude, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/turf/open/floor/iron/dark, +/area/station/maintenance/fore) +"fb" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"fc" = ( +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"fr" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"fx" = ( +/obj/structure/cable, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"fA" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"fF" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"fR" = ( +/obj/structure/sign/warning/secure_area, +/turf/closed/wall, +/area/space/nearstation) +"fT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/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/fore) +"gk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/primary/fore) +"gv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"gw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/hallway/primary/fore) +"gx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + 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/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"gy" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"gH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"gW" = ( +/obj/effect/turf_decal/sand/plating, +/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/cable, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"gX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"ha" = ( +/obj/structure/sign/departments/holy{ + pixel_y = 30 + }, +/turf/open/floor/iron/stairs/right{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"hd" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"hg" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"hj" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"hs" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"hS" = ( +/obj/structure/transit_tube/diagonal/crossing/topleft, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"iv" = ( +/obj/structure/cable, +/turf/open/floor/iron/stairs/old{ + dir = 8 + }, +/area/station/maintenance/fore/lesser) +"iy" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"iD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"iM" = ( +/obj/structure/fans/tiny/forcefield{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + name = "Dock Shutter" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"iV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"jA" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/storage/belt/janitor, +/obj/item/storage/bag/trash, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/area/station/maintenance/fore) +"jC" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"jJ" = ( +/obj/structure/transit_tube/crossing, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"jK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"jS" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"jV" = ( +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"jY" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"kh" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"ku" = ( +/obj/machinery/camera/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"kz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + name = "Privacy Shutter"; + id = "nt_rep_priv_2" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/nt_rep) +"kE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"kI" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"kP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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/hallway/primary/fore) +"lr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Fore Hallway Monastary Tube"; + name = "fore camera" + }, +/obj/structure/chair/sofa/bench, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"lw" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/transit_tube/crossing, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"lU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/obj/structure/closet/secure_closet/barber, +/obj/effect/decal/cleanable/dirt, +/obj/item/pushbroom, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"mi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"mU" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"mZ" = ( +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"nc" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ne" = ( +/turf/closed/wall, +/area/space/nearstation) +"nv" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"nA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/sink/directional/east, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/button/door/directional/south{ + id = "maidbay"; + name = "Maid Bay Toggle" + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"nE" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"nF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"nN" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"nS" = ( +/obj/structure/chair/sofa/bench/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera/directional/south, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/primary/fore) +"nW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"oi" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"oR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + name = "Privacy Shutter"; + id = "nt_rep_priv" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/nt_rep) +"oZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/r_wall/rust, +/area/station/command/heads_quarters/nt_rep) +"pf" = ( +/turf/closed/wall, +/area/station/maintenance/fore) +"qg" = ( +/obj/structure/closet/crate, +/obj/item/hand_labeler, +/obj/item/storage/crayons, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"qj" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"qr" = ( +/obj/effect/decal/cleanable/dirt, +/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/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"qM" = ( +/obj/machinery/button/door/directional/north{ + name = "Privacy Shutters Control"; + id = "nt_rep_priv" + }, +/obj/structure/table/wood, +/obj/item/folder/yellow{ + pixel_x = 8; + pixel_y = -1 + }, +/obj/item/folder/red{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/folder/blue{ + pixel_y = 6; + pixel_x = -2 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"qS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/noticeboard/directional/north{ + dir = 2; + name = "Chapel Notice Board" + }, +/obj/machinery/light/directional/north, +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"qU" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/primary/fore) +"rk" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/newscaster/directional/west, +/obj/effect/landmark/start/barber, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"rt" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"rz" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/camera/directional/north, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"rE" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"rL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light_switch/directional/south, +/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, +/area/station/command/heads_quarters/nt_rep) +"rT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"su" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"sz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/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/hallway/primary/fore) +"tg" = ( +/turf/closed/wall/rust, +/area/station/maintenance/fore) +"tx" = ( +/obj/structure/transit_tube/crossing, +/obj/effect/turf_decal/sand/plating, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"tz" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"tU" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"ud" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"uf" = ( +/obj/effect/landmark/start/nanotrasen_consultant, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"uj" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"uI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"uM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/button/curtain{ + id = "barbershopcurtains1"; + pixel_x = -25; + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"uX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/structure/chair/sofa/bench, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"vp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"vs" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/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/airless, +/area/space/nearstation) +"vE" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/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/airless, +/area/space/nearstation) +"vJ" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"vS" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/camera_film{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/item/camera_film, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"vV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"wh" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wF" = ( +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wK" = ( +/obj/machinery/door/airlock/public{ + name = "Massage Parlour" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/barber) +"wL" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Ferry Dock" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear, +/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/hallway/primary/fore) +"wQ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Barbershop" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/barber) +"wT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"xV" = ( +/turf/closed/wall/r_wall/rust, +/area/station/command/heads_quarters/nt_rep) +"yd" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron/dark/corner, +/area/station/hallway/primary/fore) +"yC" = ( +/turf/closed/wall/rust, +/area/station/service/barber) +"yM" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"zb" = ( +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/nt_rep) +"ze" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"zf" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/space/basic, +/area/space/nearstation) +"zu" = ( +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"zF" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/item/pen/fountain, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"zR" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth/fancy/mechanical{ + id = "barbershopcurtains1"; + name = "Massage Parlour Drapes" + }, +/turf/open/floor/plating, +/area/station/service/barber) +"zZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/station/hallway/primary/fore) +"Ag" = ( +/turf/closed/wall/rust, +/area/station/maintenance/fore/lesser) +"AB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"Be" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/bed/pod, +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"Bs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/camera/directional/east{ + c_tag = "NT Consultant's Office"; + name = "command camera" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"Bx" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/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/fore) +"BU" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/landmark/start/barber, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"BZ" = ( +/obj/structure/transit_tube/diagonal/crossing/topleft, +/turf/open/space/basic, +/area/space/nearstation) +"Ce" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"Cf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"Cm" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"Da" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Dh" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/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/fore) +"Dl" = ( +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"Dp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"DC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Salon Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"DJ" = ( +/turf/closed/wall/rust, +/area/station/command/heads_quarters/nt_rep) +"Ef" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"Eg" = ( +/turf/closed/wall, +/area/station/hallway/primary/fore) +"Eh" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"Ek" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/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/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"En" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Ferry Dock" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Ev" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/nanotrasen_consultant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"EG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"EI" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"EO" = ( +/obj/structure/transit_tube/curved/flipped, +/turf/open/space/basic, +/area/space/nearstation) +"EP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"EX" = ( +/obj/structure/table/wood, +/obj/item/stamp{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/stamp/denied{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/stamp/centcom{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"Fg" = ( +/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/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"Fi" = ( +/turf/closed/wall, +/area/station/service/barber) +"Fl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/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/fore) +"Fz" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"FM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"FQ" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"FU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"Gh" = ( +/turf/open/space/basic, +/area/space) +"Gw" = ( +/obj/structure/chair/sofa/bench/left, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"GN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/burnt_floor, +/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/fore) +"GU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"GX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"Ho" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"HJ" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/noticeboard/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"HV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/hairbrush{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/clothing/gloves/latex, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"HW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/fore) +"Ia" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"Ib" = ( +/turf/closed/wall, +/area/station/maintenance/fore/lesser) +"Iv" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"IX" = ( +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_y = 5; + pixel_x = 5 + }, +/obj/item/camera{ + pixel_x = -4 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"Ja" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"Jl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"Jm" = ( +/obj/structure/cable, +/obj/machinery/status_display/ai/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"Jn" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Jq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/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/fore) +"JP" = ( +/obj/machinery/camera/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"KA" = ( +/obj/machinery/photocopier, +/obj/machinery/button/door/directional/north{ + id = "nt_rep_priv_2"; + name = "Privacy Shutters Control" + }, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"KE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"KL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"Lw" = ( +/obj/structure/transit_tube/diagonal/topleft, +/turf/open/space/basic, +/area/space/nearstation) +"LI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Me" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"Mt" = ( +/turf/closed/wall/rust, +/area/station/hallway/primary/fore) +"Mu" = ( +/obj/structure/flora/rock/pile/style_2, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"Mw" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) +"MG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"MO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/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/plating, +/area/station/hallway/primary/fore) +"MP" = ( +/turf/closed/wall/rust, +/area/space/nearstation) +"Ng" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"Nu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"NU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"Op" = ( +/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"Oq" = ( +/obj/docking_port/stationary{ + dheight = 3; + dir = 8; + dwidth = 8; + height = 11; + shuttle_id = "ferry_home"; + name = "Port Bay 2"; + width = 20 + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"Oy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"OJ" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"OO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/hallway/primary/fore) +"OR" = ( +/obj/machinery/modular_computer/preset/command{ + dir = 4 + }, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) +"OY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"Pd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"Po" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/dropper, +/obj/item/hairbrush/comb{ + pixel_y = 10 + }, +/obj/machinery/button/curtain{ + id = "barbershopcurtains"; + pixel_x = 10; + pixel_y = -26 + }, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"Pt" = ( +/obj/structure/fans/tiny/forcefield{ + dir = 1 + }, +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/machinery/door/poddoor/preopen{ + name = "Dock Shutter" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"Pw" = ( +/obj/structure/transit_tube, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"PD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"Qy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"Re" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 8 + }, +/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/cafeteria, +/area/station/service/barber) +"Rf" = ( +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Rj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Ry" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/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/hallway/primary/fore) +"RA" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) +"Sa" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"Sg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"SC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/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/service/barber) +"SH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"Th" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"TD" = ( +/obj/structure/transit_tube, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/grimy, +/area/station/hallway/primary/fore) +"TG" = ( +/obj/effect/turf_decal/stripes/line, +/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/fore) +"TS" = ( +/turf/template_noop, +/area/template_noop) +"TU" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/razor{ + pixel_x = -6 + }, +/obj/item/reagent_containers/spray/barbers_aid{ + pixel_x = 6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"Uc" = ( +/obj/structure/transit_tube/diagonal/topleft, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"Ul" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/food/pie_smudge, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"Um" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) +"Uw" = ( +/turf/open/floor/iron/dark, +/area/station/hallway/primary/fore) +"UZ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + 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/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"Vp" = ( +/obj/structure/chair/comfy/barber_chair, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"VG" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"Wi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"WA" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth/fancy/mechanical{ + id = "barbershopcurtains"; + name = "Barber Shop Drapes" + }, +/turf/open/floor/plating, +/area/station/service/barber) +"WE" = ( +/obj/machinery/door/airlock/corporate{ + name = "NT Consultant's Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/cent_com/rep_door, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/command/heads_quarters/nt_rep) +"WY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/landmark/start/barber, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"Xo" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/hallway/primary/fore) +"Xp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"XI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"XJ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/spawner/random/structure/crate, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"XL" = ( +/turf/closed/mineral/random/labormineral, +/area/space/nearstation) +"XP" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"Yl" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/mirror/directional/south, +/obj/item/lipstick/random{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/item/lipstick/random, +/obj/item/reagent_containers/spray/quantum_hair_dye{ + pixel_x = 9 + }, +/turf/open/floor/iron/dark, +/area/station/service/barber) +"YD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) +"YS" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"Zb" = ( +/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/nt_rep) +"Ze" = ( +/obj/structure/transit_tube/crossing, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"Zv" = ( +/obj/structure/disposalpipe/segment, +/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/fore) +"ZN" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/nt_rep) + +(1,1,1) = {" +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +jY +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +BZ +dZ +Gh +Gh +Gh +Gh +Dl +Dl +vs +XL +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(2,1,1) = {" +XL +Gh +Gh +Gh +Gh +Dl +Dl +Gh +Gh +Gh +nN +nN +nN +nN +nN +nN +Gh +Gh +Gh +Gh +Gh +Gh +ad +dZ +dZ +dZ +dZ +dZ +XP +gW +vE +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(3,1,1) = {" +XL +Dl +Gh +Gh +Dl +Dl +Dl +Dl +Gh +nN +nN +rE +wh +kh +rE +nN +nN +Gh +Gh +Gh +Gh +Gh +Gh +Lw +Dl +Dl +Dl +Dl +Dl +Dl +hj +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(4,1,1) = {" +XL +Dl +Dl +Gh +Mu +Dl +Dl +Dl +Dl +nN +Uw +Rj +jK +jK +cc +Uw +nN +Dl +Dl +Dl +Dl +Gh +Dl +Dl +hS +Dl +Dl +Dl +Dl +Dl +hj +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(5,1,1) = {" +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +nN +nN +jK +bV +mU +gy +Sa +jV +nN +nN +Dl +Mu +Dl +Dl +Dl +Dl +Dl +Uc +Dl +Dl +Dl +XL +hj +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(6,1,1) = {" +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Eg +rz +jK +LI +Uw +jK +ud +Uw +tU +Eg +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Uc +Dl +Gh +Gh +yM +OJ +YS +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(7,1,1) = {" +Dl +Dl +Mt +Mt +Eg +nN +nN +nN +Eg +jS +qj +Rf +Jn +jC +nE +Da +hs +Mt +Mt +nN +nN +nN +Eg +Eg +nN +Eg +Gh +bH +dZ +dZ +dZ +fR +hj +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(8,1,1) = {" +Gh +Gh +Eg +ku +cf +EP +nW +MG +nW +nW +wF +rT +wF +wF +XI +nW +nW +jV +fc +fF +kI +wF +fr +EP +nW +nN +Gh +dZ +Lw +Gh +Gh +dZ +hj +TS +TS +TS +TS +TS +TS +TS +TS +TS +"} +(9,1,1) = {" +Gh +Gh +Eg +Ef +AB +Jl +Jl +Fl +Fl +Fl +sz +sz +Fl +Fl +Fl +sz +sz +Fl +Fl +Fl +Fl +Fl +Fl +Dh +MG +nN +Gh +dZ +dZ +Lw +Gh +XP +yM +OJ +OJ +OJ +OJ +nc +fA +RA +TS +TS +"} +(10,1,1) = {" +Gh +Gh +Pt +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +HW +iD +nN +Gh +Gh +dZ +dZ +EO +Ze +Pw +Pw +Ze +Pw +Pw +tx +lw +jJ +dV +TD +"} +(11,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +HW +hd +Eg +dZ +dZ +dZ +dZ +dZ +XP +tz +Dl +Dl +Dl +Dl +hg +rt +gH +Fz +zZ +"} +(12,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +HW +JP +Eg +Gh +Gh +dZ +Gh +dZ +dZ +Fi +Fi +yC +Fi +Fi +yC +Ib +bb +Ag +ha +"} +(13,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +Wi +kE +nN +Gh +Gh +Fi +yC +Fi +yC +yC +lU +EI +vJ +rk +Po +Ib +vp +Ib +qS +"} +(14,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +MO +nW +nN +Gh +Gh +yC +Be +uM +Ho +yC +ey +Mw +dC +Vp +Yl +Ib +iv +Ag +uX +"} +(15,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +gw +nW +nN +Gh +Gh +yC +HV +WY +SC +wK +FU +Re +Re +BU +TU +Ib +GU +Ib +lr +"} +(16,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +gw +HJ +Eg +nN +nN +Fi +zR +zR +zR +Fi +WA +WA +wQ +WA +WA +Ag +iy +Ib +Gw +"} +(17,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +Oq +jV +jV +jV +jV +jV +jV +jV +jV +HW +FQ +En +gv +Oy +En +gv +GX +GX +Pd +GX +GX +Fg +nF +nF +nF +Eh +DC +Ce +"} +(18,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +gw +TG +wL +gx +NU +wL +UZ +fb +Bx +Zv +Zv +Xo +su +su +FM +su +dY +bj +oi +"} +(19,1,1) = {" +Gh +Gh +iM +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +gw +ze +Eg +nN +nN +Eg +Eg +Eg +OO +wF +qU +zb +oR +oR +WE +oZ +GN +pf +tg +"} +(20,1,1) = {" +Gh +Gh +cW +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +jV +gw +VG +nN +Dl +Dl +Dl +Dl +Mt +gk +wF +yd +xV +qM +vS +rL +zb +bB +pf +qg +"} +(21,1,1) = {" +Gh +Gh +Eg +Iv +iV +Sg +Sg +Qy +Qy +Qy +kP +Jq +kP +kP +kP +kP +Jq +Jq +Jq +KE +Jq +Jq +Jq +Ry +wF +nN +Dl +Dl +Dl +Um +Mt +df +ds +nS +zb +IX +uf +Jm +xV +fT +pf +pf +"} +(22,1,1) = {" +Gh +Gh +Eg +dG +nW +nW +Th +an +kE +nW +Ia +Op +wF +wF +wF +wF +nv +Dp +nW +nW +kE +wF +Op +Xp +wF +nN +Dl +Dl +Dl +Dl +Eg +Mt +xV +kz +xV +Ng +wT +fx +zb +Ek +Ja +qr +"} +(23,1,1) = {" +Gh +Gh +Mt +nN +nN +nN +Eg +Mt +nN +nN +nN +Eg +Eg +nN +nN +nN +Eg +Eg +nN +nN +nN +Eg +Eg +nN +nN +Mt +Dl +Dl +Gh +XL +XL +XL +xV +KA +OR +ZN +gX +Zb +zb +XJ +OY +KL +"} +(24,1,1) = {" +Gh +Gh +Gh +Gh +Gh +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Cm +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Gh +Gh +XL +XL +XL +zb +ca +Ev +EX +EG +Cf +xV +ew +eZ +pf +"} +(25,1,1) = {" +Gh +Gh +Gh +Gh +Gh +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Dl +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +jY +Gh +XL +XL +DJ +cX +mZ +zF +SH +YD +zb +jA +PD +nA +"} +(26,1,1) = {" +Gh +Gh +Gh +Gh +Dl +Dl +Dl +Um +XL +XL +Dl +Dl +Dl +Dl +Dl +Dl +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +Gh +XL +zb +cm +aK +zu +Bs +YD +zb +eL +Nu +vV +"} +(27,1,1) = {" +Gh +Gh +Gh +Gh +Dl +Dl +XL +XL +XL +MP +mi +fR +XL +Dl +Um +XL +fR +dZ +uj +Me +Me +Me +dZ +fR +dZ +uj +Me +Me +Me +Me +zf +ne +xV +zb +zb +zb +zb +zb +xV +eQ +Ul +uI +"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_supermatter.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_supermatter.dmm new file mode 100644 index 00000000000..51cc94c662a --- /dev/null +++ b/_maps/skyrat/automapper/templates/kilostation/kilostation_supermatter.dmm @@ -0,0 +1,51 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"d" = ( +/obj/machinery/button/delam_scram, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room) +"g" = ( +/obj/effect/turf_decal/stripes/red/box, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"R" = ( +/obj/effect/turf_decal/stripes/red/box, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) +"X" = ( +/obj/structure/sign/delam_procedure/directional/south, +/turf/template_noop, +/area/template_noop) +"Y" = ( +/obj/machinery/atmospherics/components/unary/delam_scram/directional/north{ + pixel_y = 12 + }, +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +a +a +Y +"} +(2,1,1) = {" +R +d +g +X +a +a +a +a +"} diff --git a/_maps/skyrat/automapper/templates/northstar/northstar_prison.dmm b/_maps/skyrat/automapper/templates/northstar/northstar_prison.dmm deleted file mode 100644 index 403bebf29b0..00000000000 --- a/_maps/skyrat/automapper/templates/northstar/northstar_prison.dmm +++ /dev/null @@ -1,23 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/machinery/cryopod/prison/directional/west{ - quiet = 1 - }, -/turf/template_noop, -/area/template_noop) -"r" = ( -/obj/machinery/cryopod/prison/directional/north, -/turf/template_noop, -/area/template_noop) -"P" = ( -/turf/template_noop, -/area/template_noop) - -(1,1,1) = {" -r -P -P -P -P -a -"} diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 672cc444fbd..cc2abc8c5d9 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -5791,9 +5791,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"ZF" = ( -/turf/closed/wall/mineral/plastitanium/nosmooth, -/area/shuttle/sbc_starfury) "ZK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5974,7 +5971,7 @@ cH ow ae ae -ZF +ac aa aa aa @@ -6110,7 +6107,7 @@ cH Zl ae ae -ZF +ac aa aa aa @@ -8014,7 +8011,7 @@ cH vC ae ae -ZF +ac aa aa aa @@ -8150,7 +8147,7 @@ cH xI ae ae -ZF +ac aa aa aa diff --git a/_maps/templates/medium_shuttle4.dmm b/_maps/templates/medium_shuttle4.dmm index 0071a71a1e9..67a5617da6b 100644 --- a/_maps/templates/medium_shuttle4.dmm +++ b/_maps/templates/medium_shuttle4.dmm @@ -54,7 +54,7 @@ /turf/open/floor/oldshuttle, /area/ruin/powered/shuttle/medium_4) "r" = ( -/obj/machinery/power/generator, +/obj/machinery/power/thermoelectric_generator, /turf/open/floor/oldshuttle, /area/ruin/powered/shuttle/medium_4) "s" = ( diff --git a/_maps/virtual_domains/clown_planet.dmm b/_maps/virtual_domains/clown_planet.dmm index fe259ffea48..72cc1280b63 100644 --- a/_maps/virtual_domains/clown_planet.dmm +++ b/_maps/virtual_domains/clown_planet.dmm @@ -761,7 +761,7 @@ /area/virtual_domain) "WT" = ( /obj/machinery/door/airlock/bananium, -/turf/open/indestructible/honk, +/turf/open/floor/carpet, /area/virtual_domain) "WX" = ( /turf/open/indestructible/white, diff --git a/_maps/virtual_domains/skyrat_ancientmilsim.dmm b/_maps/virtual_domains/skyrat_ancientmilsim.dmm index 86a71a32584..6267a336445 100644 --- a/_maps/virtual_domains/skyrat_ancientmilsim.dmm +++ b/_maps/virtual_domains/skyrat_ancientmilsim.dmm @@ -2,110 +2,125 @@ "al" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) -"aB" = ( -/obj/structure/flora/bush/ferny/style_random, -/obj/structure/railing, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) +"aE" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/janitor) "aG" = ( /obj/machinery/door/poddoor/preopen{ id = "cin_place" }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"aO" = ( +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/janitor) "aP" = ( /obj/structure/trash_pile, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "aR" = ( /obj/structure/closet/crate/secure, /obj/item/keycard/blue, /obj/machinery/light/small/dim/directional/north, /obj/item/construction/rld/mini, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "ba" = ( /obj/machinery/light/directional/east, /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/smooth_corner{ dir = 8 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "bd" = ( /obj/machinery/power/shuttle_engine/propulsion, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/safehouse) "bm" = ( /obj/machinery/light/floor, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "bw" = ( /obj/item/storage/box/utensils, /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "bB" = ( /obj/structure/inflatable{ color = "#556B2F"; opacity = 1 }, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "bM" = ( /obj/item/stack/rods, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "bN" = ( /obj/structure/railing/corner/end/flip, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "cb" = ( /obj/structure/railing/corner{ dir = 1 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "co" = ( /obj/item/pen/fourcolor, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "cp" = ( /obj/structure/decorative/shelf/soda_milk{ density = 1 }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) +"cx" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_cave) "cF" = ( -/obj/item/gun/ballistic/shotgun/automatic/combat/compact, +/obj/structure/sign/poster/random/directional/west, +/obj/structure/rack/gunrack, +/obj/item/gun/ballistic/automatic/wylom, +/obj/item/gun/ballistic/automatic/miecz, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "cV" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "dd" = ( /turf/closed/wall/r_wall, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "dh" = ( /obj/machinery/light/small/dim/directional/south, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "dC" = ( /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "dH" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "ea" = ( /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "ec" = ( /obj/effect/spawner/random/trash/mopbucket, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"ed" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/obj/machinery/door/poddoor/ancient_milsim{ + id = "engagement_control" + }, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/snpc_ground) "eh" = ( /obj/structure/flippedtable{ dir = 8 @@ -113,97 +128,110 @@ /obj/structure/flippedtable, /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "ek" = ( /obj/item/grenade/smokebomb, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "er" = ( /turf/closed/indestructible/rock, /area/virtual_domain) "et" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/mob_spawn/ghost_role/human/ancient_milsim, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "eC" = ( /obj/effect/landmark/bitrunning/mob_segment, /obj/structure/chair/stool/directional/south, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "eE" = ( /obj/effect/spawner/random/trash/box, /obj/machinery/light/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"eF" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_garage) "eQ" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/machinery/door/poddoor/ancient_milsim{ id = "engagement_control" }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "eR" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "fk" = ( /obj/machinery/light/floor, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "ft" = ( /obj/machinery/door/airlock/multi_tile/glass, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "fu" = ( /obj/machinery/door/airlock/multi_tile/metal{ dir = 8 }, /turf/open/floor/iron, -/area/virtual_domain) -"fF" = ( -/obj/structure/railing, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"fJ" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/indestructible/reinforced, +/area/virtual_domain/ancient_milsim/snpc_reward) "gb" = ( /obj/item/keycard/yellow, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"go" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/janitor) +"gE" = ( +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_garage) "gL" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/clf3, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) +"gP" = ( +/obj/item/storage/medkit/civil_defense/stocked, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/maintenance) "hj" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "ho" = ( /obj/structure/railing{ dir = 4 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "hp" = ( /turf/open/floor/iron/smooth_corner{ dir = 8 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "hy" = ( /obj/machinery/door/poddoor/ancient_milsim{ id = "engagement_control" }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "hH" = ( /obj/structure/table, /obj/item/storage/box/utensils, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "hJ" = ( /obj/structure/table_frame, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "hO" = ( /obj/machinery/conveyor/auto{ dir = 4; @@ -212,177 +240,206 @@ /obj/machinery/door/window, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) +"hZ" = ( +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/entrance) "ie" = ( /obj/item/paper/crumpled, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "im" = ( /obj/item/grown/log, /obj/item/grown/log, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"iq" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/medbay) "ir" = ( /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "iw" = ( /obj/item/paper, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "iz" = ( /obj/structure/table, /obj/item/storage/medkit/tactical/premium, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "iI" = ( /obj/machinery/dryer{ pixel_y = -26 }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) +"iO" = ( +/obj/machinery/door/airlock/multi_tile/glass, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/atrium) "iU" = ( /obj/item/paper_bin, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "iW" = ( /obj/structure/chair{ dir = 1 }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"iZ" = ( +/turf/open/misc/dirt/planet, +/area/virtual_domain/ancient_milsim/snpc_garage) "jc" = ( /obj/structure/table, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"jn" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/loot_camp) "jS" = ( /obj/structure/chair/sofa/corp/left{ dir = 4 }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "jV" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "ka" = ( /obj/machinery/door/airlock/public, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) "ke" = ( /obj/item/storage/toolbox/syndicate, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "kh" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "ki" = ( /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "kv" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "kC" = ( /obj/effect/spawner/random/trash/food_packaging, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "kJ" = ( /obj/structure/chair/stool/directional/west, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "kL" = ( /obj/structure/table, /obj/item/reagent_containers/cup/glass/bottle/champagne, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_reward) "kS" = ( /obj/structure/sign/flag/terragov/directional/south, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/entrance) "kT" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "kX" = ( /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "lc" = ( /obj/item/storage/toolbox/mechanical, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "lf" = ( /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "lr" = ( /obj/structure/chair{ dir = 4 }, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) +"ls" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_cave) "lt" = ( /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"lu" = ( +/obj/machinery/door/poddoor/ancient_milsim{ + id = "engagement_control" + }, +/turf/open/misc/dirt/planet, +/area/virtual_domain/ancient_milsim/entrance) "ly" = ( /obj/machinery/light/directional/south, /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth_corner{ dir = 4 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "lz" = ( /obj/machinery/door/airlock/multi_tile/glass, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "lE" = ( /turf/template_noop, /area/virtual_domain/safehouse) "lG" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "lX" = ( /obj/structure/table/optable, /obj/item/surgical_processor, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "mi" = ( /obj/effect/mob_spawn/corpse/human/cin_soldier, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "mu" = ( -/obj/item/knife/combat/survival, -/obj/structure/table, -/turf/open/floor/iron, -/area/virtual_domain) +/obj/item/knife/combat, +/obj/structure/table/wood, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "mZ" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "ne" = ( /obj/structure/toilet, /obj/machinery/light/small/dim/directional/north, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) "no" = ( /obj/effect/spawner/structure/window/survival_pod, /obj/machinery/door/poddoor/shutters/preopen, /obj/effect/mapping_helpers/damaged_window, /turf/open/floor/iron/dark/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "nu" = ( -/obj/machinery/door/poddoor/ancient_milsim{ - id = "engagement_control" - }, -/turf/closed/mineral/ash_rock, -/area/virtual_domain) +/turf/template_noop, +/area/template_noop) "nw" = ( /obj/effect/spawner/random/trash/box, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"nA" = ( +/obj/machinery/door/poddoor/ancient_milsim{ + id = "engagement_control" + }, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/entrance) "nH" = ( /obj/item/storage/barricade, /obj/structure/closet/crate/cardboard, @@ -392,16 +449,16 @@ id = "cin_place" }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "nM" = ( /obj/item/storage/box/utensils, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "nQ" = ( /obj/machinery/light/floor, /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "nZ" = ( /obj/structure/closet/crate/secure/weapon, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, @@ -409,25 +466,38 @@ /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/storage/toolbox/ammobox/full/mosin, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "ob" = ( /obj/effect/spawner/random/vending/snackvend, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "oe" = ( /obj/machinery/light/directional/west, /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/smooth_corner, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) +"oj" = ( +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/maintenance) +"ol" = ( +/turf/open/floor/iron/dark, +/area/virtual_domain/ancient_milsim/carrier) +"or" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_bar) "ot" = ( /obj/item/paper, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "oz" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"oJ" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_toilet) "oU" = ( /obj/structure/chair/comfy/shuttle, /obj/machinery/computer{ @@ -441,106 +511,132 @@ pixel_y = -32 }, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "pn" = ( /obj/structure/fluff/fokoff_sign, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "pN" = ( /obj/machinery/iv_drip/health_station/directional/south, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "pY" = ( /obj/item/ammo_box/c35sol, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "qn" = ( /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "qp" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/virtual_domain) +/area/virtual_domain/safehouse) +"qr" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/atrium) "qs" = ( /obj/machinery/light/directional/south, /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth_corner{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "qA" = ( /obj/structure/fence{ dir = 4 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"qB" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/maintenance) +"qC" = ( +/obj/structure/flora/bush/ferny/style_random, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/loot_camp) "qV" = ( /obj/machinery/vending/medical, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "rb" = ( /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "rl" = ( /obj/structure/table, /obj/machinery/light/cold/directional/south, /obj/item/tape/ruins/ancient_milsim/devlog_two, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "rx" = ( /obj/machinery/iv_drip, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "rB" = ( /obj/effect/spawner/structure/window/reinforced/no_firelock, /obj/machinery/door/poddoor/preopen{ id = "cin_place" }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) +"rO" = ( +/obj/structure/rack/shelf, +/obj/item/gun/ballistic/revolver/shotgun_revolver, +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_hallway) "rT" = ( /obj/effect/spawner/structure/window/reinforced/no_firelock, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "sa" = ( /obj/machinery/door/puzzle/keycard/blue_required, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_exit) "ss" = ( /obj/machinery/light/floor, /obj/structure/table, -/obj/item/ammo_box/c40sol/pierce, -/obj/item/ammo_box/c40sol/pierce, +/obj/item/ammo_box/c310_cargo_box/piercing, +/obj/item/ammo_box/c310_cargo_box/piercing, /turf/open/floor/iron/dark, -/area/virtual_domain) -"sD" = ( -/obj/item/pickaxe/drill/compact, -/turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"sG" = ( +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/snpc_reward) "sS" = ( /obj/item/grown/log, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "sV" = ( /obj/item/stack/sheet/mineral/sandbags/fifty, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"sX" = ( +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_cafe) "td" = ( /obj/item/storage/box/utensils, -/obj/structure/table, -/turf/open/floor/iron, -/area/virtual_domain) +/obj/structure/table/wood, +/obj/item/ammo_box/c310_cargo_box/piercing{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/ammo_box/c27_54cesarzowa/rubber{ + pixel_x = 12 + }, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "te" = ( /obj/structure/chair{ dir = 1 }, /obj/structure/sign/flag/nri/directional/east, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "tg" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "th" = ( /obj/machinery/recycler/deathtrap{ dir = 8 @@ -550,45 +646,56 @@ id = "sol_invasion" }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "tA" = ( /obj/item/surgery_tray/full/deployed, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "tH" = ( /obj/item/ammo_box/c35sol, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "tI" = ( /obj/effect/spawner/random/trash/garbage, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"tU" = ( +/obj/structure/fluff/fokoff_sign, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/loot_camp) "ue" = ( /obj/machinery/biogenerator/food_replicator{ biomass = 1500 }, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "uf" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 }, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "uq" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "uy" = ( /obj/structure/sign/departments/science/alt/directional/north, /obj/structure/sign/flag/nri/directional/north, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/entrance) +"uz" = ( +/turf/closed/indestructible/reinforced, +/area/virtual_domain/ancient_milsim/snpc_exit) +"uC" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_garage) "uE" = ( /obj/effect/spawner/random/trash/caution_sign, /obj/machinery/light/broken/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "uM" = ( /obj/item/minespawner/ancient_milsim, /obj/item/minespawner/ancient_milsim, @@ -602,45 +709,43 @@ /obj/item/minespawner/ancient_milsim, /obj/item/minespawner/ancient_milsim, /turf/open/floor/iron, -/area/virtual_domain) -"uQ" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/railing, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "uY" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "uZ" = ( /obj/effect/spawner/random/vending/colavend, /obj/machinery/light/directional/west, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) +"va" = ( +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/hallway) "vd" = ( /obj/structure/chair/office, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "vf" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/iv_drip/health_station/directional/west, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "vr" = ( /obj/item/storage/backpack/duffelbag/syndie/c4, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "vs" = ( /obj/machinery/light/small/dim/directional/west, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "vu" = ( /obj/item/storage/backpack/duffelbag/syndie/c4, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "vz" = ( /obj/structure/flippedtable{ dir = 4 @@ -648,158 +753,196 @@ /obj/structure/flippedtable, /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "vA" = ( /obj/structure/closet/crate/trashcart/filled, /obj/item/flamethrower/full/tank, +/obj/item/storage/medkit/civil_defense/stocked, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "vL" = ( /obj/structure/fence, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "wh" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/cleaner, /obj/item/grenade/chem_grenade/cleaner, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "wr" = ( -/obj/item/deployable_turret_folded, +/obj/structure/rack/shelf, +/obj/item/ammo_box/magazine/wylom{ + pixel_y = 4; + pixel_x = -8 + }, +/obj/item/ammo_box/magazine/wylom{ + pixel_y = 4; + pixel_x = 4 + }, +/obj/item/ammo_box/magazine/miecz{ + pixel_x = -5; + pixel_y = -9 + }, +/obj/item/ammo_box/magazine/miecz{ + pixel_y = -9 + }, +/obj/item/ammo_box/magazine/miecz{ + pixel_x = 5; + pixel_y = -9 + }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) +"ws" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/template_noop, +/area/virtual_domain/safehouse) "wv" = ( /obj/item/tape/ruins/ancient_milsim/devlog_three, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "wx" = ( /turf/open/floor/iron/smooth_corner{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "wy" = ( -/obj/item/ammo_box/c980grenade/shrapnel, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/lanca, +/obj/item/gun/ballistic/automatic/lanca{ + pixel_y = 6; + pixel_x = 7 + }, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "wz" = ( /obj/structure/flora/tree/stump, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "wQ" = ( /obj/effect/spawner/random/trash/mess, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "wZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "xa" = ( /obj/structure/closet/crate/freezer/blood, +/obj/item/storage/medkit/civil_defense/stocked, +/obj/item/storage/medkit/frontier/stocked, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "xe" = ( /obj/effect/spawner/random/trash/mopbucket, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "xB" = ( /obj/effect/spawner/random/trash/garbage, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) -"xI" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "xS" = ( /obj/structure/railing{ dir = 1 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "yd" = ( /obj/item/inflatable/torn, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"yh" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/maintenance) "yl" = ( /obj/structure/decorative/shelf/alcohol_assortment{ density = 1 }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "yn" = ( /obj/effect/spawner/random/trash/bin, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "yt" = ( /obj/item/chair, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "yI" = ( /obj/structure/fence/cut/large{ dir = 4; density = 0 }, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "yV" = ( /obj/machinery/vending/cigarette, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "zf" = ( /obj/effect/spawner/random/trash/bucket, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "zp" = ( /obj/machinery/door/puzzle/keycard/yellow_required, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_reward) "zx" = ( /obj/machinery/light/small/dim/directional/north, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "zE" = ( /obj/machinery/vending/drugs, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "zL" = ( /obj/machinery/light/small/dim/directional/south, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "Ab" = ( /obj/structure/table, /obj/item/folder/documents, +/obj/item/binoculars, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"Aw" = ( +/obj/machinery/door/poddoor/ancient_milsim{ + id = "engagement_control" + }, +/turf/open/water/jungle, +/area/virtual_domain/ancient_milsim/snpc_ground) "AB" = ( /obj/structure/chair{ dir = 8 }, /obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "AC" = ( /obj/structure/closet/crate/trashcart/filled, /obj/item/ammo_box/c35sol, /obj/item/ammo_box/c35sol, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "AE" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) +"AH" = ( +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_toilet) "AN" = ( /obj/structure/bedsheetbin, -/obj/structure/table, -/turf/open/floor/iron, -/area/virtual_domain) +/obj/structure/table/wood, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "AR" = ( /obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "AW" = ( /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_exit) "AY" = ( /obj/machinery/conveyor/auto{ dir = 4; @@ -807,45 +950,55 @@ }, /obj/machinery/door/window, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "Bd" = ( /obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "Bg" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) +"Bs" = ( +/turf/open/misc/dirt/planet, +/area/virtual_domain/ancient_milsim/snpc_cafe) "BO" = ( /obj/effect/spawner/random/trash/hobo_squat, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Cd" = ( /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "Cf" = ( /obj/machinery/door/airlock/multi_tile/metal{ dir = 4 }, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) +"Cg" = ( +/obj/item/storage/medkit/frontier/stocked, +/turf/open/floor/iron/white, +/area/virtual_domain/ancient_milsim/medbay) "Cr" = ( /obj/structure/chair/office/light{ dir = 4 }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "Cs" = ( /obj/structure/railing{ dir = 9 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) +"CC" = ( +/turf/open/floor/iron/smooth, +/area/virtual_domain/ancient_milsim/atrium) "CH" = ( /obj/structure/flippedtable, /obj/structure/closet/crate/freezer/blood, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "CJ" = ( /obj/structure/chair/sofa/corp/right{ dir = 8 @@ -853,91 +1006,104 @@ /turf/open/floor/iron/smooth_half{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "CR" = ( -/obj/item/ammo_box/advanced/s12gauge/flechette, -/obj/item/ammo_box/advanced/s12gauge/flechette, +/obj/structure/rack/shelf, +/obj/item/ammo_box/advanced/s12gauge/incendiary{ + pixel_x = -4; + pixel_y = -9 + }, +/obj/item/ammo_box/advanced/s12gauge/flechette{ + pixel_x = -4; + pixel_y = 9 + }, +/obj/item/ammo_box/advanced/s12gauge{ + pixel_x = 6 + }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "CT" = ( /obj/structure/table, /obj/machinery/iv_drip/health_station/directional/north, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "CV" = ( /obj/structure/flippedtable, /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Dd" = ( /obj/structure/closet/crate/trashcart/filled, /obj/item/ammo_box/c35sol, /obj/item/ammo_box/c35sol, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "De" = ( /obj/effect/spawner/random/trash/bin, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "Dk" = ( /obj/machinery/biogenerator/food_replicator{ biomass = 1500 }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "Do" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/trophy/gold_cup, +/obj/machinery/light/small/dim/directional/north, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_exit) "Dt" = ( -/obj/item/gun/ballistic/automatic/sol_grenade_launcher/evil/no_mag, +/obj/item/gun/ballistic/automatic/wylom, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Dy" = ( /obj/structure/sink/directional/north, /obj/structure/mirror/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) +"DE" = ( +/turf/open/misc/dirt/planet, +/area/virtual_domain/safehouse) "DL" = ( -/obj/item/ammo_box/c980grenade/smoke, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/obj/effect/landmark/bitrunning/cache_spawn, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/snpc_reward) "DN" = ( /obj/structure/table, /obj/item/stack/medical/mesh/bloody, /obj/item/stack/medical/mesh/bloody, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "DO" = ( /turf/open/floor/iron/smooth_corner, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "DT" = ( /obj/structure/flora/tree/jungle/style_random, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "DW" = ( /obj/item/storage/box/nri_flares, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "Ee" = ( /obj/structure/railing/corner{ dir = 1 }, /turf/open/water/jungle, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "Eg" = ( /turf/closed/indestructible/reinforced, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_reward) "Eh" = ( /obj/machinery/door/poddoor/shutters/preopen, /turf/open/floor/iron/dark/side, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "Ei" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/iron/smooth_corner, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Ek" = ( /obj/structure/chair/sofa/corp/left{ dir = 4 @@ -945,159 +1111,170 @@ /turf/open/floor/iron/smooth_half{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "El" = ( /obj/item/keycard/yellow, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Ey" = ( -/obj/item/ammo_box/advanced/s12gauge, -/obj/item/ammo_box/advanced/s12gauge, -/turf/open/floor/iron, -/area/virtual_domain) +/obj/structure/closet/crate/freezer/blood, +/obj/item/storage/backpack/duffelbag/deforest_medkit/stocked, +/obj/item/storage/medkit/frontier/stocked, +/turf/open/floor/iron/white, +/area/virtual_domain/ancient_milsim/medbay) "EB" = ( /obj/machinery/door/airlock/survival_pod/glass, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "ED" = ( /obj/structure/closet/crate/secure, /obj/item/keycard/blue, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "EE" = ( /obj/structure/table, /obj/item/food/cake/birthday, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_reward) "EW" = ( /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "Fb" = ( /obj/structure/reagent_dispensers/fueltank/large, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Fc" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "Ff" = ( /obj/effect/spawner/random/trash/bin, /obj/machinery/light/directional/north, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron, -/area/virtual_domain) -"Fk" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/railing{ - dir = 6 +/area/virtual_domain/ancient_milsim/snpc_cafe) +"Fn" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/obj/machinery/door/poddoor/preopen{ + id = "cin_place" }, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/snpc_hallway) "Fq" = ( /obj/structure/chair{ dir = 1 }, /obj/effect/mob_spawn/ghost_role/human/ancient_milsim, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "Fv" = ( /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "FN" = ( -/obj/item/ammo_box/c980grenade/shrapnel/phosphor, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/obj/item/binoculars, +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_garage) "FT" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 }, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "FX" = ( /obj/effect/gibspawner/human, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) +"Gd" = ( +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/snpc_garage) "Gl" = ( /obj/structure/barricade/sandbags, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Go" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "GJ" = ( /obj/structure/railing{ dir = 8 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "GR" = ( /obj/structure/sign/departments/custodian/directional/north, /obj/item/grenade/smokebomb, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "GS" = ( /obj/machinery/conveyor_switch/oneway{ id = "sol_invasion" }, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "Hn" = ( /obj/machinery/camera/directional/north{ status = 0 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "Hq" = ( /obj/structure/flora/tree/jungle/small/style_random, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "HG" = ( /obj/machinery/iv_drip, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "HM" = ( /obj/machinery/vending/wardrobe/bar_wardrobe, /obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/virtual_domain) -"HR" = ( -/obj/structure/railing/corner, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) +"HT" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/atrium) "Ib" = ( /obj/structure/toilet, /obj/machinery/light/small/dim/directional/north, /obj/effect/mob_spawn/ghost_role/human/ancient_milsim, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) "Ir" = ( /obj/machinery/door/airlock/multi_tile/glass, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) "Is" = ( /obj/item/grenade/mirage, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "Iw" = ( /obj/structure/railing{ dir = 5 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "Iy" = ( /obj/effect/spawner/random/trash/caution_sign, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"Iz" = ( +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/atrium) "IH" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth_corner{ dir = 4 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) +"IS" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_cafe) "Jj" = ( /obj/structure/chair/sofa/corp/right{ dir = 4 @@ -1105,15 +1282,23 @@ /turf/open/floor/iron/smooth_half{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) +"Jn" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/iron/smooth, +/area/virtual_domain/ancient_milsim/atrium) +"Jq" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_toilet) "JG" = ( /turf/open/water/jungle, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "JM" = ( /obj/item/chair, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "JU" = ( /obj/modular_map_root/safehouse{ key = "ancient_milsim" @@ -1123,66 +1308,100 @@ "Kf" = ( /obj/effect/spawner/random/trash/bin, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Kl" = ( /obj/structure/sign/departments/medbay/directional/west, /turf/open/floor/iron/smooth, +/area/virtual_domain/ancient_milsim/hallway) +"Ku" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/atrium) +"Kw" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/indestructible/binary, /area/virtual_domain) +"Kx" = ( +/obj/item/storage/box/nri_flares, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "KA" = ( /obj/structure/table/optable, /obj/item/surgical_processor, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "KN" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/smooth_corner{ dir = 4 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Lr" = ( /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) +"LD" = ( +/obj/structure/flora/tree/jungle/small/style_random, +/obj/machinery/door/poddoor/ancient_milsim{ + id = "engagement_control" + }, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/snpc_ground) "LI" = ( /obj/item/paper/crumpled, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) -"Mg" = ( -/turf/closed/mineral/ash_rock, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) +"LP" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_cafe) "Mi" = ( /obj/item/storage/toolbox/ammobox/full/mosin, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "Mo" = ( /obj/machinery/light/floor, /obj/structure/table, /obj/item/megaphone, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"Mq" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/mineral/titanium/survival, +/area/virtual_domain/ancient_milsim/carrier) "Mv" = ( /turf/closed/wall/mineral/titanium/survival, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "My" = ( /obj/structure/table, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Mz" = ( /obj/structure/barricade/sandbags, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"MN" = ( +/turf/open/misc/dirt/planet, +/area/virtual_domain/ancient_milsim/snpc_cave) "MQ" = ( /obj/item/keycard/yellow, /turf/open/floor/plating, -/area/virtual_domain) -"MW" = ( -/obj/item/gun/ballistic/rifle/boltaction/sporterized, -/obj/structure/table, +/area/virtual_domain/ancient_milsim/janitor) +"MU" = ( +/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"MW" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/lanca, +/obj/item/ammo_box/magazine/lanca{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "MY" = ( /obj/effect/landmark/bitrunning/cache_spawn, /turf/open/floor/iron/smooth_large, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_reward) "Nl" = ( /obj/item/minespawner/ancient_milsim, /obj/item/minespawner/ancient_milsim, @@ -1191,22 +1410,43 @@ /obj/item/minespawner/ancient_milsim, /obj/structure/closet/crate/cardboard, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "NA" = ( /obj/structure/sign/poster/random/directional/west, /obj/item/storage/toolbox/maint_kit, +/obj/structure/table/wood, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) +"NJ" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/loot_camp) +"On" = ( /obj/structure/table, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/snpc_reward) +"Ow" = ( +/obj/item/storage/box/nri_flares, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) +"Ox" = ( +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/snpc_bar) "OA" = ( /obj/machinery/sleeper/self_control, /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) +"OG" = ( +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/snpc_exit) "OS" = ( /obj/machinery/vending/boozeomat, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "OV" = ( /obj/machinery/conveyor/auto{ dir = 4; @@ -1214,7 +1454,7 @@ }, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "OZ" = ( /obj/structure/chair/sofa/corp/left{ dir = 8 @@ -1222,70 +1462,105 @@ /turf/open/floor/iron/smooth_half{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Pi" = ( /obj/machinery/photocopier, /turf/open/floor/iron/smooth_corner{ dir = 8 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "Pj" = ( /obj/structure/filingcabinet/chestdrawer/wheeled, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Pw" = ( /obj/effect/spawner/random/vending/snackvend, /obj/machinery/light/directional/west, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) +"PE" = ( +/obj/machinery/door/puzzle/keycard/yellow_required, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/ancient_milsim/snpc_exit) "PJ" = ( /obj/structure/flippedtable, +/obj/item/storage/backpack/duffelbag/deforest_medkit/stocked, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "PM" = ( /obj/effect/spawner/random/trash/bin, /obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) +"PO" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/snpc_cave) "PT" = ( /obj/machinery/power/shuttle_engine/huge, /turf/open/misc/dirt/planet, -/area/virtual_domain) -"Qn" = ( -/obj/item/ammo_box/advanced/s12gauge/pt20, -/obj/item/ammo_box/advanced/s12gauge/pt20, -/turf/open/floor/iron, -/area/virtual_domain) -"Qv" = ( -/obj/structure/flora/bush/ferny/style_random, -/obj/structure/railing{ - dir = 6 +/area/virtual_domain/ancient_milsim/entrance) +"Qb" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/door/poddoor/ancient_milsim{ + id = "engagement_control" }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) -"QF" = ( -/obj/item/ammo_box/c40sol, -/turf/open/floor/plating, -/area/virtual_domain) -"Rk" = ( -/obj/item/surgery_tray/full/deployed, +/area/virtual_domain/ancient_milsim/snpc_ground) +"Qn" = ( +/obj/structure/table, +/obj/item/storage/medkit/civil_defense/stocked{ + pixel_x = 8 + }, +/obj/item/storage/medkit/civil_defense/stocked{ + pixel_x = -8 + }, +/obj/item/storage/medkit/civil_defense/stocked{ + pixel_y = 4 + }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"QF" = ( +/obj/item/ammo_box/magazine/lanca, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/maintenance) +"QP" = ( +/turf/open/misc/dirt/planet, +/area/virtual_domain/ancient_milsim/loot_camp) +"Rk" = ( +/obj/structure/table, +/obj/item/storage/medkit/combat_surgeon/stocked, +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_cafe) "Rl" = ( -/obj/effect/baseturf_helper/virtual_domain, -/turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/obj/item/gun/ballistic/automatic/pistol/plasma_thrower, +/obj/item/ammo_box/magazine/recharge/plasma_battery{ + pixel_x = -3; + pixel_y = -14 + }, +/obj/item/ammo_box/magazine/recharge/plasma_battery{ + pixel_x = 8; + pixel_y = -12 + }, +/turf/open/floor/iron/dark, +/area/virtual_domain/ancient_milsim/carrier) "Rn" = ( /obj/structure/curtain/cloth{ color = "#556B2F" }, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Rq" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) +"Rv" = ( +/obj/effect/landmark/bitrunning/mob_segment, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/maintenance) "RA" = ( /obj/structure/closet/crate/secure/weapon, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, @@ -1294,237 +1569,300 @@ /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "RC" = ( /obj/structure/chair/office/light{ dir = 4 }, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) +"RG" = ( +/obj/structure/table/wood, +/obj/item/knife/combat, +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "RP" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "RU" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 }, /obj/machinery/light/small/dim/directional/west, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "RY" = ( /obj/machinery/door/airlock/multi_tile/glass{ dir = 8 }, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "RZ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/light/small/broken/directional/north, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/carrier) "Sh" = ( /obj/structure/urinal{ pixel_x = 32 }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) +"Sl" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/indestructible/reinforced, +/area/virtual_domain/ancient_milsim/snpc_exit) +"Sv" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/snpc_ground) "SB" = ( /obj/structure/shipping_container/kosmologistika, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "SG" = ( /obj/structure/table, /obj/item/folder/blue, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"Tx" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/medbay) "TB" = ( /obj/structure/fence/door{ dir = 4 }, /turf/open/misc/dirt/planet, -/area/virtual_domain) -"TE" = ( -/obj/item/storage/toolbox/ammobox/full/mosin, +/area/virtual_domain/ancient_milsim/loot_camp) +"TD" = ( +/obj/structure/table, +/obj/machinery/recharger, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) +"TE" = ( +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "TG" = ( /obj/item/grown/log, /obj/item/grown/log, /obj/item/grown/log, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "TP" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "TQ" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "TY" = ( /obj/structure/railing{ dir = 10 }, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "Ue" = ( /obj/structure/closet/crate/cardboard, /obj/item/stack/sheet/mineral/sandbags/fifty, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) "Ug" = ( /obj/machinery/light/small/broken/directional/west, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "Ux" = ( /obj/structure/closet/crate/trashcart/filled, -/obj/item/ammo_box/c40sol, +/obj/item/ammo_box/magazine/lanca, /obj/item/ammo_box/c35sol, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/janitor) "Uz" = ( /turf/closed/indestructible/binary, /area/virtual_domain) "UD" = ( /obj/structure/table, -/obj/item/knife/combat/survival, +/obj/item/knife/combat, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "UQ" = ( /obj/effect/spawner/random/vending/colavend, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "Vi" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Vj" = ( /obj/item/reagent_containers/cup/bottle/thermite, /turf/open/floor/plating, -/area/virtual_domain) -"Vr" = ( -/obj/item/ammo_box/magazine/c980_grenade/starts_empty, +/area/virtual_domain/ancient_milsim/maintenance) +"Vl" = ( /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) +"Vp" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_cafe) +"Vr" = ( +/obj/item/ammo_box/magazine/lanca, +/turf/open/misc/grass/planet/ancient_milsim, +/area/virtual_domain/ancient_milsim/loot_camp) "VA" = ( /turf/open/floor/iron/smooth_corner{ dir = 4 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "VC" = ( /obj/structure/table, /obj/item/stack/medical/suture/bloody, /obj/item/stack/medical/suture/bloody, /turf/open/floor/iron/white, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/medbay) "VO" = ( /obj/machinery/vending/cigarette, /turf/open/floor/iron/smooth_corner{ dir = 1 }, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "VX" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/item/storage/backpack/duffelbag/syndie/c4, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "VZ" = ( -/obj/effect/baseturf_helper/virtual_domain, -/turf/template_noop, -/area/virtual_domain/safehouse) +/turf/open/misc/dirt/planet, +/area/virtual_domain/ancient_milsim/entrance) "Wh" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "Wq" = ( /obj/machinery/door/morgue, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_toilet) "Wr" = ( /obj/structure/flora/bush/ferny/style_random, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_ground) "Wv" = ( /obj/machinery/button/door/indestructible/ancient_milsim{ pixel_y = 24 }, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "Ww" = ( /obj/structure/inflatable, /turf/open/floor/iron/dark, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "WG" = ( /obj/machinery/light/directional/west, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) +"WR" = ( +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, +/turf/closed/wall/r_wall, +/area/virtual_domain/ancient_milsim/hallway) "WY" = ( -/obj/item/gun/ballistic/rifle/boltaction/sporterized, +/obj/item/gun/ballistic/automatic/lanca, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/maintenance) "Xh" = ( -/obj/item/storage/medkit/expeditionary, -/turf/open/floor/iron, -/area/virtual_domain) +/obj/item/ammo_box/c310_cargo_box/piercing, +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/maintenance) "XK" = ( /obj/effect/spawner/random/trash/bin, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "XS" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/smooth_half, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/atrium) "XU" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/smooth, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/hallway) +"XV" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/virtual_domain/ancient_milsim/snpc_garage) "XZ" = ( /obj/machinery/light/small/broken/directional/south, /turf/open/floor/plating, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cave) "Yd" = ( /obj/structure/chair{ dir = 1 }, /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_cafe) "Yx" = ( /obj/structure/sign/departments/science/directional/north, /obj/structure/sign/flag/nri/directional/north, +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim, /turf/open/misc/grass/planet/ancient_milsim, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/entrance) +"YE" = ( +/turf/open/floor/plating, +/area/virtual_domain/ancient_milsim/snpc_cafe) "YY" = ( /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "Zd" = ( /obj/structure/chair/sofa/corp/right{ dir = 4 }, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_hallway) "Zg" = ( /obj/structure/sign/poster/random/directional/west, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "ZA" = ( /obj/effect/landmark/bitrunning/mob_segment, /turf/open/misc/dirt/planet, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/loot_camp) "ZQ" = ( /obj/structure/sign/flag/nri/directional/east, -/turf/open/floor/iron, -/area/virtual_domain) +/turf/open/floor/carpet/red, +/area/virtual_domain/ancient_milsim/snpc_bar) "ZY" = ( /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, -/area/virtual_domain) +/area/virtual_domain/ancient_milsim/snpc_garage) (1,1,1) = {" +nu +nu +nu +nu +nu +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +nu +nu +nu +nu Uz Uz Uz @@ -1545,50 +1883,26 @@ Uz Uz Uz Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu "} (2,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -JG -JG -JG -fF qn qn qn @@ -1602,24 +1916,12 @@ er er er er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er +Uz +Uz +Uz +Uz +Uz +Uz er er er @@ -1639,14 +1941,26 @@ er er er Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu "} (3,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -JG -JG -JG -aB qn JG qn @@ -1670,41 +1984,41 @@ er Cd Cd Cd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF er Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu "} (4,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -JG -JG -Cd -uQ qn qn qn @@ -1728,7 +2042,7 @@ Cd Cd Hq Cd -dd +eF ZY nw eE @@ -1738,31 +2052,31 @@ mZ mZ AE ea -YY +gE AE -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +eF er Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu "} (5,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -JG -Cd -DT -fF qn qn JG @@ -1786,41 +2100,41 @@ Cd Cd Cd Cd -dd +eF kv -YY -YY -YY -YY -YY -YY -YY -YY -YY +gE +gE +gE +gE +gE +gE +gE +gE +gE zf -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +eF er Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu "} (6,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -JG -Wr -Cd -fF qn qn JG @@ -1845,40 +2159,40 @@ qn qn qn aG -kX -kX -kX -kX -kX -kX -kX -kX -kX -YY +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE ec -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +eF er Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +nu +nu +nu +nu "} (7,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -JG -hj -Cd -fF qn qn qn @@ -1903,40 +2217,40 @@ qn qn qn aG -kX -kX -kX -kX -kX -kX -kX -kX -kX -YY +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE uE -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +eF er Uz +er +er +er +er +er +er +er +Uz +nu +nu +nu +nu "} (8,1,1) = {" +nu +nu +nu +nu +nu Uz -JG -Cd -Cd -Hq -fF qn qn qn @@ -1961,40 +2275,40 @@ JG Cd Cd aG -kX -kX -kX -kX -kX -kX -kX -kX -kX -YY -YY -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE +gE +eF +er +er +er +Eg +Eg +Eg +Eg +Eg er Uz +nu +nu +nu +nu "} (9,1,1) = {" +nu +nu +nu +nu +nu Uz -Cd -Cd -hj -Cd -uQ qn JG qn @@ -2004,12 +2318,12 @@ qn Cd Cd Eh -ki +Rl RP RP EB RP -ki +ol no Cd Cd @@ -2019,40 +2333,40 @@ JG JG Cd aG -kX -kX -kX -kX -kX -kX -kX -kX -kX -YY -kX -kX -dd -qn -qn -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE +Gd +Gd +cx +MN +MN +Eg +kL +sG +MY +Eg er Uz +nu +nu +nu +nu "} (10,1,1) = {" +nu +nu +nu +nu +nu Uz -Wr -Cd -Cd -Wr -fF qn qn qn @@ -2077,40 +2391,40 @@ Cd Cd Cd aG +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE +iZ +Gd kX kX -kX -kX -kX -kX -kX -kX -kX -YY -qn -kX -kX -kX -sD -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +MN +Eg +On +sG +DL +Eg er Uz +Uz +Uz +Uz +Uz "} (11,1,1) = {" +nu +nu +nu +nu +nu Uz -Cd -Cd -Cd -hj -fF qn JG qn @@ -2119,7 +2433,7 @@ qn Cd qn qn -Mv +Mq Mv qn FX @@ -2135,40 +2449,40 @@ qn qn qn aG +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE +XV +eF kX -kX -kX -kX -kX -kX -kX -kX -kX -YY -Wh -dd -kX -qn -qn -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg +MN +MN +Eg +EE +sG +MY +Eg +er +er +er +er er Uz "} (12,1,1) = {" +nu +nu +nu +nu +Uz Uz -Cd -Cd -DT -HR -Qv qn JG qn @@ -2193,39 +2507,39 @@ Cd qn qn aG -kX -kX -kX -kX -kX -kX -kX -kX -kX -YY +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +Gd +gE SB -dd +eF zx kX -qn -dd -dd -dd -dd -dd -qn -qn -qn -dd +MN +fJ +Eg +zp +Eg +Eg +MN +MN +MN +cx er Uz "} (13,1,1) = {" +nu +nu +nu +Uz Uz -Cd -hj -HR -xI qn qn qn @@ -2250,22 +2564,22 @@ Cd Cd Cd Cd -dd +eF nH uM uM -YY +FN vu lc -YY -YY -YY -YY -YY -dd +gE +gE +gE +gE +gE +eF kX kX -qn +MN vs kX kX @@ -2273,16 +2587,16 @@ kX kX kX kX -qn -dd +MN +cx er Uz "} (14,1,1) = {" +nu +nu +Uz Uz -Cd -HR -xI qn qn qn @@ -2308,19 +2622,20 @@ Cd Cd Cd Cd -dd +eF Ue Nl oz -YY -YY -YY -YY -YY -YY -YY -YY -dd +gE +gE +gE +gE +gE +gE +gE +gE +eF +PO kX kX kX @@ -2331,15 +2646,14 @@ kX kX kX kX -kX -dd +cx er Uz "} (15,1,1) = {" +nu +Uz Uz -HR -xI qn qn qn @@ -2365,38 +2679,38 @@ JG Cd Cd Cd -hj -dd -dd -dd -dd -dd -YY +Sv +uC +eF +eF +eF +eF +gE fu -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd +eF +eF +eF +eF +eF +eF +IS +IS +IS +IS +IS +YE +YE +IS +IS kX kX -dd -dd -kX -kX -dd +cx er Uz "} (16,1,1) = {" Uz -Fk +Uz qn JG JG @@ -2423,32 +2737,32 @@ Cd Cd Cd Wr -hj +Sv rB -YY +rO UQ Pw De YY -DW +Ow wr -De +cF ob uZ jS Zd rT -YY -YY -YY -ea -kX -qn -YY -dd -qn +sX +sX +sX +LP +YE +Bs +sX +IS +MN zL -dd +cx er Uz "} @@ -2480,12 +2794,12 @@ JG Cd Cd Cd -hj -hj +Sv +Sv rB -Qn -Ey -CR +YY +YY +YY YY YY YY @@ -2496,17 +2810,17 @@ YY YY YY lz -YY +sX DW -YY +sX jc -YY +sX hJ bw -dd -qn -qn -dd +IS +MN +MN +cx er Uz "} @@ -2538,11 +2852,11 @@ JG JG Cd Hq -hj -hj -rB +Sv +Sv +Fn +CR YY -cF tg YY YY @@ -2553,18 +2867,18 @@ tg YY YY YY -YY -YY +Vp +sX yt yt UD -YY +sX jc Wh -dd -qn -qn -dd +IS +MN +MN +cx er Uz "} @@ -2597,32 +2911,32 @@ Cd Cd Cd Cd -hj -dd -dd -dd -dd +Sv +oJ +oJ +oJ +oJ ka -dd -dd -YY +oJ +oJ +TE RY -dd -dd -dd -dd -dd +Ox +Ox +Ox +Ox +Ox JM sV nM -YY -YY -YY +sX +sX +sX lt -dd +IS kX kX -qn +MN er Uz "} @@ -2656,31 +2970,31 @@ Cd Cd Cd Cd -dd +oJ Ib Wq -YY -YY +AH +AH iI -dd -YY -YY +oJ +TE +TE Bd NA Zg OS -dd +Ox Dk -YY +sX yt -jc -YY -jc +TD +sX +TD iW -dd +IS kX kX -dd +cx er Uz "} @@ -2714,20 +3028,20 @@ Cd Cd Cd Cd -dd -dd -dd -YY -YY +oJ +oJ +oJ +AH +AH Dy -dd +oJ AN -YY +TE Bd td -YY +TE yV -dd +Ox XK yt yt @@ -2735,10 +3049,10 @@ hH Fq hH Yd -dd +IS kX kX -dd +cx er Uz "} @@ -2772,31 +3086,31 @@ Cd Cd Cd Cd -dd +oJ ne Wq -YY -YY +AH +AH PM -dd +oJ AB -DW +Kx et -td -YY +wy +TE HM -dd +Ox Ff -YY -Xh -YY -YY +sX +sX +sX +sX yt Wh -dd +IS kX kX -dd +cx er Uz "} @@ -2830,31 +3144,31 @@ Cd Wr DT Cd -dd -dd -dd -YY -YY +oJ +oJ +oJ +AH +AH Dy -dd +oJ lr -YY +TE Bd MW -YY +TE yn -dd +Ox Dk -YY +sX rx PJ nM jc Yd -dd +IS kX -qn -dd +MN +cx er Uz "} @@ -2888,31 +3202,31 @@ JG Cd Cd Cd -dd +oJ ne Wq Sh Sh iI -dd -jc +oJ +RG te TE TE ZQ mu -dd -YY +Ox +Qn Rk lX CH -tg +MU hH iW -dd +IS kX kX -dd +cx er Uz "} @@ -2946,79 +3260,79 @@ JG JG Cd Wr -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd +Jq +oJ +oJ +oJ +oJ +oJ +oJ +or +Ox +Ox +Ox +Ox +Ox +Ox +IS +IS +IS +IS +IS +IS +IS +IS kX dh -dd +cx er Uz "} (26,1,1) = {" Uz -cb -Hq -Cd -Hq -Cd -Cd -Hq -Cd -Cd -Cd -Cd -Cd -Cd -Hq -Cd -Cd -Cd -Cd -JG -Cd -Cd -Cd -Cd -Hq -Cd -hj -Cd -Cd -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -dd +Qb +LD +hy +LD +hy +hy +LD +hy +hy +hy +hy +hy +hy +LD +hy +hy +hy +hy +Aw +hy +hy +hy +hy +LD +hy +eQ +hy +hy +er +er +er +er +er +er +er +er +er +er +er +er +er +er +cx kX kX kX @@ -3028,13 +3342,13 @@ kX kX kX kX -qn +MN er Uz "} (27,1,1) = {" Uz -hy +ed hy hy hy @@ -3061,22 +3375,22 @@ hy eQ eQ eQ -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -dd +er +er +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +er +cx ED kX kX @@ -3086,96 +3400,99 @@ kX kX kX kX -qn +MN er Uz "} (28,1,1) = {" Uz -Cd -Cd -Cd -Cd -Cd +Vl +Vl +Vl +Vl +Vl Mz Mz Mz Mz Mz Mz -pn +tU hj -Cd -Cd +Vl +Vl er -dd -kX -kX -dd -Mg -Wr -Cd -Cd -hj -hj +yh +oj +oj +yh +er +yh +oj +oj +yh +er +er +er +Uz +Uz nu -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -Mg -dd +nu +nu +nu +nu +nu +nu +nu +nu +nu +Uz +er +cx kX kX -dd -dd -dd -dd -dd -qn -qn -qn +cx +cx +cx +cx +cx +MN +MN +MN er Uz "} (29,1,1) = {" Uz hj -Cd -Cd -Cd -Cd +Vl +Vl +Vl +Vl Mz kJ -qn -qn -qn +QP +QP +QP Mz -Cd -Cd -Wr -Cd +Vl +Vl +qC +Vl er -dd -kX -kX -dd -Mg -Mg -Mg -Mg -Mg -Mg +yh +oj +oj +yh +er +yh +oj +oj +yh +er +Uz +Uz +Uz nu nu nu @@ -3187,198 +3504,195 @@ nu nu nu nu -nu -nu -nu -nu -nu -dd +Uz +er +ls kX XZ -dd -Mg -Mg -Mg -Mg -Mg -Mg -Mg +cx +er +er +er +er +er +er +er er Uz "} (30,1,1) = {" Uz -Cd -Cd -Cd -Wr -Cd -Cd -qn -qn -qn -qn -Cd -Cd -Cd -Cd -Cd +Vl +Vl +Vl +qC +Vl +Vl +QP +QP +QP +QP +Vl +Vl +Vl +Vl +Vl er -dd -kX -kX -dd +yh +oj +oj +yh er +yh +oj +oj +yh er +Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Uz er +uz +uz +PE +uz er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -Eg -Eg -zp -Eg -Eg -Mg -Mg -Mg -Mg -Mg -Mg -er +Uz +Uz +Uz +Uz +Uz +Uz +Uz Uz "} (31,1,1) = {" Uz -Cd -Cd -Cd -Cd +Vl +Vl +Vl +Vl hj -Cd -qn +Vl +QP ZA -qn -qn -Cd -Cd -Cd +QP +QP +Vl +Vl +Vl hj -Cd +Vl er -dd -kX -kX -dd +yh +oj +oj +yh er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -Eg -kL -AW -MY -Eg -Mg -Mg -Mg -Mg -Mg -Mg +yh +oj +oj +yh er Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Uz +er +uz +AW +AW +uz +er +Uz +nu +nu +nu +nu +nu +nu +nu "} (32,1,1) = {" Uz -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn -Cd -Cd -Wr -Cd -Cd -Cd +Vl +Vl +Vl +Vl +Vl +Vl +Vl +QP +QP +Vl +Vl +qC +Vl +Vl +Vl er -dd -kX -kX -dd +yh +oj +oj +yh er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -Eg -Do -AW -MY -Eg -Mg -Mg -Mg -Mg -Mg -Mg +yh +oj +oj +yh er Uz +Uz +Uz +Uz +Uz +Uz +Uz +nu +nu +nu +nu +nu +nu +nu +Uz +er +uz +Do +OG +uz +er +Uz +nu +nu +nu +nu +nu +nu +nu "} (33,1,1) = {" Uz @@ -3398,10 +3712,15 @@ vL vL vL er -dd -kX -kX -dd +yh +oj +oj +yh +er +yh +oj +oj +yh er er er @@ -3409,84 +3728,79 @@ er er er er +Uz +nu +nu +nu +nu +nu +nu +nu +Uz er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -Eg -EE +uz AW -MY -Eg -Mg -Mg -Mg -Mg -Mg -Mg +AW +uz er Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz "} (34,1,1) = {" Uz wz -Cd -Cd -Cd -Cd -Cd +Vl +Vl +Vl +Vl +Vl wv -qn -qn -Cd +QP +QP +Vl wz -Cd -Cd -Cd -Cd -dd -dd +Vl +Vl +Vl +Vl +yh +yh TP TP -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd -dd +yh +yh +yh +TP +TP +yh +go +go +go +go +go +go er +Uz +nu +nu +nu +nu +nu +nu +Uz +Uz er -er -er -er -er -er -er -er -er -er -Eg -Eg +Sl +uz sa -Eg -Eg +uz +er er er er @@ -3498,281 +3812,281 @@ Uz "} (35,1,1) = {" Uz -Cd -Cd -Cd -Cd -Cd -Cd -dd +Vl +Vl +Vl +Vl +Vl +Vl +jn Wv -qn -Cd +QP +Vl lG -Cd -Cd -Cd -Cd +Vl +Vl +Vl +Vl TP TQ -kX +oj fk -kX -kX -kX +gP +oj +oj Mi -kX +oj fk -dd +go AY eR Cr wh -dd +go +er +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz er er -er -er -er -er -er -er -er -er -er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd +nA +nA +nA +nA +nA +nA +nA +nA +nA +nA +nA +nA Uz "} (36,1,1) = {" Uz -Cd -Cd -Cd +Vl +Vl +Vl wz -Cd -Cd -Cd -qn -qn -Cd +Vl +Vl +Vl +QP +QP +Vl bB bB bB bB -Cd -dd -dd -dd -dd -dd -dd -dd +Vl +qB +yh +yh +yh +yh +yh +yh yl Is -kX -dd +Xh +go OV -kX +aO MQ gL -dd +go er er er er er er +Uz +Uz er er -er -er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn +nA +nA +nA +nA +nA +nA +nA +nA +nA +nA +nA +nA +lu Uz "} (37,1,1) = {" Uz -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn -Cd +Vl +Vl +Vl +Vl +Vl +Vl +Vl +QP +QP +Vl bB RA nZ bB -Cd -dd +Vl +iq qV +Cg Lr Lr -Lr -xa -dd +Ey +yh EW -kX -jV -dd +oj +Rv +go th GS -kX +aO AR -dd -dd -dd -dd -dd -dd +go +Ku +Ku +Ku +Ku +Ku er er er er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn -qn +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +VZ +VZ +VZ Uz "} (38,1,1) = {" Uz -Cd -Cd -Cd +Vl +Vl +Vl TG sS -Cd -Cd -Cd -qn -qn +Vl +Vl +Vl +QP +QP Ww Vi bm bB -Cd -dd +Vl +iq zE Lr iz RC xa -dd +yh uY QF WY -dd +go hO -kX +aO pY -dd -dd +go +go oe Ek Jj KN -dd -dd -dd +Ku +Ku +Ku er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +VZ +VZ Uz "} (39,1,1) = {" Uz -Cd +Vl wz -Cd +Vl im im -Cd -Cd -Cd -qn -qn +Vl +Vl +Vl +QP +QP Ww My ki bB -Cd -dd +Vl +iq OA Lr VC DN rl -dd +yh uY QF Is -dd +go AC jV -kX -dd +aO +go GR wx ek -AW +Iz hp IH -dd -dd -dd -Cd -Cd -Cd -Cd +Ku +Ku +Ku +hZ +hZ +hZ +hZ kS lE lE @@ -3781,57 +4095,57 @@ lE lE JU qp -qn -qn -qn +VZ +VZ +VZ Uz "} (40,1,1) = {" Uz -Cd -Cd +Vl +Vl bB bB bB Ww Ww -Cd -qn -qn +Vl +QP +QP bB Rn Rn bB -Cd -dd +Vl +iq HG Bg Lr Lr Bg -dd +yh cp Is QF -dd +go Ux cV -kX +aO lf Fv ek -dC -dC -AW +CC +CC +Iz hp ly -dd +Ku uy -Cd -Cd -Cd -Cd -Cd +hZ +hZ +hZ +hZ +hZ lE lE lE @@ -3839,14 +4153,14 @@ lE lE lE bd -qn -qn -qn +VZ +VZ +VZ Uz "} (41,1,1) = {" Uz -Cd +Vl bB bB ki @@ -3854,52 +4168,52 @@ ki ki Ww Ww -qn -qn -Cd -qn -qn -Cd +QP +QP +Vl +QP +QP +Vl lG -dd +iq tA Lr Lr Lr pN -dd +yh Rq -jV +Rv fk -dd -dd -dd +aE +go +go lf -dd +go al -AW +Iz Kf -ir +Jn eh -AW +Iz Gl -wZ -Cd -Cd -Cd -Cd -Cd -Cd +HT +hZ +hZ +hZ +hZ +hZ +hZ lE lE lE lE lE lE -qn -qn +DE +VZ PT -qn +VZ Uz "} (42,1,1) = {" @@ -3912,52 +4226,52 @@ ss ki ki bB -qn -qn -Cd -qn +QP +QP +Vl +QP ke -Cd -Cd -dd +Vl +Vl +iq KA Lr Lr Lr Lr -dd +yh yl -kX +oj vr VX -kX +oj Vj Vj -dd +yh Go LI co vd CV -AW +Iz Fv -ft -Cd -Cd -Cd -Cd -Cd -Cd +iO +hZ +hZ +hZ +hZ +hZ +hZ lE lE lE lE lE lE -qn -qn -qn -qn +DE +VZ +VZ +VZ Uz "} (43,1,1) = {" @@ -3970,52 +4284,52 @@ SG ki ki Rn -qn -qn -qn -qn -qn -qn -Cd -dd -dd -dd -dd +QP +QP +QP +QP +QP +QP +Vl +Tx +iq +iq +iq Lr Cf -dd -dd -dd -dd -dd -dd -dd -dd -dd +yh +yh +yh +yh +yh +yh +yh +yh +yh XS -AW +Iz ie El CV -AW +Iz Gl -AW -Cd -Cd -Cd -Cd -Cd -Cd +Iz +hZ +hZ +hZ +hZ +hZ +hZ lE lE lE lE lE lE -qn -qn -qn -qn +DE +VZ +VZ +VZ Uz "} (44,1,1) = {" @@ -4028,13 +4342,13 @@ Ab ki ki Rn -qn -qn +QP +QP ZA -qn -qn -qn -qn +QP +QP +QP +QP ft dC WG @@ -4051,19 +4365,19 @@ dC dC Ir ot -AW +Iz iU -ir +Jn vz -AW +Iz Gl -wZ -Cd -Cd -Cd -Cd -Cd -Cd +HT +hZ +hZ +hZ +hZ +hZ +hZ lE lE lE @@ -4071,9 +4385,9 @@ lE lE lE bd -qn -qn -qn +VZ +VZ +VZ Uz "} (45,1,1) = {" @@ -4086,14 +4400,14 @@ Mo ki ki bB -Cd -Cd -Cd -qn -qn -qn -qn -AW +Vl +Vl +Vl +QP +QP +QP +QP +va dC dC dC @@ -4109,34 +4423,34 @@ dC dC dC kh -AW -dC +Iz +CC iw -AW +Iz DO qs -dd +Ku Yx -Cd -Cd -Cd -Cd +hZ +hZ +hZ +hZ kS +ws lE lE lE lE lE -VZ qp -qn -qn -qn +VZ +VZ +VZ Uz "} (46,1,1) = {" Uz -FN +Vl bB bB ki @@ -4144,13 +4458,13 @@ ki ki Ww Ww -Cd -Cd -Cd -qn -qn -Cd -Cd +Vl +Vl +Vl +QP +QP +Vl +Vl wZ dC tH @@ -4168,28 +4482,28 @@ kT dd Pi VA -AW -AW +Iz +Iz Ei wx -dd -dd -dd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn -qn +Ku +Ku +Ku +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +VZ +VZ +VZ Uz "} (47,1,1) = {" @@ -4201,16 +4515,15 @@ bB bB Ww Ww -Cd -Cd +Vl +Vl bB Ww Ww Rn bB -Cd -dd -dd +Vl +WR dd dd dd @@ -4225,50 +4538,51 @@ dd dd dd dd +Ku ba CJ OZ VO -dd -dd -dd +Ku +Ku +Ku er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +VZ +VZ Uz "} (48,1,1) = {" Uz Dt Vr -wy -Cd -Cd -Cd -Cd +Vl +Vl +Vl +Vl +Vl wz -Cd -dd +Vl +jn CT uq ki bB -Cd +Vl qA -Cd +Vl xe Fb rb @@ -4282,58 +4596,63 @@ er er er er -dd -dd -dd -dd -dd -dd +qr +Ku +Ku +Ku +Ku +Ku er er er er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -qn -qn -qn +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +VZ +VZ +VZ Uz "} (49,1,1) = {" Uz -DL +Vl Vr -Cd -Cd -Cd +Vl +Vl +Vl lG -Cd -Cd -Cd +Vl +Vl +Vl bB ue nQ ki yd -qn +QP yI Iy tI -qn -qn -qn +QP +QP +QP BO aP er +Uz +Uz +Uz +Uz +Uz er er er @@ -4342,147 +4661,143 @@ er er er er +Uz +Uz er -er -er -er -er -er -er -er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ Uz "} (50,1,1) = {" Uz -Cd +Vl wz -Cd -Cd -Cd +Vl +Vl +Vl wz -Cd -Cd -Cd +Vl +Vl +Vl bB bB bB bB bB -Cd +Vl qA -Cd -qn +Vl +QP ZA wQ -qn -qn +QP +QP aP er +Uz +nu +nu +nu +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz +Uz er er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ Uz "} (51,1,1) = {" Uz -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd +NJ +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl +Vl qA xB kC -qn +QP tI aP er er er +Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +Uz +Uz er er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -er -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Cd -Rl +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ +hZ Uz "} (52,1,1) = {" +Kw Uz Uz Uz @@ -4508,21 +4823,20 @@ Uz Uz Uz Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz -Uz +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu +nu Uz Uz Uz diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 344d1d0e80e..60b9ed03948 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -42,6 +42,7 @@ #define MEDAL_BLADE_ASCENSION "Blade" #define MEDAL_COSMOS_ASCENSION "Cosmos" #define MEDAL_LOCK_ASCENSION "Knock" +#define MEDAL_MOON_ASCENSION "Moon" #define MEDAL_TOOLBOX_SOUL "Toolsoul" #define MEDAL_HOT_DAMN "Hot Damn!" #define MEDAL_CAYENNE_DISK "Very Important Piscis" diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm index 5cf2e4263d4..3c9a8551f50 100644 --- a/code/__DEFINES/ai/bot_keys.dm +++ b/code/__DEFINES/ai/bot_keys.dm @@ -35,6 +35,10 @@ #define BB_NEAR_DEATH_SPEECH "near_death_speech" ///in crit patient we must alert medbay about #define BB_PATIENT_IN_CRIT "patient_in_crit" +///how much time interval before we clear list +#define BB_UNREACHABLE_LIST_COOLDOWN "unreachable_list_cooldown" +///can we clear the list now +#define BB_CLEAR_LIST_READY "clear_list_ready" // cleanbots ///key that holds the foaming ability diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index aff00260705..d4f9af401cf 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -116,6 +116,10 @@ #define BB_ORE_TARGET "BB_ore_target" /// which ore types we will not eat #define BB_ORE_IGNORE_TYPES "BB_ore_ignore_types" +/// key that holds the boulder we will break +#define BB_BOULDER_TARGET "BB_boulder_target" +/// key that holds the ore_vent we will harvest boulders from +#define BB_VENT_TARGET "BB_vent_target" // minebot keys /// key that stores our toggle light ability diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index faab92aee8c..2547f3f20cb 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -84,6 +84,7 @@ #define PATH_BLADE "Blade Path" #define PATH_COSMIC "Cosmic Path" #define PATH_LOCK "Lock Path" +#define PATH_MOON "Moon Path" /// 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 @@ -222,8 +223,10 @@ GLOBAL_LIST_INIT(ai_employers, list( #define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic)) /// Check if the given mob is a heretic monster. #define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) -/// Checks if the given mob is either a heretic or a heretic monster. -#define IS_HERETIC_OR_MONSTER(mob) (IS_HERETIC(mob) || IS_HERETIC_MONSTER(mob)) +/// Check if the given mob is a lunatic +#define IS_LUNATIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/lunatic)) +/// Checks if the given mob is either a heretic, heretic monster or a lunatic. +#define IS_HERETIC_OR_MONSTER(mob) (IS_HERETIC(mob) || IS_HERETIC_MONSTER(mob) || IS_LUNATIC(mob)) /// Checks if the given mob is a wizard #define IS_WIZARD(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/wizard)) diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index 5e501a83983..1993f102225 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -92,8 +92,14 @@ // Ventcrawling bitflags, handled in var/vent_movement ///Allows for ventcrawling to occur. All atmospheric machines have this flag on by default. Cryo is the exception -#define VENTCRAWL_ALLOWED (1<<0) +#define VENTCRAWL_ALLOWED (1<<0) ///Allows mobs to enter or leave from atmospheric machines. On for passive, unary, and scrubber vents. #define VENTCRAWL_ENTRANCE_ALLOWED (1<<1) ///Used to check if a machinery is visible. Called by update_pipe_vision(). On by default for all except cryo. -#define VENTCRAWL_CAN_SEE (1<<2) +#define VENTCRAWL_CAN_SEE (1<<2) + +DEFINE_BITFIELD(vent_movement, list( + "Ventcrawl Allowed" = VENTCRAWL_ALLOWED, + "Ventcrawl Entrance Allowed" = VENTCRAWL_ENTRANCE_ALLOWED, + "Ventcrawl Can See" = VENTCRAWL_CAN_SEE, +)) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 6a71a8d6c3c..c7da3473fa3 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -430,3 +430,5 @@ GLOBAL_LIST_INIT(cable_colors, list( CABLE_COLOR_YELLOW = CABLE_HEX_COLOR_YELLOW, CABLE_COLOR_BROWN = CABLE_HEX_COLOR_BROWN )) + +#define HUSK_COLOR_TONE rgb(96, 88, 80) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index c12c9b57713..33b7853cfd0 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -338,13 +338,13 @@ GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) /// Martial arts attack requested but is not available, allow a check for a regular attack. -#define MARTIAL_ATTACK_INVALID -1 +#define MARTIAL_ATTACK_INVALID NONE /// Martial arts attack happened but failed, do not allow a check for a regular attack. -#define MARTIAL_ATTACK_FAIL FALSE +#define MARTIAL_ATTACK_FAIL COMPONENT_SKIP_ATTACK /// Martial arts attack happened and succeeded, do not allow a check for a regular attack. -#define MARTIAL_ATTACK_SUCCESS TRUE +#define MARTIAL_ATTACK_SUCCESS COMPONENT_CANCEL_ATTACK_CHAIN /// IF an object is weak against armor, this is the value that any present armor is multiplied by #define ARMOR_WEAKENED_MULTIPLIER 2 @@ -370,3 +370,18 @@ GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) #define COMBO_STEPS "steps" /// The proc the combo calls #define COMBO_PROC "proc" + +///Checks If the target can be moved at all by shoving them +#define SHOVE_CAN_MOVE (1<<0) +///If the target can be shoved into something something with perhaps special interactions. +#define SHOVE_CAN_HIT_SOMETHING (1<<1) +///Keeps knockdowns at bay for the target +#define SHOVE_KNOCKDOWN_BLOCKED (1<<2) +///If the target can be briefly paralized by shoving them once again after knocking them down. +#define SHOVE_CAN_KICK_SIDE (1<<3) +///Whether the staggered status effect can be applied on the target +#define SHOVE_CAN_STAGGER (1<<4) +///If the target could move, but didn't because there's an obstacle in the path. +#define SHOVE_BLOCKED (1<<5) +///If the obstacle is an object at the border of the turf (so no signal from being sent to the other turf) +#define SHOVE_DIRECTIONAL_BLOCKED (1<<6) diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index 294fe6364cd..24ab2eb3303 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -75,3 +75,15 @@ #define MATERIAL_QUANTITY_RARE 2500 /// How much quantity of a material stock exists for exotic materials like diamond & bluespace crystals. #define MATERIAL_QUANTITY_EXOTIC 500 + +// The number of ore vents that will spawn boulders with this material. +/// Is this material going to spawn often in ore vents? (80% of vents on lavaland) +#define MATERIAL_RARITY_COMMON 12 +/// Is this material going to spawn often in ore vents? (53% of vents on lavaland) +#define MATERIAL_RARITY_SEMIPRECIOUS 8 +/// Is this material going to spawn uncommonly in ore vents? (33% of vents on lavaland) +#define MATERIAL_RARITY_PRECIOUS 5 +/// Is this material going to spawn rarely in ore vents? (20% of vents on lavaland) +#define MATERIAL_RARITY_RARE 3 +/// Is this material only going to spawn once in ore vents? (6% of vents on lavaland) +#define MATERIAL_RARITY_UNDISCOVERED 1 diff --git a/code/__DEFINES/construction/rcd.dm b/code/__DEFINES/construction/rcd.dm index e8c9ae55f32..95c5ab80053 100644 --- a/code/__DEFINES/construction/rcd.dm +++ b/code/__DEFINES/construction/rcd.dm @@ -19,6 +19,9 @@ /// Time taken for an rcd hologram to disappear #define RCD_HOLOGRAM_FADE_TIME (15 SECONDS) +/// Delay before another rcd scan can be performed in the UI +#define RCD_DESTRUCTIVE_SCAN_COOLDOWN (RCD_HOLOGRAM_FADE_TIME + 1 SECONDS) + //All available upgrades /// Upgrade for building machines #define RCD_UPGRADE_FRAMES (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 c3ec1aa8a84..a027dc61adb 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -20,6 +20,8 @@ #define COMSIG_ATOM_REAGENT_EXAMINE "atom_reagent_examine" /// Stop the generic reagent examine text #define STOP_GENERIC_REAGENT_EXAMINE (1<<0) + /// Allows the generic reaegent examine text regardless of whether the user can scan reagents. + #define ALLOW_GENERIC_REAGENT_EXAMINE (1<<1) ///from base of atom/examine_more(): (/mob, examine_list) #define COMSIG_ATOM_EXAMINE_MORE "atom_examine_more" /// from atom/examine_more(): (/atom/examining, examine_list) diff --git a/code/__DEFINES/dcs/signals/signals_circuit.dm b/code/__DEFINES/dcs/signals/signals_circuit.dm index c0676d768ce..3fe4e80fdb2 100644 --- a/code/__DEFINES/dcs/signals/signals_circuit.dm +++ b/code/__DEFINES/dcs/signals/signals_circuit.dm @@ -81,3 +81,8 @@ /// Called when an equipment action component is removed from a shell (/obj/item/circuit_component/equipment_action/action_comp) #define COMSIG_CIRCUIT_ACTION_COMPONENT_UNREGISTERED "circuit_action_component_unregistered" + +///Sent to the shell component when a circuit is attached. +#define COMSIG_SHELL_CIRCUIT_ATTACHED "shell_circuit_attached" +///Sent to the shell component when a circuit is removed. +#define COMSIG_SHELL_CIRCUIT_REMOVED "shell_circuit_removed" diff --git a/code/__DEFINES/dcs/signals/signals_mining.dm b/code/__DEFINES/dcs/signals/signals_mining.dm index 8dc3fe283f6..3ef84b1f7b6 100644 --- a/code/__DEFINES/dcs/signals/signals_mining.dm +++ b/code/__DEFINES/dcs/signals/signals_mining.dm @@ -1,3 +1,6 @@ +/// Sent from /obj/structure/ore_vent, lets the spawner component know to qdel. +#define COMSIG_VENT_WAVE_CONCLUDED "mining_waves_stop" + /// Fired by a mob which has been grabbed by a goliath #define COMSIG_GOLIATH_TENTACLED_GRABBED "comsig_goliath_tentacle_grabbed" /// Fired by a goliath tentacle which is returning to the earth diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index fe7673ee3ca..8b73010b8f9 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -13,13 +13,6 @@ ///Called from /mob/living/carbon/help_shake_act on the helper, after any hugs have ocurred. (mob/living/helped) #define COMSIG_CARBON_HELPED "carbon_helped_someone" -///Before a carbon mob is shoved, sent to the turf we're trying to shove onto (mob/living/carbon/shover, mob/living/carbon/target) -#define COMSIG_CARBON_DISARM_PRESHOVE "carbon_disarm_preshove" - #define COMSIG_CARBON_ACT_SOLID (1<<0) //Tells disarm code to act as if the mob was shoved into something solid, even we we're not -///When a carbon mob is disarmed, this is sent to the turf we're trying to shove onto (mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) -#define COMSIG_CARBON_DISARM_COLLIDE "carbon_disarm_collision" - #define COMSIG_CARBON_SHOVE_HANDLED (1<<0) - ///When a carbon slips. Called on /turf/open/handle_slip() #define COMSIG_ON_CARBON_SLIP "carbon_slip" // /mob/living/carbon physiology signals @@ -125,8 +118,6 @@ ///Applied preferences to a human #define COMSIG_HUMAN_PREFS_APPLIED "human_prefs_applied" -///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) -#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" ///Whenever EquipRanked is called, called after job is set #define COMSIG_JOB_RECEIVED "job_received" ///from /mob/living/carbon/human/proc/set_coretemperature(): (oldvalue, newvalue) 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 b1838793e98..2b113f853da 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -228,6 +228,15 @@ #define COMSIG_LIVING_CHECK_BLOCK "living_check_block" #define SUCCESSFUL_BLOCK (1<<0) +///Hit by successful disarm attack (mob/living/attacker, zone_targeted, item/weapon) +#define COMSIG_LIVING_DISARM_HIT "living_disarm_hit" +///Before a living mob is shoved, sent to the turf we're trying to shove onto (mob/living/shover, mob/living/target) +#define COMSIG_LIVING_DISARM_PRESHOVE "living_disarm_preshove" + #define COMSIG_LIVING_ACT_SOLID (1<<0) //Tells disarm code to act as if the mob was shoved into something solid, even we we're not +///When a living mob is disarmed, this is sent to the turf we're trying to shove onto (mob/living/shover, mob/living/target, shove_blocked) +#define COMSIG_LIVING_DISARM_COLLIDE "living_disarm_collision" + #define COMSIG_LIVING_SHOVE_HANDLED (1<<0) + /// Sent on a mob from /datum/component/mob_chain when component is attached with it as the "front" : (mob/living/basic/tail) #define COMSIG_MOB_GAINED_CHAIN_TAIL "living_gained_chain_tail" /// Sent on a mob from /datum/component/mob_chain when component is detached from it as the "front" : (mob/living/basic/tail) @@ -240,5 +249,9 @@ /// Sent from a mob to their loc when starting to remove cuffs on itself #define COMSIG_MOB_REMOVING_CUFFS "living_removing_cuffs" -/// Sent as a reply to above from any atom that wishs to stop self-cuff removal -#define COMSIG_MOB_BLOCK_CUFF_REMOVAL (1<<0) + /// Sent as a reply to above from any atom that wishs to stop self-cuff removal + #define COMSIG_MOB_BLOCK_CUFF_REMOVAL (1<<0) + +/// Sent to a mob grabbing another mob: (mob/living/grabbing) +#define COMSIG_LIVING_GRAB "living_grab" + // Return COMPONENT_CANCEL_ATTACK_CHAIN / COMPONENT_SKIP_ATTACK_CHAIN to stop the grab 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 2023493ac95..1813198b774 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -70,6 +70,8 @@ ///from mind/transfer_to. Sent to the receiving mob. #define COMSIG_MOB_MIND_TRANSFERRED_INTO "mob_mind_transferred_into" +///from mind/transfer_from. Sent to the mob the mind is being transferred out of. +#define COMSIG_MOB_MIND_TRANSFERRED_OUT_OF "mob_mind_transferred_out_of" /// From /mob/proc/ghostize() Called when a mob sucessfully ghosts #define COMSIG_MOB_GHOSTIZED "mob_ghostized" @@ -238,3 +240,6 @@ #define COMPONENT_BLOCK_MOB_CHANGE (1<<0) /// from /mob/proc/change_mob_type_unchecked() : () #define COMSIG_MOB_CHANGED_TYPE "mob_changed_type" + +/// from /mob/proc/slip(): (knockdown_amonut, obj/slipped_on, lube_flags [mobs.dm], paralyze, force_drop) +#define COMSIG_MOB_SLIPPED "mob_slipped" diff --git a/code/__DEFINES/dcs/signals/signals_modular_computer.dm b/code/__DEFINES/dcs/signals/signals_modular_computer.dm index 950262a5fe1..dd325e41984 100644 --- a/code/__DEFINES/dcs/signals/signals_modular_computer.dm +++ b/code/__DEFINES/dcs/signals/signals_modular_computer.dm @@ -1,5 +1,10 @@ // Various modular computer signals. +/// From /obj/item/modular_computer/proc/turn_on: (user) +#define COMSIG_MODULAR_COMPUTER_TURNED_ON "comsig_modular_computer_turned_on" +/// From /obj/item/modular_computer/proc/shutdown_computer: (loud) +#define COMSIG_MODULAR_COMPUTER_SHUT_DOWN "comsig_modular_computer_shut_down" + /// From /obj/item/modular_computer/proc/store_file: (datum/computer_file/file_storing) #define COMSIG_MODULAR_COMPUTER_FILE_STORE "comsig_modular_computer_file_store" /// From /obj/item/modular_computer/proc/remove_file: (datum/computer_file/file_removing) @@ -9,7 +14,36 @@ /// From /obj/item/modular_computer/proc/store_file: () #define COMSIG_COMPUTER_FILE_DELETE "comsig_computer_file_delete" +/// From /obj/item/modular_computer/proc/InsertID: (inserting_id, user) +#define COMSIG_MODULAR_COMPUTER_INSERTED_ID "comsig_computer_inserted_id" + +/// From /datum/computer_file/program/on_start: (user) +#define COMSIG_COMPUTER_PROGRAM_START "computer_program_start" + +/// From /datum/computer_file/program/kill_program: (user) +#define COMSIG_COMPUTER_PROGRAM_KILL "computer_program_kill" + +/// From /datum/computer_file/program/nt_pay/make_payment: (payment_result) +#define COMSIG_MODULAR_COMPUTER_NT_PAY_RESULT "comsig_modular_computer_nt_pay_result" + +/// From /datum/computer_file/program/nt_pay/make_payment: (spookiness, manual) +#define COMSIG_MODULAR_COMPUTER_SPECTRE_SCAN "comsig_modular_computer_spectre_scan" + +/// From /datum/computer_file/program/radar/trackable: (atom/signal, turf/signal_turf, turf/computer_turf) +#define COMSIG_MODULAR_COMPUTER_RADAR_TRACKABLE "comsig_modular_computer_radar_trackable" + #define COMPONENT_RADAR_TRACK_ANYWAY (1<<0) + #define COMPONENT_RADAR_DONT_TRACK (1<<1) +/// From /datum/computer_file/program/radar/find_atom: (list/atom_container) +#define COMSIG_MODULAR_COMPUTER_RADAR_FIND_ATOM "comsig_modular_computer_radar_find_atom" +/// From /datum/computer_file/program/radar/ui_act, when action is "selecttarget": (selected_ref) +#define COMSIG_MODULAR_COMPUTER_RADAR_SELECTED "comsig_modular_computer_radar_selected" + /// from /obj/item/modular_computer/imprint_id(): (name, job) #define COMSIG_MODULAR_PDA_IMPRINT_UPDATED "comsig_modular_pda_imprint_updated" /// from /obj/item/modular_computer/reset_id(): () #define COMSIG_MODULAR_PDA_IMPRINT_RESET "comsig_modular_pda_imprint_reset" + +/// From /datum/computer_file/program/messenger/receive_message, sent to the computer: (signal/subspace/messaging/tablet_message/signal, sender_job, sender_name) +#define COMSIG_MODULAR_PDA_MESSAGE_RECEIVED "comsig_modular_pda_message_received" +/// From /datum/computer_file/program/messenger/send_message_signal, sent to the computer: (atom/origin, datum/signal/subspace/messaging/tablet_message/signal) +#define COMSIG_MODULAR_PDA_MESSAGE_SENT "comsig_modular_pda_message_sent" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 903182b21db..d65cb835116 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -130,7 +130,7 @@ #define COMSIG_ITEM_ON_JUICE "on_juice" ///from /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) when an object is used as compost: (mob/user) #define COMSIG_ITEM_ON_COMPOSTED "on_composted" -///Called when an item is dried by a drying rack: +///Called when an item is dried by a drying rack #define COMSIG_ITEM_DRIED "item_dried" ///from base of obj/item/dropped(): (mob/user) #define COMSIG_ITEM_DROPPED "item_drop" @@ -444,7 +444,7 @@ #define COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN (1<<1) #define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2) /// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, params) -#define COMSIG_ITEM_ATTACK_SECONDARY "item_pre_attack_secondary" +#define COMSIG_ITEM_ATTACK_SECONDARY "item_attack_secondary" ///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_ITEM_AFTERATTACK "item_afterattack" /// Flag for when /afterattack potentially acts on an item. @@ -462,9 +462,16 @@ /// from base of obj/item/failedEmbed() #define COMSIG_ITEM_FAILED_EMBED "item_failed_embed" +/// from base of datum/element/disarm_attack/secondary_attack(), used to prevent shoving: (victim, user, send_message) +#define COMSIG_ITEM_CAN_DISARM_ATTACK "item_pre_disarm_attack" + #define COMPONENT_BLOCK_ITEM_DISARM_ATTACK (1<<0) + ///from /obj/item/assembly/proc/pulsed(mob/pulser) #define COMSIG_ASSEMBLY_PULSED "assembly_pulsed" +///from /datum/computer_file/program/nt_pay/_pay(), sent to every physical card of a bank account: (computer, money_received) +#define COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED "id_card_ntpay_money_received" + ///from base of /obj/item/mmi/set_brainmob(): (mob/living/brain/new_brainmob) #define COMSIG_MMI_SET_BRAINMOB "mmi_set_brainmob" diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm index cacda58a9ea..5e63d9bd6d3 100644 --- a/code/__DEFINES/devices.dm +++ b/code/__DEFINES/devices.dm @@ -13,3 +13,12 @@ #define INSPECTOR_TIME_MODE_SLOW 1 #define INSPECTOR_TIME_MODE_FAST 2 #define INSPECTOR_TIME_MODE_HONK 3 + +// Health scan modes +/// Healthscan prints health of the target +#define SCANNER_CONDENSED 0 +/// Healthscan prints health of each bodypart of the target in addition to broad health +#define SCANNER_VERBOSE 1 +/// Used to prevent health analyzers from switching modes when they shouldn't. +/// Functions the same as [SCANNER_CONDENSED] +#define SCANNER_NO_MODE -1 diff --git a/code/__DEFINES/do_afters.dm b/code/__DEFINES/do_afters.dm index dcedbbe010b..cba02d6cf67 100644 --- a/code/__DEFINES/do_afters.dm +++ b/code/__DEFINES/do_afters.dm @@ -7,3 +7,4 @@ #define DOAFTER_SOURCE_HEAL_TOUCH "doafter_heal_touch" #define DOAFTER_SOURCE_PLANTING_DEVICE "doafter_planting_device" #define DOAFTER_SOURCE_CHARGE_CRANKRECHARGE "doafter_charge_crank_recharge" +#define DOAFTER_SOURCE_REMOVING_HOOK "doafter_removing_hook" diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 9d6841b56fd..93b0678581a 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -15,10 +15,7 @@ ///Paygrade for Heads of Staff. #define PAYCHECK_COMMAND 100 -//How many credits a player is charged if they print something from a departmental lathe they shouldn't have access to. -#define LATHE_TAX 10 -//How much POWER a borg's cell is taxed if they print something from a departmental lathe. -#define SILICON_LATHE_TAX 2000 + #define STATION_TARGET_BUFFER 25 diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 8c8aa0e3cc3..c4d89a18885 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -18,6 +18,11 @@ #define FISH_AI_ZIPPY "zippy" #define FISH_AI_SLOW "slow" +///Slot defines for the fishing rod and its equipment +#define ROD_SLOT_BAIT "bait" +#define ROD_SLOT_LINE "line" +#define ROD_SLOT_HOOK "hook" + #define ADDITIVE_FISHING_MOD "additive" #define MULTIPLICATIVE_FISHING_MOD "multiplicative" @@ -45,19 +50,21 @@ #define FISHING_LINE_REINFORCED (1 << 1) /// Much like FISHING_HOOK_ENSNARE but for the fishing line. #define FISHING_LINE_BOUNCY (1 << 2) +/// The sorta opposite of FISHING_LINE_BOUNCY. It makes it slower to gain completion and faster to lose it. +#define FISHING_LINE_STIFF (1 << 3) ///Keeps the bait from falling from gravity, instead allowing the player to move the bait down with right click. -#define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 2) +#define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 0) ///Prevents the player from losing the minigame when the completion reaches 0 -#define FISHING_MINIGAME_RULE_NO_ESCAPE (1 << 3) +#define FISHING_MINIGAME_RULE_NO_ESCAPE (1 << 1) ///Automatically kills the fish after a while, at the cost of killing it -#define FISHING_MINIGAME_RULE_KILL (1 << 4) +#define FISHING_MINIGAME_RULE_KILL (1 << 2) ///Prevents the fishing skill from having an effect on the minigame and experience from being awarded -#define FISHING_MINIGAME_RULE_NO_EXP (1 << 5) +#define FISHING_MINIGAME_RULE_NO_EXP (1 << 3) ///If enabled, the minigame will occasionally screw around and invert the velocity of the bait -#define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 6) +#define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 4) ///Will filp the minigame hud for the duration of the effect -#define FISHING_MINIGAME_RULE_FLIP (1 << 7) +#define FISHING_MINIGAME_RULE_FLIP (1 << 5) ///all the effects that are active and will last for a few seconds before triggering a cooldown #define FISHING_MINIGAME_ACTIVE_EFFECTS (FISHING_MINIGAME_RULE_ANTIGRAV|FISHING_MINIGAME_RULE_FLIP) @@ -90,6 +97,7 @@ #define AQUARIUM_LAYER_MODE_BOTTOM "bottom" #define AQUARIUM_LAYER_MODE_TOP "top" #define AQUARIUM_LAYER_MODE_AUTO "auto" +#define AQUARIUM_LAYER_MODE_BEHIND_GLASS "behind_glass" #define FISH_ALIVE "alive" #define FISH_DEAD "dead" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f164c78d422..efcc3a4fbd8 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -7,7 +7,7 @@ #define WEIGHT_CLASS_SMALL 2 /// Standard backpacks can carry tiny, small & normal items, (e.g. fire extinguisher, stun baton, gas mask, metal sheets) #define WEIGHT_CLASS_NORMAL 3 -/// Items that can be weilded or equipped but not stored in an inventory, (e.g. defibrillator, backpack, space suits) +/// Items that can be wielded or equipped but not stored in an inventory, (e.g. defibrillator, backpack, space suits) #define WEIGHT_CLASS_BULKY 4 /// Usually represents objects that require two hands to operate, (e.g. shotgun, two-handed melee weapons) #define WEIGHT_CLASS_HUGE 5 diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 1ba6879005b..0a9ea44aaa8 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -197,7 +197,7 @@ #define MOB_SHIELD_LAYER 4.01 #define MOB_ABOVE_PIGGYBACK_LAYER 4.06 #define MOB_UPPER_LAYER 4.07 -#define HITSCAN_PROJECTILE_LAYER 4.09 //above all mob but still hidden by FoV +#define HITSCAN_PROJECTILE_LAYER 4.09 #define ABOVE_MOB_LAYER 4.1 #define WALL_OBJ_LAYER 4.25 #define TRAM_SIGNAL_LAYER 4.26 diff --git a/code/__DEFINES/map_exporter.dm b/code/__DEFINES/map_exporter.dm new file mode 100644 index 00000000000..becedcd23e5 --- /dev/null +++ b/code/__DEFINES/map_exporter.dm @@ -0,0 +1,14 @@ +//Bits to save +#define SAVE_OBJECTS (1 << 1) //! Save objects? +#define SAVE_MOBS (1 << 2) //! Save Mobs? +#define SAVE_TURFS (1 << 3) //! Save turfs? +#define SAVE_AREAS (1 << 4) //! Save areas? +#define SAVE_SPACE (1 << 5) //! Save space areas? (If not they will be saved as NOOP) +#define SAVE_OBJECT_PROPERTIES (1 << 6) //! Save custom properties of objects (obj.on_object_saved() output) + +//Ignore turf if it contains +#define SAVE_SHUTTLEAREA_DONTCARE 0 +#define SAVE_SHUTTLEAREA_IGNORE 1 +#define SAVE_SHUTTLEAREA_ONLY 2 + +#define DMM2TGM_MESSAGE "MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE" diff --git a/code/__DEFINES/mecha.dm b/code/__DEFINES/mecha.dm index 5a37f60aba6..33c8ca373a7 100644 --- a/code/__DEFINES/mecha.dm +++ b/code/__DEFINES/mecha.dm @@ -6,7 +6,7 @@ #define PANEL_OPEN (1<<0) #define ID_LOCK_ON (1<<1) -#define CANSTRAFE (1<<2) +#define CAN_STRAFE (1<<2) #define LIGHTS_ON (1<<3) #define SILICON_PILOT (1<<4) #define IS_ENCLOSED (1<<5) @@ -46,7 +46,9 @@ #define MECHA_SNOWFLAKE_ID_AIR_TANK "air_tank_snowflake" #define MECHA_SNOWFLAKE_ID_WEAPON_BALLISTIC "ballistic_weapon_snowflake" #define MECHA_SNOWFLAKE_ID_GENERATOR "generator_snowflake" +#define MECHA_SNOWFLAKE_ID_ORE_SCANNER "orescanner_snowflake" #define MECHA_SNOWFLAKE_ID_CLAW "lawclaw_snowflake" +#define MECHA_SNOWFLAKE_ID_RCD "rcd_snowflake" #define MECHA_AMMO_INCENDIARY "Incendiary bullet" #define MECHA_AMMO_BUCKSHOT "Buckshot shell" diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index 6cc9f47fa18..9bef3e32d0d 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -2,7 +2,6 @@ #define MARTIALART_BOXING "boxing" #define MARTIALART_CQC "CQC" -#define MARTIALART_HUGS_OF_THE_GONDOLA "hugs of the gondola" #define MARTIALART_KRAVMAGA "krav maga" #define MARTIALART_MUSHPUNCH "mushroom punch" #define MARTIALART_PLASMAFIST "plasma fist" diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm new file mode 100644 index 00000000000..2f4b5446476 --- /dev/null +++ b/code/__DEFINES/mining.dm @@ -0,0 +1,47 @@ +// Defines related to the mining rework circa June 2023 +/// Durability of a large size boulder from a large size vent. +#define BOULDER_SIZE_LARGE 15 +/// Durability of a medium size boulder from a medium size vent. +#define BOULDER_SIZE_MEDIUM 10 +/// Durability of a small size boulder from a small size vent. +#define BOULDER_SIZE_SMALL 5 +/// How many boulders can a single ore vent have on it's tile before it stops producing more? +#define MAX_BOULDERS_PER_VENT 10 +/// Time multiplier +#define INATE_BOULDER_SPEED_MULTIPLIER 3 +// Vent type +/// Large vents, giving large boulders. +#define LARGE_VENT_TYPE "large" +/// Medium vents, giving medium boulders. +#define MEDIUM_VENT_TYPE "medium" +/// Small vents, giving small boulders. +#define SMALL_VENT_TYPE "small" + +/// Proximity to a vent that a wall ore needs to be for 5 ore to be mined. +#define VENT_PROX_VERY_HIGH 3 +/// Proximity to a vent that a wall ore needs to be for 4 ore to be mined. +#define VENT_PROX_HIGH 6 +/// Proximity to a vent that a wall ore needs to be for 3 ore to be mined. +#define VENT_PROX_MEDIUM 15 +/// Proximity to a vent that a wall ore needs to be for 2 ore to be mined. +#define VENT_PROX_LOW 32 +/// Proximity to a vent that a wall ore needs to be for 1 ore to be mined. +#define VENT_PROX_FAR 64 + +/// The chance of ore spawning in a wall that is VENT_PROX_VERY_HIGH tiles to a vent. +#define VENT_CHANCE_VERY_HIGH 75 +/// The chance of ore spawning in a wall that is VENT_PROX_HIGH tiles to a vent. +#define VENT_CHANCE_HIGH 18 +/// The chance of ore spawning in a wall that is VENT_PROX_MEDIUM tiles to a vent. +#define VENT_CHANCE_MEDIUM 9 +/// The chance of ore spawning in a wall that is VENT_PROX_LOW tiles to a vent. +#define VENT_CHANCE_LOW 5 +/// The chance of ore spawning in a wall that is VENT_PROX_FAR tiles to a vent. +#define VENT_CHANCE_FAR 1 + +/// The number of points a miner gets for discovering a vent, multiplied by BOULDER_SIZE when completing a wave defense minus the discovery bonus. +#define MINER_POINT_MULTIPLIER 100 +/// The multiplier that gets applied for automatically generated mining points. +#define MINING_POINT_MACHINE_MULTIPLIER 0.8 + + diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 75d4ef4944a..d01a5296ab0 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -489,10 +489,6 @@ #define FLASH_PROTECTION_FLASH 1 #define FLASH_PROTECTION_WELDER 2 -// Roundstart trait system - -#define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart - // AI Toggles #define AI_CAMERA_LUMINOSITY 5 #define AI_VOX // Comment out if you don't want VOX to be enabled and have players download the voice sounds. diff --git a/code/__DEFINES/modular_computer.dm b/code/__DEFINES/modular_computer.dm index f8f666cfc63..a8e5c38ffc6 100644 --- a/code/__DEFINES/modular_computer.dm +++ b/code/__DEFINES/modular_computer.dm @@ -28,6 +28,8 @@ #define PROGRAM_HEADER (1<<4) ///The program will run despite the ModPC not having any power in it. #define PROGRAM_RUNS_WITHOUT_POWER (1<<5) +///The circuit ports of this program can be triggered even if the program is not open +#define PROGRAM_CIRCUITS_RUN_WHEN_CLOSED (1<<6) //Program categories #define PROGRAM_CATEGORY_DEVICE "Device Tools" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 9427328fcc2..8ace303b843 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -68,28 +68,26 @@ #define VOICEBOX_TOGGLABLE (1<<6) /// The voicebox is currently turned off. #define VOICEBOX_DISABLED (1<<7) -/// Prevents shovies against a dense object from knocking the wearer down. -#define BLOCKS_SHOVE_KNOCKDOWN (1<<8) /// Prevents knock-off from things like hat-throwing. -#define SNUG_FIT (1<<9) +#define SNUG_FIT (1<<8) /// Hats with negative effects when worn (i.e the tinfoil hat). -#define ANTI_TINFOIL_MANEUVER (1<<10) +#define ANTI_TINFOIL_MANEUVER (1<<9) /// Clothes that cause a larger notification when placed on a person. -#define DANGEROUS_OBJECT (1<<11) +#define DANGEROUS_OBJECT (1<<10) /// Clothes that use large icons, for applying the proper overlays like blood -#define LARGE_WORN_ICON (1<<12) +#define LARGE_WORN_ICON (1<<11) /// Clothes that block speech (i.e the muzzle). Can be applied to any clothing piece. -#define BLOCKS_SPEECH (1<<13) +#define BLOCKS_SPEECH (1<<12) /// prevents from placing on plasmaman helmet or modsuit hat holder -#define STACKABLE_HELMET_EXEMPT (1<<14) +#define STACKABLE_HELMET_EXEMPT (1<<13) /// Prevents plasmamen from igniting when wearing this -#define PLASMAMAN_PREVENT_IGNITION (1<<15) +#define PLASMAMAN_PREVENT_IGNITION (1<<14) /// Usable as casting clothes by wizards (matters for suits, glasses and headwear) -#define CASTING_CLOTHES (1<<16) +#define CASTING_CLOTHES (1<<15) ///Moths can't eat the clothing that has this flag. -#define INEDIBLE_CLOTHING (1<<17) +#define INEDIBLE_CLOTHING (1<<16) /// Headgear/helmet allows internals -#define HEADINTERNALS (1<<18) +#define HEADINTERNALS (1<<17) /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing diff --git a/code/__DEFINES/polls.dm b/code/__DEFINES/polls.dm index a5a0616d8d4..435e9f60141 100644 --- a/code/__DEFINES/polls.dm +++ b/code/__DEFINES/polls.dm @@ -5,3 +5,14 @@ #define POLLTYPE_RATING "NUMVAL" #define POLLTYPE_MULTI "MULTICHOICE" #define POLLTYPE_IRV "IRV" + +///The message sent when you sign up to a poll. +#define POLL_RESPONSE_SIGNUP "signup" +///The message sent when you've already signed up for a poll and are trying to sign up again. +#define POLL_RESPONSE_ALREADY_SIGNED "already_signed" +///The message sent when you are not signed up for a poll. +#define POLL_RESPONSE_NOT_SIGNED "not_signed" +///The message sent when you are too late to unregister from a poll. +#define POLL_RESPONSE_TOO_LATE_TO_UNREGISTER "failed_unregister" +///The message sent when you successfully unregister from a poll. +#define POLL_RESPONSE_UNREGISTERED "unregistered" diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm index 64a85afc217..59410564928 100644 --- a/code/__DEFINES/research/slimes.dm +++ b/code/__DEFINES/research/slimes.dm @@ -1,7 +1,13 @@ +#define SLIME_LIFE_STAGE_BABY "baby" +#define SLIME_LIFE_STAGE_ADULT "adult" + +#define SLIME_MIN_POWER 0 +#define SLIME_MEDIUM_POWER 5 +#define SLIME_MAX_POWER 10 + // Just slimin' here. -// Warning: These defines are used for slime cores and their icon states, so if you -// touch these names, remember to update icons/mob/simple/slimes.dmi and the respective -// slime core paths too! +// Warning: These defines are used for slime icon states, so if you +// touch these names, remember to update icons/mob/simple/slimes.dmi! #define SLIME_TYPE_ADAMANTINE "adamantine" #define SLIME_TYPE_BLACK "black" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 501a010b341..c4bd9fb7c9f 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -86,6 +86,7 @@ #define ROLE_SLAUGHTER_DEMON "Slaughter Demon" #define ROLE_WIZARD_APPRENTICE "apprentice" #define ROLE_SYNDICATE_MONKEY "Syndicate Monkey Agent" +#define ROLE_CONTRACTOR_SUPPORT "Contractor Support Unit" //Spawner roles #define ROLE_ANCIENT_CREW "Ancient Crew" diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index 76e5fa22d47..5404cebed97 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -118,7 +118,7 @@ #define rustg_dmi_icon_states(fname) RUSTG_CALL(RUST_G, "dmi_icon_states")(fname) #define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname) -#define rustg_file_exists(fname) RUSTG_CALL(RUST_G, "file_exists")(fname) +#define rustg_file_exists(fname) (RUSTG_CALL(RUST_G, "file_exists")(fname) == "true") #define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname) #define rustg_file_append(text, fname) RUSTG_CALL(RUST_G, "file_append")(text, fname) #define rustg_file_get_line_count(fname) text2num(RUSTG_CALL(RUST_G, "file_get_line_count")(fname)) @@ -129,7 +129,13 @@ #define text2file(text, fname) rustg_file_append(text, "[fname]") #endif +/// Returns the git hash of the given revision, ex. "HEAD". #define rustg_git_revparse(rev) RUSTG_CALL(RUST_G, "rg_git_revparse")(rev) + +/** + * Returns the date of the given revision in the format YYYY-MM-DD. + * Returns null if the revision is invalid. + */ #define rustg_git_commit_date(rev) RUSTG_CALL(RUST_G, "rg_git_commit_date")(rev) #define RUSTG_HTTP_METHOD_GET "get" diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index d5f1496079f..a8a6cd673f7 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -5,6 +5,7 @@ #define RADIO_EXTENSION "department specific" #define RADIO_KEY "department specific key" #define LANGUAGE_EXTENSION "language specific" +#define SAY_MOD_VERB "say_mod_verb" //Message modes. Each one defines a radio channel, more or less. //if you use ! as a mode key for some ungodly reason, change the first character for ion_num() so get_message_mode() doesn't freak out with state law prompts - shiz. diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index e870e9de7a6..f6ecde7c2e1 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -43,3 +43,6 @@ #define FISHING_SKILL_DIFFIULTY_EXP_MULT 0.015 ///How much exp one would gain per spent playing the fishing minigame at minimum difficulty. the time is multiplied by 0.1 because deciseconds... #define FISHING_SKILL_EXP_PER_SECOND (SKILL_EXP_LEGENDARY / (15 MINUTES * 0.1)) + +///The base modifier a boulder's size grants to the mining skill. +#define MINING_SKILL_BOULDER_SIZE_XP 10 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index d95973e3fdb..6890fd2ca50 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -234,3 +234,4 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_TREE_CHOP "tree_chop" #define SFX_ROCK_TAP "rock_tap" #define SFX_SEAR "sear" +#define SFX_REEL "reel" diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index a30e980770b..bf918b55efc 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -72,6 +72,7 @@ #define span_linkify(str) ("" + str + "") #define span_looc(str) ("" + str + "") #define span_major_announcement_text(str) ("" + str + "") +#define span_major_announcement_title(str) ("" + str + "") #define span_medal(str) ("" + str + "") #define span_medradio(str) ("" + str + "") #define span_memo(str) ("" + str + "") @@ -88,6 +89,7 @@ #define span_notice(str) ("" + str + "") #define span_noticealien(str) ("" + str + "") #define span_ooc(str) ("" + str + "") +#define span_ooc_announcement_text(str) ("" + str + "") #define span_papyrus(str) ("" + str + "") #define span_phobia(str) ("" + str + "") #define span_prefix(str) ("" + str + "") @@ -121,6 +123,7 @@ #define span_spiderbroodmother(str) ("" + str + "") #define span_spiderscout(str) ("" + str + "") #define span_spiderbreacher(str) ("" + str + "") +#define span_subheader_announcement_text(str) ("" + str + "") #define span_suicide(str) ("" + str + "") #define span_suppradio(str) ("" + str + "") #define span_syndradio(str) ("" + str + "") diff --git a/code/__DEFINES/station.dm b/code/__DEFINES/station.dm index 63430b52c37..5a04961429f 100644 --- a/code/__DEFINES/station.dm +++ b/code/__DEFINES/station.dm @@ -2,6 +2,13 @@ #define STATION_TRAIT_NEUTRAL 2 #define STATION_TRAIT_NEGATIVE 3 +///Defines for the cost of different station traits. This one is the default. +#define STATION_TRAIT_COST_FULL 1 +///Cost for smaller traits that could fly under the radar, and are only minorly negative/positive if not neutral. +#define STATION_TRAIT_COST_LOW 0.5 +///Cost for very little, and mainly neutral traits that hardly amount to anything really that interesting. +#define STATION_TRAIT_COST_MINIMAL 0.3 + /// Only run on planet stations #define STATION_TRAIT_PLANETARY (1<<0) /// Only run on space stations diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index d227744ddd1..2002e899a61 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -164,8 +164,8 @@ #define INIT_ORDER_ECONOMY 40 #define INIT_ORDER_OUTPUTS 35 #define INIT_ORDER_RESTAURANT 34 -#define INIT_ORDER_POLLUTION 32 //SKYRAT EDIT ADDITION - //Needs to be above atoms #define INIT_ORDER_TTS 33 +#define INIT_ORDER_POLLUTION 32 //SKYRAT EDIT ADDITION - //Needs to be above atoms #define INIT_ORDER_ATOMS 30 #define INIT_ORDER_ARMAMENTS 27 // SKYRAT EDIT ADDITION - Needs to be between atoms and default so it runs before gun companies #define INIT_ORDER_LANGUAGE 25 @@ -187,6 +187,7 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 +#define INIT_ORDER_MATURITY_GUARD -60 //SKYRAT EDIT ADDITION #define INIT_ORDER_DECAY -61 //SKYRAT EDIT ADDITION #define INIT_ORDER_EXPLOSIONS -69 #define INIT_ORDER_STATPANELS -97 diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index c6596ea46c1..fdfec5e8ca0 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "7.0.0" +#define TGS_DMAPI_VERSION "7.0.2" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -426,6 +426,7 @@ /** * Send a message to connected chats. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. @@ -435,6 +436,7 @@ /** * Send a private message to a specific user. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * user: The [/datum/tgs_chat_user] to PM. @@ -444,6 +446,7 @@ /** * Send a message to connected chats that are flagged as game-related in TGS. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 00a85d61995..1935c3c0aee 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -38,6 +38,7 @@ #define MONKEYDAY "Monkey Day" #define PRIDE_WEEK "Pride Week" #define MOTH_WEEK "Moth Week" +#define IAN_HOLIDAY "Ian's Birthday" /* Days of the week to make it easier to reference them. diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 9f36c8b8c21..0630f2f1556 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -211,6 +211,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOOD_DEFICIENCY "blood_deficiency" #define TRAIT_JOLLY "jolly" #define TRAIT_NOCRITDAMAGE "no_crit" +/// Prevents shovies against a dense object from knocking them down. +#define TRAIT_SHOVE_KNOCKDOWN_BLOCKED "shove_knockdown_blocked" +/// Prevents staggering. +#define TRAIT_NO_STAGGER "no_stagger" +/// Getting hit by thrown movables won't push you away +#define TRAIT_NO_THROW_HITPUSH "no_throw_hitpush" ///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward. #define TRAIT_REVEAL_FISH "reveal_fish" @@ -419,6 +425,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SUPERMATTER_SOOTHER "supermatter_soother" /// Mob has fov applied to it #define TRAIT_FOV_APPLIED "fov_applied" +/// Mob is using the scope component +#define TRAIT_USER_SCOPED "user_scoped" /// Trait added when a revenant is visible. #define TRAIT_REVENANT_REVEALED "revenant_revealed" @@ -500,6 +508,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Sells for more money on the pirate bounty pad. #define TRAIT_HIGH_VALUE_RANSOM "high_value_ransom" +/// Makes the user handcuff others faster +#define TRAIT_FAST_CUFFING "fast_cuffing" + // METABOLISMS // Various jobs on the station have historically had better reactions // to various drinks and foodstuffs. Security liking donuts is a classic @@ -790,6 +801,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PDA_CAN_EXPLODE "pda_can_explode" ///The download speeds of programs from the dowloader is halved. #define TRAIT_MODPC_HALVED_DOWNLOAD_SPEED "modpc_halved_download_speed" +///Dictates whether a user (source) is interacting with the frame of a stationary modular computer or the pc inside it. Needed for circuits I guess. +#define TRAIT_MODPC_INTERACTING_WITH_FRAME "modpc_interacting_with_frame" /// If present on a [/mob/living/carbon], will make them appear to have a medium level disease on health HUDs. #define TRAIT_DISEASELIKE_SEVERITY_MEDIUM "diseaselike_severity_medium" @@ -889,6 +902,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOB_ALLY "blob_ally" ///Traits given by station traits +#define STATION_TRAIT_ASSISTANT_GIMMICKS "station_trait_assistant_gimmicks" #define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments" #define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods" #define STATION_TRAIT_BIRTHDAY "station_trait_birthday" @@ -917,6 +931,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This atom is currently spinning. #define TRAIT_SPINNING "spinning" +/// This limb can't be torn open anymore +#define TRAIT_IMMUNE_TO_CRANIAL_FISSURE "immune_to_cranial_fissure" +/// Trait given if the mob has a cranial fissure. +#define TRAIT_HAS_CRANIAL_FISSURE "has_cranial_fissure" + /// Denotes that this id card was given via the job outfit, aka the first ID this player got. #define TRAIT_JOB_FIRST_ID_CARD "job_first_id_card" /// ID cards with this trait will attempt to forcibly occupy the front-facing ID card slot in wallets. @@ -1023,6 +1042,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to foam darts that have an insert in them #define TRAIT_DART_HAS_INSERT "dart_has_insert" +/// Trait determines if this mob has examined an eldritch painting +#define TRAIT_ELDRITCH_PAINTING_EXAMINE "eldritch_painting_examine" + +/// Trait used by the /datum/brain_trauma/severe/flesh_desire trauma to change their preferences of what they eat +#define TRAIT_FLESH_DESIRE "flesh_desire" + ///Trait granted by janitor skillchip, allows communication with cleanbots #define TRAIT_CLEANBOT_WHISPERER "cleanbot_whisperer" @@ -1035,4 +1060,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait which self-identifies as an enemy of the law #define TRAIT_ALWAYS_WANTED "always_wanted" +/// Trait which means whatever has this is dancing by a dance machine +#define TRAIT_DISCO_DANCER "disco_dancer" + +/// That which allows mobs to instantly break down boulders. +#define TRAIT_INSTANTLY_PROCESSES_BOULDERS "instantly_processes_boulders" + +/// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process()) +#define TRAIT_BOULDER_BREAKER "boulder_breaker" + // END TRAIT DEFINES diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 79c188cd481..678a3fa80b9 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -123,6 +123,8 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list( #define WOUND_SERIES_FLESH_PUNCTURE_BLEED "wound_series_flesh_puncture_bleed" /// Generic loss wounds. See loss.dm #define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic" +/// Cranial fissure wound. +#define WOUND_SERIES_CRANIAL_FISSURE "wound_series_cranial_fissure" // SKYRAT EDIT ADDITION BEGIN - MUSCLE AND SYNTH WOUNDS // Have to put it here so I can use it in the global list of wound series diff --git a/code/__DEFINES/zoom.dm b/code/__DEFINES/zoom.dm new file mode 100644 index 00000000000..590e0c47500 --- /dev/null +++ b/code/__DEFINES/zoom.dm @@ -0,0 +1,6 @@ +///How the scope component is toggled. This one is done by right-clicking. +#define ZOOM_METHOD_RIGHT_CLICK 1 +/// Wielding the object with both hands toggles the zoom. Requires the two-handed component to work. +#define ZOOM_METHOD_WIELD 2 +/// Activated by clicking an item action button specified by the `item_action_type` var. +#define ZOOM_METHOD_ITEM_ACTION 3 diff --git a/code/__DEFINES/~skyrat_defines/colony_fabricator_misc.dm b/code/__DEFINES/~skyrat_defines/colony_fabricator_misc.dm index d9012ad0869..1b358da8b11 100644 --- a/code/__DEFINES/~skyrat_defines/colony_fabricator_misc.dm +++ b/code/__DEFINES/~skyrat_defines/colony_fabricator_misc.dm @@ -6,6 +6,15 @@ #define RND_CATEGORY_AKHTER_MEDICAL "Emergency Medical" /// Category for resources made by the organics printer #define RND_CATEGORY_AKHTER_RESOURCES "Resources" + +/// Category for ingredients in the ration printer +#define RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS "Ingredients" +/// Category for bags and containers of reagents in the ration printer +#define RND_CATEGORY_AKHTER_FOODRICATOR_BAGS "Containers" +/// Category for snacks in the ration printer +#define RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS "Luxuries" +/// Category for utensils and whatnot in the ration printer +#define RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS "Utensils" /// Category for the seeds the organics printer can make #define RND_CATEGORY_AKHTER_SEEDS "Synthesized Seeds" diff --git a/code/__DEFINES/~skyrat_defines/combat.dm b/code/__DEFINES/~skyrat_defines/combat.dm index 360a755615b..c02b89b7f6e 100644 --- a/code/__DEFINES/~skyrat_defines/combat.dm +++ b/code/__DEFINES/~skyrat_defines/combat.dm @@ -11,6 +11,9 @@ #define GET_UP_MEDIUM 1.5 #define GET_UP_SLOW 3 +#define PERSONAL_SPACE_DAMAGE 2 +#define ASS_SLAP_EXTRA_RANGE -1 + //Stamina threshold for attacking slower with items #define STAMINA_THRESHOLD_TIRED_CLICK_CD 120 #define CLICK_CD_RANGE_TIRED 5 //#define CLICK_CD_RANGE 4, so 25% slower @@ -23,6 +26,7 @@ // Damage modifiers #define OVERSIZED_HARM_DAMAGE_BONUS 5 /// Those with the oversized trait do 5 more damage. +#define OVERSIZED_KICK_EFFECTIVENESS_BONUS 5 /// Increased unarmed_effectiveness/stun threshold on oversized kicks. #define FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, color="#04080F") diff --git a/code/__DEFINES/~~bubber_defines/misc.dm b/code/__DEFINES/~~bubber_defines/misc.dm index d33bf8bc2f5..520f42f69e3 100644 --- a/code/__DEFINES/~~bubber_defines/misc.dm +++ b/code/__DEFINES/~~bubber_defines/misc.dm @@ -1,5 +1,5 @@ -GLOBAL_DATUM_INIT(has_no_eol_punctuation, /regex, regex("\\w$")) -GLOBAL_DATUM_INIT(noncapital_i, /regex, regex("\\b\[i]\\b", "g")) +/* GLOBAL_DATUM_INIT(has_no_eol_punctuation, /regex, regex("\\w$")) +GLOBAL_DATUM_INIT(noncapital_i, /regex, regex("\\b\[i]\\b", "g")) */ // TODO: REMOVE THIS IN FAVOUR OF THE SKYRAT FILE. //Auto punctuation global datums // The alpha channel gained upon ghosting diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 918428daf77..7af30c8d972 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -97,6 +97,19 @@ LAZYINITLIST(lazy_list[key]); \ lazy_list[key] |= value; +///Ensures the length of a list is at least I, prefilling it with V if needed. if V is a proc call, it is repeated for each new index so that list() can just make a new list for each item. +#define LISTASSERTLEN(L, I, V...) \ + if (length(L) < I) { \ + var/_OLD_LENGTH = length(L); \ + L.len = I; \ + /* Convert the optional argument to a if check */ \ + for (var/_USELESS_VAR in list(V)) { \ + for (var/_INDEX_TO_ASSIGN_TO in _OLD_LENGTH+1 to I) { \ + L[_INDEX_TO_ASSIGN_TO] = V; \ + } \ + } \ + } + #define reverseList(L) reverse_range(L.Copy()) /// Passed into BINARY_INSERT to compare keys @@ -403,10 +416,8 @@ * Returns TRUE if the list had nulls, FALSE otherwise **/ /proc/list_clear_nulls(list/list_to_clear) - var/start_len = list_to_clear.len - var/list/new_list = new(start_len) - list_to_clear -= new_list - return list_to_clear.len < start_len + return (list_to_clear.RemoveAll(null) > 0) + /** * Removes any empty weakrefs from the list diff --git a/code/__HELPERS/announcements.dm b/code/__HELPERS/announcements.dm index d0deab12e99..d8653a2eb05 100644 --- a/code/__HELPERS/announcements.dm +++ b/code/__HELPERS/announcements.dm @@ -16,21 +16,19 @@ * * play_sound - if TRUE, play a sound with the announcement (based on player option) * * sound_override - optional, override the default announcement sound * * sender_override - optional, modifies the sender of the announcement - * * encode_title - if TRUE, the title will be HTML encoded - * * encode_text - if TRUE, the text will be HTML encoded - * * color_override - optional, set a color for the announcement box + * * encode_title - if TRUE, the title will be HTML encoded (escaped) + * * encode_text - if TRUE, the text will be HTML encoded (escaped) */ -/proc/send_formatted_announcement( +/proc/send_ooc_announcement( text, title = "", players, play_sound = TRUE, - sound_override = 'sound/ai/default/attention.ogg', + sound_override = 'sound/misc/bloop.ogg', sender_override = "Server Admin Announcement", encode_title = TRUE, - encode_text = TRUE, - color_override = "grey", + encode_text = FALSE, ) if(isnull(text)) return @@ -44,24 +42,25 @@ if(!length(text)) return - announcement_strings += span_announcement_header(generate_unique_announcement_header(title, sender_override)) - announcement_strings += span_major_announcement_text(text) - var/finalized_announcement = create_announcement_div(jointext(announcement_strings, ""), color_override) + announcement_strings += span_major_announcement_title(sender_override) + announcement_strings += span_subheader_announcement_text(title) + announcement_strings += span_ooc_announcement_text(text) + var/finalized_announcement = create_ooc_announcement_div(jointext(announcement_strings, "")) - if(islist(players)) - for(var/mob/target in players) - to_chat(target, finalized_announcement) - if(play_sound && target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements)) - SEND_SOUND(target, sound(sound_override)) - else - to_chat(world, finalized_announcement) + if(islist(players)) + for(var/mob/target in players) + to_chat(target, finalized_announcement) + if(play_sound && target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements)) + SEND_SOUND(target, sound(sound_override)) + else + to_chat(world, finalized_announcement) - if(!play_sound) - return + if(!play_sound) + return - for(var/mob/player in GLOB.player_list) - if(player.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements)) - SEND_SOUND(player, sound(sound_override)) + for(var/mob/player in GLOB.player_list) + if(player.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements)) + SEND_SOUND(player, sound(sound_override)) /** * Inserts a span styled message into an alert box div @@ -72,5 +71,14 @@ * * color - optional, set a div color other than default */ /proc/create_announcement_div(message, color = "default") - var/processed_message = "
[message]
" - return processed_message + return "
[message]
" + +/** + * Inserts a span styled message into an OOC alert style div + * + * + * Arguments + * * message - required, the message contents + */ +/proc/create_ooc_announcement_div(message) + return "
[message]
" diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 7b21ee3f0ef..8df182c90d0 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -1,9 +1,11 @@ #define BP_MAX_ROOM_SIZE 300 -GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/engineering/main, \ - /area/station/engineering/supermatter, \ - /area/station/engineering/atmospherics_engine, \ - /area/station/ai_monitored/turret_protected/ai)) +GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list( + /area/station/engineering/main, + /area/station/engineering/supermatter, + /area/station/engineering/atmospherics_engine, + /area/station/ai_monitored/turret_protected/ai, +))) // Gets an atmos isolated contained space // Returns an associative list of turf|dirs pairs @@ -271,13 +273,11 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en // Now their turfs var/list/turfs = list() for(var/area/pull_from as anything in areas_to_pull) - var/list/our_turfs = pull_from.get_contained_turfs() - if(target_z == 0) - turfs += our_turfs + if (target_z == 0) + for (var/list/zlevel_turfs as anything in pull_from.get_zlevel_turf_lists()) + turfs += zlevel_turfs else - for(var/turf/turf_in_area as anything in our_turfs) - if(target_z == turf_in_area.z) - turfs += turf_in_area + turfs += pull_from.get_turfs_by_zlevel(target_z) return turfs diff --git a/code/__HELPERS/chat_filter.dm b/code/__HELPERS/chat_filter.dm index b395da3d7aa..34d811bf85b 100644 --- a/code/__HELPERS/chat_filter.dm +++ b/code/__HELPERS/chat_filter.dm @@ -85,6 +85,14 @@ return null +///Given a pda message, will replace any match in the message with grawlixs. +/proc/censor_ic_filter_for_pdas(message) + if(config.ic_outside_pda_filter_regex) + message = config.ic_outside_pda_filter_regex.Replace(message, GLOBAL_PROC_REF(grawlix)) + if(config.soft_ic_outside_pda_filter_regex) + message = config.soft_ic_outside_pda_filter_regex.Replace(message, GLOBAL_PROC_REF(grawlix)) + return message + /// Logs to the filter log with the given message, match, and scope /proc/log_filter(scope, message, filter_result) log_filter_raw("[scope] filter:\n\tMessage: [message]\n\tFilter match: [filter_result[CHAT_FILTER_INDEX_WORD]]") diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index 9cc7d112532..f7b0ece13f8 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -59,3 +59,63 @@ return null . = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit) + +/** + * divides a list of materials uniformly among all contents of the target_object reccursively + * Used to set materials of printed items with their design cost by taking into consideration their already existing materials + * e.g. if 12 iron is to be divided uniformly among 2 objects A, B who's current iron contents are 3 & 7 + * Then first we normalize those values i.e. find their weights to decide who gets an higher share of iron + * total_sum = 3 + 7 = 10, A = 3/10 = 0.3, B = 7/10 = 0.7 + * Then we finally multiply those weights with the user value of 12 we get + * A = 0.3 * 12 = 3.6, B = 0.7 * 12 = 8.4 i.e. 3.6 + 8.4 = 12!! + * Off course we round the values so we don't have to deal with floating point materials so the actual value + * ends being less but that's not an issue + * Arguments + * + * * [custom_materials][list] - the list of materials to set for the object + * * multiplier - multiplier passed to set_custom_materials + * * [target_object][atom] - the target object who's custom materials we are trying to modify + */ +/proc/split_materials_uniformly(list/custom_materials, multiplier, atom/target_object) + if(!length(target_object.contents)) //most common case where the object is just 1 thing + target_object.set_custom_materials(custom_materials, multiplier) + return + + //Step 1: Get reccursive contents of all objects, only filter obj cause that what's material container accepts + var/list/reccursive_contents = target_object.get_all_contents_type(/obj/item) + + //Step 2: find the sum of each material type per object and record their amounts into an 2D list + var/list/material_map_sum = list() + var/list/material_map_amounts = list() + for(var/atom/object as anything in reccursive_contents) + var/list/item_materials = object.custom_materials + for(var/mat as anything in custom_materials) + var/mat_amount = 1 //no materials mean we assign this default amount + if(length(item_materials)) + mat_amount = item_materials[mat] || 1 //if this object doesn't have our material type then assign a default value of 1 + + //record the sum of mats for normalizing + material_map_sum[mat] += mat_amount + //record the material amount for each item into an 2D list + var/list/mat_list_per_item = material_map_amounts[mat] + if(isnull(mat_list_per_item)) + material_map_amounts[mat] = list(mat_amount) + else + mat_list_per_item += mat_amount + + //Step 3: normalize & scale material_map_amounts with material_map_sum + for(var/mat as anything in material_map_amounts) + var/mat_sum = material_map_sum[mat] + var/list/mat_per_item = material_map_amounts[mat] + for(var/i in 1 to mat_per_item.len) + mat_per_item[i] = (mat_per_item[i] / mat_sum) * custom_materials[mat] + + //Step 4 flatten the 2D list and assign the final values to each atom + var/index = 1 + for(var/atom/object as anything in reccursive_contents) + var/list/final_material_list = list() + for(var/mat as anything in material_map_amounts) + var/list/mat_per_item = material_map_amounts[mat] + final_material_list[mat] = mat_per_item[index] + object.set_custom_materials(final_material_list, multiplier) + index += 1 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 99c7dd562ea..0aaca9a0907 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -271,7 +271,7 @@ if(!current_apc.cell || !SSmapping.level_trait(current_apc.z, ZTRAIT_STATION)) continue var/area/apc_area = current_apc.area - if(GLOB.typecache_powerfailure_safe_areas[apc_area.type]) + if(is_type_in_typecache(apc_area, GLOB.typecache_powerfailure_safe_areas)) continue var/duration = rand(duration_min,duration_max) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index acb03151f1d..2d8fc3bf684 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -194,7 +194,7 @@ world /icon/proc/ColorTone(tone) GrayScale() - var/list/TONE = ReadRGB(tone) + var/list/TONE = rgb2num(tone) var/gray = round(TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11, 1) var/icon/upper = (255-gray) ? new(src) : null @@ -1498,7 +1498,7 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) var/list/icon_dimensions = get_icon_dimensions(source.icon) var/width = icon_dimensions["width"] var/height = icon_dimensions["height"] - + if(width > world.icon_size) alert_overlay.pixel_x = -(world.icon_size / 2) * ((width - world.icon_size) / world.icon_size) if(height > world.icon_size) diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index 5a0d5c3f002..98e11b483ba 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -442,3 +442,31 @@ if(our_area == get_area(carbon)) return FALSE return TRUE + +/** + * Behaves like the orange() proc, but only looks in the outer range of the function (The "peel" of the orange). + * This is useful for things like checking if a mob is in a certain range, but not within a smaller range. + * + * @params outer_range - The outer range of the cicle to pull from. + * @params inner_range - The inner range of the circle to NOT pull from. + * @params center - The center of the circle to pull from, can be an atom (we'll apply get_turf() to it within circle_x_turfs procs.) + * @params view_based - If TRUE, we'll use circle_view_turfs instead of circle_range_turfs procs. + */ +/proc/turf_peel(outer_range, inner_range, center, view_based = FALSE) + if(inner_range > outer_range) // If the inner range is larger than the outer range, you're using this wrong. + CRASH("Turf peel inner range is larger than outer range!") + var/list/peel = list() + var/list/outer + var/list/inner + if(view_based) + outer = circle_view_turfs(center, outer_range) + inner = circle_view_turfs(center, inner_range) + else + outer = circle_range_turfs(center, outer_range) + inner = circle_range_turfs(center, inner_range) + for(var/turf/possible_spawn as anything in outer) + if(possible_spawn in inner) + continue + peel += possible_spawn + return peel + diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 1e39cd6eaf3..e2fb0203a3e 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -1196,3 +1196,10 @@ GLOBAL_LIST_INIT(binary, list("0","1")) /proc/endswith(input_text, ending) var/input_length = LAZYLEN(ending) return !!findtext(input_text, ending, -input_length) + +/// Generate a grawlix string of length of the text argument. +/proc/grawlix(text) + var/grawlix = "" + for(var/iteration in 1 to length_char(text)) + grawlix += pick("@", "$", "?", "!", "#", "§", "*", "£", "%", "☠", "★", "☆", "¿", "⚡") + return grawlix diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm index d2ab6d5e054..117067a0578 100644 --- a/code/__HELPERS/type_processing.dm +++ b/code/__HELPERS/type_processing.dm @@ -4,31 +4,84 @@ . = list() for(var/type in types) var/typename = "[type]" + // Longest paths comes first var/static/list/TYPES_SHORTCUTS = list( /obj/effect/decal/cleanable = "CLEANABLE", /obj/item/bodypart = "BODYPART", /obj/item/radio/headset = "HEADSET", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/clothing/accessory = "ACCESSORY", + /obj/item/clothing/mask/gas = "GASMASK", + /obj/item/clothing/mask = "MASK", + /obj/item/clothing/gloves = "GLOVES", + /obj/item/clothing/shoes = "SHOES", + /obj/item/clothing/under/plasmaman = "PLASMAMAN_SUIT", + /obj/item/clothing/under = "JUMPSUIT", + /obj/item/clothing/suit/armor = "ARMOR", + /obj/item/clothing/suit = "SUIT", + /obj/item/clothing/head/helmet = "HELMET", + /obj/item/clothing/head = "HEAD", + /obj/item/clothing/neck = "NECK", + /obj/item/clothing = "CLOTHING", + /obj/item/storage/backpack = "BACKPACK", + /obj/item/storage/belt = "BELT", /obj/item/book/manual = "MANUAL", - /obj/item/reagent_containers/cup/glass = "DRINK", //longest paths comes first + /obj/item/storage/pill_bottle = "PILL_BOTTLE", + /obj/item/reagent_containers/pill/patch = "MEDPATCH", + /obj/item/reagent_containers/pill = "PILL", + /obj/item/reagent_containers/hypospray/medipen = "MEDIPEN", + /obj/item/reagent_containers/cup/glass = "DRINK", /obj/item/food = "FOOD", /obj/item/reagent_containers = "REAGENT_CONTAINERS", /obj/machinery/atmospherics = "ATMOS_MECH", /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment/weapon = "MECHA_WEAPON", /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", /obj/item/organ = "ORGAN", + /obj/item/mod/control = "MODSUIT", + /obj/item/mod/module = "MODSUIT_MOD", + /obj/item/gun/ballistic/automatic = "GUN_AUTOMATIC", + /obj/item/gun/ballistic/revolver = "GUN_REVOLVER", + /obj/item/gun/ballistic/rifle = "GUN_RIFLE", + /obj/item/gun/ballistic/shotgun = "GUN_SHOTGUN", + /obj/item/gun/ballistic = "GUN_BALLISTIC", + /obj/item/gun/energy/laser = "GUN_LASER", + /obj/item/gun/energy = "GUN_ENERGY", + /obj/item/gun/magic = "GUN_MAGIC", + /obj/item/gun = "GUN", + /obj/item/stack/sheet/mineral = "MINERAL_SHEET", + /obj/item/stack/sheet = "SHEET", + /obj/item/stack/ore = "ORE", + /obj/item/ai_module = "AI_LAW_MODULE", + /obj/item/circuitboard/machine = "MACHINE_BOARD", + /obj/item/circuitboard/computer = "COMPUTER_BOARD", + /obj/item/circuitboard = "CIRCUITBOARD", /obj/item = "ITEM", + /obj/structure/closet/crate/secure = "LOCKED_CRATE", + /obj/structure/closet/crate = "CRATE", + /obj/structure/closet/secure_closet = "LOCKED_CLOSET", + /obj/structure/closet = "CLOSET", + /obj/structure = "STRUCTURE", + /obj/machinery/door/airlock = "AIRLOCK", + /obj/machinery/door = "DOOR", + /obj/machinery/rnd/production = "RND_FABRICATOR", + /obj/machinery/computer/camera_advanced/shuttle_docker = "DOCKING_COMPUTER", + /obj/machinery/computer = "COMPUTER", + /obj/machinery/vending/wardrobe = "JOBDROBE", + /obj/machinery/vending = "VENDING", /obj/machinery = "MACHINERY", /obj/effect = "EFFECT", + /obj/projectile = "PROJECTILE", /obj = "O", /datum = "D", /turf/open = "OPEN", /turf/closed = "CLOSED", /turf = "T", + /mob/living/carbon/human = "HUMANOID", /mob/living/carbon = "CARBON", /mob/living/simple_animal = "SIMPLE", /mob/living/basic = "BASIC", + /mob/living/silicon/robot = "CYBORG", + /mob/living/silicon = "SILICON", /mob/living = "LIVING", /mob = "M", ) diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index f3677cf2c64..5eb4bda14e7 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -2,11 +2,11 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 515 -#define MIN_COMPILER_BUILD 1609 +#define MIN_COMPILER_BUILD 1621 #if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. -#error You need version 515.1609 or higher +#error You need version 515.1621 or higher #endif // Keep savefile compatibilty at minimum supported level diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 83e74381748..a8ac10c4521 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -83,7 +83,6 @@ DEFINE_BITFIELD(car_traits, list( DEFINE_BITFIELD(clothing_flags, list( "ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER, - "BLOCKS_SHOVE_KNOCKDOWN" = BLOCKS_SHOVE_KNOCKDOWN, "BLOCKS_SPEECH" = BLOCKS_SPEECH, "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, "CASTING_CLOTHES" = CASTING_CLOTHES, @@ -235,7 +234,7 @@ DEFINE_BITFIELD(internal_damage, list( DEFINE_BITFIELD(mecha_flags, list( "ID_LOCK_ON" = ID_LOCK_ON, - "CANSTRAFE" = CANSTRAFE, + "CAN_STRAFE" = CAN_STRAFE, "LIGHTS_ON" = LIGHTS_ON, "SILICON_PILOT" = SILICON_PILOT, "IS_ENCLOSED" = IS_ENCLOSED, diff --git a/code/_globalvars/lists/silo.dm b/code/_globalvars/lists/silo.dm new file mode 100644 index 00000000000..6cb4a7851d5 --- /dev/null +++ b/code/_globalvars/lists/silo.dm @@ -0,0 +1,2 @@ +///List of logs shared by all silos +GLOBAL_LIST_EMPTY(silo_access_logs) diff --git a/code/_globalvars/silo.dm b/code/_globalvars/silo.dm new file mode 100644 index 00000000000..07526caec20 --- /dev/null +++ b/code/_globalvars/silo.dm @@ -0,0 +1,2 @@ +///The global ore silo shared by all machines at round start +GLOBAL_DATUM(ore_silo_default, /obj/machinery/ore_silo) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index e8b56be39f2..e7936170a69 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_AREA_SENSITIVE" = TRAIT_AREA_SENSITIVE, "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, "TRAIT_BLOCKING_EXPLOSIVES" = TRAIT_BLOCKING_EXPLOSIVES, + "TRAIT_BOULDER_BREAKER" = TRAIT_BOULDER_BREAKER, "TRAIT_CASTABLE_LOC" = TRAIT_CASTABLE_LOC, "TRAIT_DEL_ON_SPACE_DUMP" = TRAIT_DEL_ON_SPACE_DUMP, "TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE, @@ -52,6 +53,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, "TRAIT_NO_MANIFEST_CONTENTS_ERROR" = TRAIT_NO_MANIFEST_CONTENTS_ERROR, "TRAIT_NO_MISSING_ITEM_ERROR" = TRAIT_NO_MISSING_ITEM_ERROR, + "TRAIT_NO_THROW_HITPUSH" = TRAIT_NO_THROW_HITPUSH, "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, "TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT, "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, @@ -69,6 +71,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( ), // AKA SSstation /datum/controller/subsystem/processing/station = list( + "STATION_TRAIT_ASSISTANT_GIMMICKS" = STATION_TRAIT_ASSISTANT_GIMMICKS, "STATION_TRAIT_BANANIUM_SHIPMENTS" = STATION_TRAIT_BANANIUM_SHIPMENTS, "STATION_TRAIT_BIGGER_PODS" = STATION_TRAIT_BIGGER_PODS, "STATION_TRAIT_BIRTHDAY" = STATION_TRAIT_BIRTHDAY, @@ -107,17 +110,18 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, "TRAIT_AGENDER" = TRAIT_AGENDER, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, - "TRAIT_AI_BAGATTACK" = TRAIT_AI_BAGATTACK, "TRAIT_AIRLOCK_SHOCKIMMUNE" = TRAIT_AIRLOCK_SHOCKIMMUNE, + "TRAIT_AI_BAGATTACK" = TRAIT_AI_BAGATTACK, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, - "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, "TRAIT_ALLOWED_HONORBOUND_ATTACK" = TRAIT_ALLOWED_HONORBOUND_ATTACK, + "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS, + "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_ANGELIC" = TRAIT_ANGELIC, "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, "TRAIT_ANTICONVULSANT" = TRAIT_ANTICONVULSANT, - "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, "TRAIT_BADDNA" = TRAIT_BADDNA, "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, @@ -125,37 +129,36 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, "TRAIT_BEING_BLADE_SHIELDED" = TRAIT_BEING_BLADE_SHIELDED, "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, - "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, - "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, + "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, + "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, "TRAIT_BRAINWASHING" = TRAIT_BRAINWASHING, "TRAIT_BYPASS_EARLY_IRRADIATED_CHECK" = TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, - "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, - "TRAIT_CAN_SIGN_ON_COMMS" = TRAIT_CAN_SIGN_ON_COMMS, - "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, - "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_CRYSTALIZE" = TRAIT_CANNOT_CRYSTALIZE, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CANT_RIDE" = TRAIT_CANT_RIDE, + "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, + "TRAIT_CAN_SIGN_ON_COMMS" = TRAIT_CAN_SIGN_ON_COMMS, + "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, + "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, "TRAIT_CHANGELING_HIVEMIND_MUTE" = TRAIT_CHANGELING_HIVEMIND_MUTE, "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, "TRAIT_CHEF_KISS" = TRAIT_CHEF_KISS, - "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CLEANBOT_WHISPERER" = TRAIT_CLEANBOT_WHISPERER, "TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER, "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_COAGULATING" = TRAIT_COAGULATING, "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, - "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_CURSED" = TRAIT_CURSED, @@ -178,10 +181,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DUMB" = TRAIT_DUMB, "TRAIT_DWARF" = TRAIT_DWARF, "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, - "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, "TRAIT_EASYBLEED" = TRAIT_EASYBLEED, + "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, "TRAIT_ECHOLOCATION_EXTRA_RANGE" = TRAIT_ECHOLOCATION_EXTRA_RANGE, "TRAIT_ECHOLOCATION_RECEIVER" = TRAIT_ECHOLOCATION_RECEIVER, + "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, "TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER, "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, @@ -190,8 +194,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, - "TRAIT_FAST_TYING" = TRAIT_FAST_TYING, "TRAIT_FASTMED" = TRAIT_FASTMED, + "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, + "TRAIT_FAST_TYING" = TRAIT_FAST_TYING, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, @@ -199,15 +204,16 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_FLOORED" = TRAIT_FLOORED, "TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION" = TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, "TRAIT_FORCED_GRAVITY" = TRAIT_FORCED_GRAVITY, "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, "TRAIT_FOV_APPLIED" = TRAIT_FOV_APPLIED, + "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, "TRAIT_FREE_FLOAT_MOVEMENT" = TRAIT_FREE_FLOAT_MOVEMENT, "TRAIT_FREE_HYPERSPACE_MOVEMENT" = TRAIT_FREE_HYPERSPACE_MOVEMENT, "TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT" = TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, - "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, "TRAIT_FUGU_GLANDED" = TRAIT_FUGU_GLANDED, "TRAIT_GAMER" = TRAIT_GAMER, @@ -220,12 +226,13 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, - "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_HALT_RADIATION_EFFECTS" = TRAIT_HALT_RADIATION_EFFECTS, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, "TRAIT_HAS_BEEN_KIDNAPPED" = TRAIT_HAS_BEEN_KIDNAPPED, + "TRAIT_HAS_CRANIAL_FISSURE" = TRAIT_HAS_CRANIAL_FISSURE, "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, "TRAIT_HEALS_FROM_CARP_RIFTS" = TRAIT_HEALS_FROM_CARP_RIFTS, @@ -246,20 +253,20 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, - "TRAIT_IN_CALL" = TRAIT_IN_CALL, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, "TRAIT_INVISIMIN" = TRAIT_INVISIMIN, + "TRAIT_IN_CALL" = TRAIT_IN_CALL, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, + "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, - "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, @@ -274,8 +281,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, - "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, "TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER, "TRAIT_MOB_TIPPED" = TRAIT_MOB_TIPPED, "TRAIT_MORBID" = TRAIT_MORBID, @@ -289,6 +296,24 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, + "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, + "TRAIT_NOBREATH" = TRAIT_NOBREATH, + "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, + "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, + "TRAIT_NODEATH" = TRAIT_NODEATH, + "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, + "TRAIT_NOFAT" = TRAIT_NOFAT, + "TRAIT_NOFEAR_HOLDUPS" = TRAIT_NOFEAR_HOLDUPS, + "TRAIT_NOFIRE" = TRAIT_NOFIRE, + "TRAIT_NOFIRE_SPREAD" = TRAIT_NOFIRE_SPREAD, + "TRAIT_NOFLASH" = TRAIT_NOFLASH, + "TRAIT_NOGUNS" = TRAIT_NOGUNS, + "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, + "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, + "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, + "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, + "TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY, + "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, "TRAIT_NO_DEBRAIN_OVERLAY" = TRAIT_NO_DEBRAIN_OVERLAY, @@ -308,37 +333,19 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_SLIP_SLIDE" = TRAIT_NO_SLIP_SLIDE, "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, + "TRAIT_NO_STAGGER" = TRAIT_NO_STAGGER, "TRAIT_NO_STRIP" = TRAIT_NO_STRIP, "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, "TRAIT_NO_TWOHANDING" = TRAIT_NO_TWOHANDING, - "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, - "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, - "TRAIT_NOBREATH" = TRAIT_NOBREATH, - "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, - "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, - "TRAIT_NODEATH" = TRAIT_NODEATH, - "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, - "TRAIT_NOFAT" = TRAIT_NOFAT, - "TRAIT_NOFEAR_HOLDUPS" = TRAIT_NOFEAR_HOLDUPS, - "TRAIT_NOFIRE_SPREAD" = TRAIT_NOFIRE_SPREAD, - "TRAIT_NOFIRE" = TRAIT_NOFIRE, - "TRAIT_NOFLASH" = TRAIT_NOFLASH, - "TRAIT_NOGUNS" = TRAIT_NOGUNS, - "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, - "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, - "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, - "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, - "TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY, - "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_ON_ELEVATED_SURFACE" = TRAIT_ON_ELEVATED_SURFACE, "TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN, "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE, - "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED, + "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_PACIFISM" = TRAIT_PACIFISM, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, @@ -361,9 +368,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_QUICK_BUILD" = TRAIT_QUICK_BUILD, "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, - "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, "TRAIT_RDS_SUPPRESSED" = TRAIT_RDS_SUPPRESSED, "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, @@ -393,6 +400,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SHAVED" = TRAIT_SHAVED, "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, + "TRAIT_SHOVE_KNOCKDOWN_BLOCKED" = TRAIT_SHOVE_KNOCKDOWN_BLOCKED, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, @@ -449,24 +457,26 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, + "TRAIT_USER_SCOPED" = TRAIT_USER_SCOPED, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, "TRAIT_VATGROWN" = TRAIT_VATGROWN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, - "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_WAS_EVOLVED" = TRAIT_WAS_EVOLVED, "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, "TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER, "TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER, "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, - "TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED, "TRAIT_WING_BUFFET" = TRAIT_WING_BUFFET, + "TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED, "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, + "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, ), /obj/item = list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, @@ -493,6 +503,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_WIELDED" = TRAIT_WIELDED, "TRAIT_BAKEABLE" = TRAIT_BAKEABLE, + "TRAIT_INSTANTLY_PROCESSES_BOULDERS" = TRAIT_INSTANTLY_PROCESSES_BOULDERS, ), /obj/item/ammo_casing = list( "TRAIT_DART_HAS_INSERT" = TRAIT_DART_HAS_INSERT, @@ -500,6 +511,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/item/bodypart = list( "TRAIT_DISABLED_BY_WOUND" = TRAIT_DISABLED_BY_WOUND, "TRAIT_IGNORED_BY_LIVING_FLESH" = TRAIT_IGNORED_BY_LIVING_FLESH, + "TRAIT_IMMUNE_TO_CRANIAL_FISSURE" = TRAIT_IMMUNE_TO_CRANIAL_FISSURE, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, @@ -555,6 +567,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/item/reagent_containers = list( "TRAIT_MAY_CONTAIN_BLENDED_DUST" = TRAIT_MAY_CONTAIN_BLENDED_DUST, ), + /obj/machinery/modular_computer = list( + "TRAIT_MODPC_INTERACTING_WITH_FRAME" = TRAIT_MODPC_INTERACTING_WITH_FRAME, + ), /obj/projectile = list( "TRAIT_ALWAYS_HIT_ZONE" = TRAIT_ALWAYS_HIT_ZONE, ), diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 221d6ef820d..1043844ddf2 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_FAST_CUFFING" = TRAIT_FAST_CUFFING, "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 98c5c4d94a7..566256824bf 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -115,7 +115,7 @@ if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow - UnarmedAttack(A, FALSE, modifiers) + UnarmedAttack(A, Adjacent(A), modifiers) return if(throw_mode) @@ -144,7 +144,7 @@ if(ismob(A)) changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A, FALSE, modifiers) + UnarmedAttack(A, TRUE, modifiers) return //Can't reach anything else in lockers or other weirdness @@ -164,7 +164,7 @@ else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A,1,modifiers) + UnarmedAttack(A, TRUE, modifiers) else if(W) if(LAZYACCESS(modifiers, RIGHT_CLICK)) @@ -173,12 +173,12 @@ if(after_attack_secondary_result == SECONDARY_ATTACK_CALL_NORMAL) W.afterattack(A, src, FALSE, params) else - W.afterattack(A,src,0,params) + W.afterattack(A, src, FALSE, params) else if(LAZYACCESS(modifiers, RIGHT_CLICK)) ranged_secondary_attack(A, modifiers) else - RangedAttack(A,modifiers) + RangedAttack(A, modifiers) /// Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it /atom/proc/IsObscured() @@ -358,46 +358,26 @@ /atom/proc/CtrlClick(mob/user) SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user) SEND_SIGNAL(user, COMSIG_MOB_CTRL_CLICKED, src) + var/mob/living/ML = user if(istype(ML)) ML.pulled(src) if(!can_interact(user)) return FALSE -/mob/living/CtrlClick(mob/user) +/mob/living/CtrlClick(mob/living/user) if(!isliving(user) || !user.CanReach(src) || user.incapacitated()) return ..() if(world.time < user.next_move) return FALSE - var/mob/living/user_living = user - if(user_living.apply_martial_art(src, null, is_grab=TRUE) == MARTIAL_ATTACK_SUCCESS) - user_living.changeNext_move(CLICK_CD_MELEE) + if(user.grab(src)) + user.changeNext_move(CLICK_CD_MELEE) return TRUE return ..() - -/mob/living/carbon/human/CtrlClick(mob/user) - if(!iscarbon(user) || !user.CanReach(src) || user.incapacitated()) - return ..() - - if(world.time < user.next_move) - return FALSE - - if (ishuman(user)) - var/mob/living/carbon/human/human_user = user - if(human_user.dna.species.grab(human_user, src, human_user.mind.martial_art)) - human_user.changeNext_move(CLICK_CD_MELEE) - return TRUE - else if(isalien(user)) - var/mob/living/carbon/alien/adult/alien_boy = user - if(alien_boy.grab(src)) - alien_boy.changeNext_move(CLICK_CD_MELEE) - return TRUE - return ..() - /mob/proc/CtrlMiddleClickOn(atom/A) if(check_rights_for(client, R_ADMIN)) client.toggle_tag_datum(A) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 8cc8603f552..9abc5be2e80 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -190,7 +190,7 @@ change attack_robot() above to the proper function */ /mob/living/silicon/robot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return A.attack_robot(src) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index be94d82e516..e73cebf14c0 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -877,9 +877,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." time_left_overlay.maptext = MAPTEXT("[CEILING(timeleft / (1 SECONDS), 1)]") time_left_overlay.transform = time_left_overlay.transform.Translate(4, 19) add_overlay(time_left_overlay) - if(isnull(poll)) - return - ..() /atom/movable/screen/alert/poll_alert/Click(location, control, params) . = ..() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 79f857e8cbe..e928a2b8b3e 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -223,3 +223,4 @@ icon_state = "noise" color = "#04a8d1" alpha = 80 + diff --git a/code/_onclick/hud/living.dm b/code/_onclick/hud/living.dm index ecd6ecc1eba..70084b1ecd9 100644 --- a/code/_onclick/hud/living.dm +++ b/code/_onclick/hud/living.dm @@ -10,6 +10,11 @@ pull_icon.screen_loc = ui_living_pull static_inventory += pull_icon + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) + action_intent.icon = 'icons/hud/screen_midnight.dmi' + action_intent.screen_loc = ui_combat_toggle + static_inventory += action_intent + combo_display = new /atom/movable/screen/combo(null, src) infodisplay += combo_display diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index f398a5c0343..04bbc048e66 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -11,6 +11,8 @@ /** * Checks if this mob is in a valid state to punch someone. + * + * (Potentially) gives feedback to the mob if they cannot. */ /mob/living/proc/can_unarmed_attack() return !HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) @@ -34,7 +36,7 @@ /mob/living/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) // The sole reason for this signal needing to exist is making FotNS incompatible with Hulk. // Note that it is send before [proc/can_unarmed_attack] is called, keep this in mind. - var/sigreturn = SEND_SIGNAL(src, COMSIG_LIVING_EARLY_UNARMED_ATTACK, attack_target, modifiers) + var/sigreturn = SEND_SIGNAL(src, COMSIG_LIVING_EARLY_UNARMED_ATTACK, attack_target, proximity_flag, modifiers) if(sigreturn & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE if(sigreturn & COMPONENT_SKIP_ATTACK) @@ -237,31 +239,6 @@ /atom/proc/attack_larva_secondary(mob/user, list/modifiers) return SECONDARY_ATTACK_CALL_NORMAL - -/* - Slimes - Nothing happening here -*/ -/mob/living/simple_animal/slime/resolve_unarmed_attack(atom/attack_target, proximity_flag, list/modifiers) - if(isturf(attack_target)) - return ..() - attack_target.attack_slime(src, modifiers) - -/mob/living/simple_animal/slime/resolve_right_click_attack(atom/target, list/modifiers) - if(isturf(target)) - return ..() - return target.attack_slime_secondary(src, modifiers) - -/atom/proc/attack_slime(mob/user, list/modifiers) - return - -/** - * Called when a slime mob right clicks an atom (that is not a turf). - * Returns a SECONDARY_ATTACK_* value. - */ -/atom/proc/attack_slime_secondary(mob/user, list/modifiers) - return SECONDARY_ATTACK_CALL_NORMAL - /* Drones */ diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 761659ec60f..a5c88d97dc6 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -430,3 +430,27 @@ /datum/config_entry/flag/give_tutorials_without_db /datum/config_entry/string/new_player_alert_role_id + +/datum/config_entry/keyed_list/positive_station_traits + default = list("0" = 8, "1" = 4, "2" = 2, "3" = 1) + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/negative_station_traits + default = list("0" = 8, "1" = 4, "2" = 2, "3" = 1) + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/neutral_station_traits + default = list("0" = 10, "1" = 10, "2" = 3, "2.5" = 1) + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +// Configs for the Quirk system +/// Disables Quirk point balancing for the server and clients. +/datum/config_entry/flag/disable_quirk_points + +/// The maximum amount of positive quirks one character can have at roundstart. +/datum/config_entry/number/max_positive_quirks + default = 6 + min_val = -1 diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index a3520ab1ee3..9d5cce746a2 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -15,13 +15,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) var/datum/controller/exclude_these = new // I know this is dumb but the nested vars list hangs a ref to the datum. This fixes that + // I have an issue report open, lummox has not responded. It might be a FeaTuRE + // Sooo we gotta be dumb var/list/controller_vars = exclude_these.vars.Copy() controller_vars["vars"] = null gvars_datum_in_built_vars = controller_vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) -#if MIN_COMPILER_VERSION >= 515 && MIN_COMPILER_BUILD > 1620 - #warn datum.vars hanging a ref should now be fixed, there should be no reason to remove the vars list from our controller's vars list anymore -#endif QDEL_IN(exclude_these, 0) //signal logging isn't ready Initialize() diff --git a/code/controllers/subsystem/area_contents.dm b/code/controllers/subsystem/area_contents.dm index 904714f0ba0..054de9d8efc 100644 --- a/code/controllers/subsystem/area_contents.dm +++ b/code/controllers/subsystem/area_contents.dm @@ -1,4 +1,4 @@ -#define ALLOWED_LOOSE_TURFS 500 +#define ALLOWED_LOOSE_TURFS 100 /** * Responsible for managing the sizes of area.contained_turfs and area.turfs_to_uncontain * These lists do not check for duplicates, which is fine, but it also means they can balloon in size over time @@ -17,8 +17,11 @@ SUBSYSTEM_DEF(area_contents) var/total_clearing_from = 0 var/total_to_clear = 0 for(var/area/to_clear as anything in marked_for_clearing) - total_to_clear += length(to_clear.turfs_to_uncontain) - total_clearing_from += length(to_clear.contained_turfs) + for (var/area_zlevel in 1 to length(to_clear.turfs_to_uncontain_by_zlevel)) + if (length(to_clear.turfs_to_uncontain_by_zlevel[area_zlevel])) + total_to_clear += length(to_clear.turfs_to_uncontain_by_zlevel[area_zlevel]) + if (length(to_clear.turfs_by_zlevel) >= area_zlevel) //this should always be true, but stat_entry is no place for runtimes. fire() can handle that + total_clearing_from += length(to_clear.turfs_by_zlevel[area_zlevel]) msg = "A:[length(currentrun)] MR:[length(marked_for_clearing)] TC:[total_to_clear] CF:[total_clearing_from]" return ..() @@ -29,8 +32,10 @@ SUBSYSTEM_DEF(area_contents) while(length(currentrun)) var/area/test = currentrun[length(currentrun)] - if(length(test.turfs_to_uncontain) > ALLOWED_LOOSE_TURFS) - marked_for_clearing |= test + for (var/area_zlevel in 1 to length(test.turfs_to_uncontain_by_zlevel)) + if(length(test.turfs_to_uncontain_by_zlevel[area_zlevel]) > ALLOWED_LOOSE_TURFS) + marked_for_clearing |= test + break currentrun.len-- if(MC_TICK_CHECK) return @@ -39,19 +44,27 @@ SUBSYSTEM_DEF(area_contents) while(length(marked_for_clearing)) var/area/clear = marked_for_clearing[length(marked_for_clearing)] - // The operation of cutting large lists can be expensive - // It scales almost directly with the size of the list we're cutting with - // Because of this, we're gonna stick to cutting 1 entry at a time - // There's no reason to batch it I promise, this is faster. No overtime too - var/amount_cut = 0 - var/list/cut_from = clear.turfs_to_uncontain - for(amount_cut in 1 to length(cut_from)) - clear.contained_turfs -= cut_from[amount_cut] - if(MC_TICK_CHECK) - cut_from.Cut(1, amount_cut + 1) - return + for (var/area_zlevel in 1 to length(clear.turfs_to_uncontain_by_zlevel)) + if (!length(clear.turfs_to_uncontain_by_zlevel[area_zlevel])) + continue + if (length(clear.turfs_by_zlevel) < area_zlevel) + stack_trace("[clear]([clear.type])'s turfs_by_zlevel is length [length(clear.turfs_by_zlevel)] but we are being asked to remove turfs from zlevel [area_zlevel] from it.") + clear.turfs_to_uncontain_by_zlevel[area_zlevel] = list() + continue - clear.turfs_to_uncontain = list() + // The operation of cutting large lists can be expensive + // It scales almost directly with the size of the list we're cutting with + // Because of this, we're gonna stick to cutting 1 entry at a time + // There's no reason to batch it I promise, this is faster. No overtime too + var/amount_cut = 0 + var/list/cut_from = clear.turfs_to_uncontain_by_zlevel[area_zlevel] + for(amount_cut in 1 to length(cut_from)) + clear.turfs_by_zlevel[area_zlevel] -= cut_from[amount_cut] + if(MC_TICK_CHECK) + cut_from.Cut(1, amount_cut + 1) + return + + clear.turfs_to_uncontain_by_zlevel = list() marked_for_clearing.len-- #undef ALLOWED_LOOSE_TURFS diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index c7d35e0a041..47a8168b511 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -417,6 +417,8 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NUKIEBASE) var/required_role = ROLE_NUCLEAR_OPERATIVE var/datum/team/nuclear/nuke_team + ///The job type to dress up our nuclear operative as. + var/datum/job/job_type = /datum/job/nuclear_operative /datum/dynamic_ruleset/roundstart/nuclear/ready(population, forced = FALSE) required_candidates = get_antag_cap(population) @@ -431,8 +433,8 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) break var/mob/M = pick_n_take(candidates) assigned += M.mind - M.mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) - M.mind.special_role = ROLE_NUCLEAR_OPERATIVE + M.mind.set_assigned_role(SSjob.GetJobType(job_type)) + M.mind.special_role = required_role return TRUE /datum/dynamic_ruleset/roundstart/nuclear/execute() @@ -625,6 +627,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) antag_leader_datum = /datum/antagonist/nukeop/leader/clownop requirements = list(101,101,101,101,101,101,101,101,101,101) required_role = ROLE_CLOWN_OPERATIVE + job_type = /datum/job/clown_operative /datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute() . = ..() @@ -636,10 +639,6 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) new /obj/machinery/nuclearbomb/syndicate/bananium(nuke.loc) qdel(nuke) - for(var/datum/mind/clowns in assigned) - clowns.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative)) - clowns.special_role = ROLE_CLOWN_OPERATIVE - ////////////////////////////////////////////// // // // METEOR // diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 4f11a3ee577..706b4e51d69 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -162,6 +162,9 @@ SUBSYSTEM_DEF(garbage) lastlevel = level +// 1 from the hard reference in the queue, and 1 from the variable used before this +#define REFS_WE_EXPECT 2 + //We do this rather then for(var/list/ref_info in queue) because that sort of for loop copies the whole list. //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. for (var/i in 1 to length(queue)) @@ -179,9 +182,8 @@ SUBSYSTEM_DEF(garbage) var/datum/D = L[GC_QUEUE_ITEM_REF] - // 1 from the hard reference in the queue, and 1 from the variable used before this // If that's all we've got, send er off - if (refcount(D) == 2) + if (refcount(D) == REFS_WE_EXPECT) ++gcedlasttick ++totalgcs pass_counts[level]++ @@ -202,12 +204,15 @@ SUBSYSTEM_DEF(garbage) switch (level) if (GC_QUEUE_CHECK) #ifdef REFERENCE_TRACKING + // Decides how many refs to look for (potentially) + // Based off the remaining and the ones we can account for + var/remaining_refs = refcount(D) - REFS_WE_EXPECT if(reference_find_on_fail[text_ref(D)]) - INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references)) + INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references), remaining_refs) ref_searching = TRUE #ifdef GC_FAILURE_HARD_LOOKUP else - INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references)) + INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references), remaining_refs) ref_searching = TRUE #endif reference_find_on_fail -= text_ref(D) @@ -257,6 +262,8 @@ SUBSYSTEM_DEF(garbage) queue.Cut(1,count+1) count = 0 +#undef REFS_WE_EXPECT + /datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_FILTER) if (isnull(D)) return diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 68207afd738..1ce9d6f2c70 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -723,35 +723,24 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/get_last_resort_spawn_points() - //bad mojo var/area/shuttle/arrival/arrivals_area = GLOB.areas_by_type[/area/shuttle/arrival] - if(arrivals_area) - //first check if we can find a chair - var/obj/structure/chair/shuttle_chair = locate() in arrivals_area - if(shuttle_chair) - return shuttle_chair - - //last hurrah + if(!isnull(arrivals_area)) var/list/turf/available_turfs = list() - for(var/turf/arrivals_turf in arrivals_area) - if(!arrivals_turf.is_blocked_turf(TRUE)) + for (var/list/zlevel_turfs as anything in arrivals_area.get_zlevel_turf_lists()) + for (var/turf/arrivals_turf as anything in zlevel_turfs) + var/obj/structure/chair/shuttle_chair = locate() in arrivals_turf + if(!isnull(shuttle_chair)) + return shuttle_chair + if(arrivals_turf.is_blocked_turf(TRUE)) + continue available_turfs += arrivals_turf + if(length(available_turfs)) return pick(available_turfs) - //pick an open spot on arrivals and dump em - var/list/arrivals_turfs = shuffle(get_area_turfs(/area/shuttle/arrival)) - if(length(arrivals_turfs)) - for(var/turf/arrivals_turf in arrivals_turfs) - if(!arrivals_turf.is_blocked_turf(TRUE)) - return arrivals_turf - //last chance, pick ANY spot on arrivals and dump em - return pick(arrivals_turfs) - stack_trace("Unable to find last resort spawn point.") return GET_ERROR_ROOM - ///Lands specified mob at a random spot in the hallways /datum/controller/subsystem/job/proc/DropLandAtRandomHallwayPoint(mob/living/living_mob) var/turf/spawn_turf = get_safe_random_station_turf(typesof(/area/station/hallway)) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index cf1058f8a44..cda203b0302 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -173,7 +173,7 @@ SUBSYSTEM_DEF(mapping) // Cache for sonic speed var/list/unused_turfs = src.unused_turfs var/list/world_contents = GLOB.areas_by_type[world.area].contents - var/list/world_turf_contents = GLOB.areas_by_type[world.area].contained_turfs + var/list/world_turf_contents_by_z = GLOB.areas_by_type[world.area].turfs_by_zlevel var/list/lists_to_reserve = src.lists_to_reserve var/index = 0 while(index < length(lists_to_reserve)) @@ -189,10 +189,12 @@ SUBSYSTEM_DEF(mapping) LAZYINITLIST(unused_turfs["[T.z]"]) unused_turfs["[T.z]"] |= T var/area/old_area = T.loc - old_area.turfs_to_uncontain += T + LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, T.z, list()) + old_area.turfs_to_uncontain_by_zlevel[T.z] += T T.turf_flags = UNUSED_RESERVATION_TURF world_contents += T - world_turf_contents += T + LISTASSERTLEN(world_turf_contents_by_z, T.z, list()) + world_turf_contents_by_z[T.z] += T packet.len-- packetlen = length(packet) @@ -250,18 +252,18 @@ SUBSYSTEM_DEF(mapping) var/list/ice_ruins = levels_by_trait(ZTRAIT_ICE_RUINS) if (ice_ruins.len) // needs to be whitelisted for underground too so place_below ruins work - seedRuins(ice_ruins, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS], clear_below = TRUE) + seedRuins(ice_ruins, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS], clear_below = TRUE, mineral_budget = 4) var/list/ice_ruins_underground = levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND) if (ice_ruins_underground.len) - seedRuins(ice_ruins_underground, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS_UNDERGROUND], clear_below = TRUE) + seedRuins(ice_ruins_underground, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS_UNDERGROUND], clear_below = TRUE, mineral_budget = 21) // Generate deep space ruins var/list/space_ruins = levels_by_trait(ZTRAIT_SPACE_RUINS) if (space_ruins.len) // Create a proportional budget by multiplying the amount of space ruin levels in the current map over the default amount var/proportional_budget = round(CONFIG_GET(number/space_budget) * (space_ruins.len / DEFAULT_SPACE_RUIN_LEVELS)) - seedRuins(space_ruins, proportional_budget, list(/area/space), themed_ruins[ZTRAIT_SPACE_RUINS]) + seedRuins(space_ruins, proportional_budget, list(/area/space), themed_ruins[ZTRAIT_SPACE_RUINS], mineral_budget = 0) /// Sets up rivers, and things that behave like rivers. So lava/plasma rivers, and chasms /// It is important that this happens AFTER generating mineral walls and such, since we rely on them for river logic @@ -835,12 +837,14 @@ GLOBAL_LIST_EMPTY(the_station_areas) // Faster if(space_guaranteed) var/area/global_area = GLOB.areas_by_type[world.area] - global_area.contained_turfs += Z_TURFS(z_level) + LISTASSERTLEN(global_area.turfs_by_zlevel, z_level, list()) + global_area.turfs_by_zlevel[z_level] = Z_TURFS(z_level) return for(var/turf/to_contain as anything in Z_TURFS(z_level)) var/area/our_area = to_contain.loc - our_area.contained_turfs += to_contain + LISTASSERTLEN(our_area.turfs_by_zlevel, z_level, list()) + our_area.turfs_by_zlevel[z_level] += to_contain /datum/controller/subsystem/mapping/proc/update_plane_tracking(datum/space_level/update_with) // We're essentially going to walk down the stack of connected z levels, and set their plane offset as we go diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index a9c807cc38a..4ae9272e970 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -154,13 +154,13 @@ SUBSYSTEM_DEF(materials) var/list/combo_params = list() for(var/x in materials_declaration) var/datum/material/mat = x - combo_params += "[istype(mat) ? mat.id : mat]=[materials_declaration[mat] * multiplier]" + combo_params += "[istype(mat) ? mat.id : mat]=[OPTIMAL_COST(materials_declaration[mat] * multiplier)]" sortTim(combo_params, GLOBAL_PROC_REF(cmp_text_asc)) // We have to sort now in case the declaration was not in order var/combo_index = combo_params.Join("-") var/list/combo = material_combos[combo_index] if(!combo) combo = list() for(var/mat in materials_declaration) - combo[GET_MATERIAL_REF(mat)] = materials_declaration[mat] * multiplier + combo[GET_MATERIAL_REF(mat)] = OPTIMAL_COST(materials_declaration[mat] * multiplier) material_combos[combo_index] = combo return combo diff --git a/code/controllers/subsystem/modular_computers.dm b/code/controllers/subsystem/modular_computers.dm index 678b26d24a4..c8efa4aa4ee 100644 --- a/code/controllers/subsystem/modular_computers.dm +++ b/code/controllers/subsystem/modular_computers.dm @@ -57,10 +57,10 @@ SUBSYSTEM_DEF(modular_computers) if(prob(75)) chosen_discount = text2num(pick_weight(discounts)) if(prob(20)) - expires_in = rand(8,10) + expires_in = rand(8,10) MINUTES else chosen_discount = text2num(pick_weight(flash_discounts)) - expires_in = rand(2, 4) + expires_in = rand(2, 4) MINUTES var/coupon_code = "[uppertext(strip_pack_name.Replace(pack_name, ""))][chosen_discount*100]" var/list/targets = list() @@ -102,7 +102,7 @@ SUBSYSTEM_DEF(modular_computers) var/datum/signal/subspace/messaging/tablet_message/signal = new(announcement_system, list( "fakename" = "Coupon Master", "fakejob" = "Goodies Promotion", - "message" = "[chosen_promo_message] [pick(code_messages)]: [coupon_code][expires_in ? " (EXPIRES IN [expires_in] MINUTES)" : ""].", + "message" = "[chosen_promo_message] [pick(code_messages)]: [coupon_code][expires_in ? " (EXPIRES IN [uppertext(DisplayTimeText(expires_in))])" : ""].", "targets" = targets, "automated" = TRUE, )) diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index bf4b6a43029..ebb12c84e4b 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -101,6 +101,10 @@ controller.queue_loop(src) /datum/move_loop/process() + if(isnull(controller)) + qdel(src) + return + var/old_delay = delay //The signal can sometimes change delay if(SEND_SIGNAL(src, COMSIG_MOVELOOP_PREPROCESS_CHECK) & MOVELOOP_SKIP_STEP) //Chance for the object to react @@ -441,7 +445,8 @@ // this check if we're on exactly the next tile may be overly brittle for dense objects who may get bumped slightly // to the side while moving but could maybe still follow their path without needing a whole new path if(get_turf(moving) == next_step) - movement_path.Cut(1,2) + if(length(movement_path)) + movement_path.Cut(1,2) else INVOKE_ASYNC(src, PROC_REF(recalculate_path)) return MOVELOOP_FAILURE diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm new file mode 100644 index 00000000000..e659b10d873 --- /dev/null +++ b/code/controllers/subsystem/ore_generation.dm @@ -0,0 +1,80 @@ + +SUBSYSTEM_DEF(ore_generation) + name = "Ore Generation" + wait = 60 SECONDS + init_order = INIT_ORDER_DEFAULT + runlevels = RUNLEVEL_GAME + + /// All ore vents that are currently producing boulders. + var/list/processed_vents = list() + /// All the boulders that have been produced by ore vents to be pulled by BRM machines. + var/list/available_boulders = list() + /// All the ore vents that are currently in the game, not just the ones that are producing boulders. + var/list/possible_vents = list() + /// A list of all the minerals that are being mined by ore vents. We reset this list every time cave generation is done. + var/list/ore_vent_minerals = list() + /** + * Associated list of minerals to be associated with our ore vents. + * Generally Should be empty by the time initialize ends on lavaland. + * Each key value is the number of vents that will have this ore as a unique possible choice. + */ + var/static/list/ore_vent_minerals_default = list( + /datum/material/iron = 13, + /datum/material/glass = 12, + /datum/material/plasma = 9, + /datum/material/titanium = 6, + /datum/material/silver = 5, + /datum/material/gold = 5, + /datum/material/diamond = 3, + /datum/material/uranium = 3, + /datum/material/bluespace = 3, + /datum/material/plastic = 1, + ) + var/list/ore_vent_sizes = list( + LARGE_VENT_TYPE = 3, + MEDIUM_VENT_TYPE = 5, + SMALL_VENT_TYPE = 7, + ) + /// Ores spawned by proximity to an ore vent. Useful for logging purposes. + var/list/post_ore_random = list( + "1" = 0, + "2" = 0, + "3" = 0, + "4" = 0, + "5" = 0, + ) + /// Ores spawned randomly on the map without proximity to an ore vent. Useful for logging purposes. + var/list/post_ore_manual = list( + "1" = 0, + "2" = 0, + "3" = 0, + "4" = 0, + "5" = 0, + ) + +/datum/controller/subsystem/ore_generation/Initialize() + //Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete. + while(ore_vent_minerals.len > 0) + for(var/obj/structure/ore_vent/vent as anything in possible_vents) + if(vent.unique_vent) + continue //Ya'll already got your minerals. + if(ore_vent_minerals.len <= 0) + break + vent.generate_mineral_breakdown(max_minerals = 1, map_loading = TRUE) + return SS_INIT_SUCCESS + +/datum/controller/subsystem/ore_generation/fire(resumed) + available_boulders = list() // reset upon new fire. + for(var/obj/structure/ore_vent/current_vent as anything in processed_vents) + + var/local_vent_count = 0 + for(var/obj/item/boulder/old_rock in current_vent.loc) + available_boulders += old_rock + local_vent_count++ + + if(local_vent_count >= MAX_BOULDERS_PER_VENT) + continue //We don't want to be accountable for literally hundreds of unprocessed boulders for no reason. + + var/obj/item/boulder/new_rock = current_vent.produce_boulder() + available_boulders += new_rock + diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index d25ba18f3fd..168140fb2c8 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(polling) if(running_poll.time_left() <= 0) polling_finished(running_poll) -/datum/controller/subsystem/polling/proc/poll_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flash_window = TRUE, list/group = null, pic_source, role_name_text) +/datum/controller/subsystem/polling/proc/poll_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flash_window = TRUE, list/group = null, pic_source, role_name_text, list/custom_response_messages) if(group.len == 0) return list() if(role && !role_name_text) @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(polling) var/jumpable = isatom(pic_source) ? pic_source : null - var/datum/candidate_poll/new_poll = new(role_name_text, question, poll_time, ignore_category, jumpable) + var/datum/candidate_poll/new_poll = new(role_name_text, question, poll_time, ignore_category, jumpable, custom_response_messages) LAZYADD(currently_polling, new_poll) var/category = "[new_poll.poll_key]_poll_alert" @@ -40,13 +40,13 @@ SUBSYSTEM_DEF(polling) for(var/mob/candidate_mob as anything in group) if(!candidate_mob.client) continue - // Universal opt-out for all players. - if((!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles))) + // Universal opt-out for all players if it's for a role. + if(role && (!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles))) continue // Opt-out for admins whom are currently adminned. - if((!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles_as_admin)) && candidate_mob.client.holder) + if(role && (!candidate_mob.client.prefs.read_preference(/datum/preference/toggle/ghost_roles_as_admin)) && candidate_mob.client.holder) continue - if(!is_eligible(candidate_mob, role, check_jobban, ignore_category)) + if(role && !is_eligible(candidate_mob, role, check_jobban, ignore_category)) continue SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 7c397bd44c9..6d45fef0dd8 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -32,6 +32,9 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/spacer_born, /datum/quirk/oversized), list(/datum/quirk/feline_aspect, /datum/quirk/item_quirk/canine, /datum/quirk/item_quirk/avian), list(/datum/quirk/all_nighter, /datum/quirk/heavy_sleeper), + list(/datum/quirk/light_drinker, /datum/quirk/drunkhealing), + list(/datum/quirk/oversized, /datum/quirk/freerunning), + list(/datum/quirk/oversized, /datum/quirk/item_quirk/settler), //SKYRAT EDIT ADDITION END )) @@ -126,10 +129,15 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/bonus_quirks = max((length(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS) var/added_quirk_count = 0 //How many we've added var/list/quirks_to_add = list() //Quirks we're adding - var/good_count = 0 //Maximum of 6 good perks + var/good_count = 0 var/score //What point score we're at ///Cached list of possible quirks var/list/possible_quirks = quirks.Copy() + + var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks) + if(max_positive_quirks < 0) + max_positive_quirks = 6 + //Create a random list of stuff to start with while(bonus_quirks > added_quirk_count) var/quirk = pick(possible_quirks) //quirk is a string @@ -159,19 +167,20 @@ PROCESSING_SUBSYSTEM_DEF(quirks) quirks_to_add += quirk //And have benefits too - while(score < 0 && good_count <= MAX_QUIRKS) - if(!length(possible_quirks))//Lets not get stuck - break - var/quirk = pick(quirks) - if(quirk in GLOB.quirk_blacklist) //prevent blacklisted - possible_quirks -= quirk - continue - if(!quirk_points[quirk] > 0) //positive only - possible_quirks -= quirk - continue - good_count++ - score += quirk_points[quirk] - quirks_to_add += quirk + if(max_positive_quirks > 0) + while(score < 0 && good_count <= max_positive_quirks) + if(!length(possible_quirks))//Lets not get stuck + break + var/quirk = pick(quirks) + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted + possible_quirks -= quirk + continue + if(!(quirk_points[quirk] > 0)) //positive only + possible_quirks -= quirk + continue + good_count++ + score += quirk_points[quirk] + quirks_to_add += quirk for(var/datum/quirk/quirk as anything in user.quirks) if(quirk.name in quirks_to_add) //Don't delete ones we keep @@ -189,6 +198,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks) /datum/controller/subsystem/processing/quirks/proc/filter_invalid_quirks(list/quirks, list/augments) // SKYRAT EDIT - AUGMENTS+ var/list/new_quirks = list() var/list/positive_quirks = list() + var/points_enabled = !CONFIG_GET(flag/disable_quirk_points) + var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks) var/balance = 0 var/list/all_quirks = get_quirks() @@ -225,7 +236,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/value = initial(quirk.value) if (value > 0) - if (positive_quirks.len == MAX_QUIRKS) + if (max_positive_quirks >= 0 && positive_quirks.len == max_positive_quirks) continue positive_quirks[quirk_name] = value @@ -233,7 +244,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) balance += value new_quirks += quirk_name - if (balance > 0) + if (points_enabled && balance > 0) var/balance_left_to_remove = balance for (var/positive_quirk in positive_quirks) diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 5c9795b87fd..9d99e19a70b 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -73,22 +73,36 @@ PROCESSING_SUBSYSTEM_DEF(station) selectable_traits_by_types[initial(trait_typepath.trait_type)][trait_typepath] = initial(trait_typepath.weight) - var/positive_trait_count = pick(20;0, 5;1, 1;2) - var/neutral_trait_count = pick(10;0, 10;1, 3;2) - var/negative_trait_count = pick(20;0, 5;1, 1;2) + var/positive_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/positive_station_traits))) + var/neutral_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/neutral_station_traits))) + var/negative_trait_budget = text2num(pick_weight(CONFIG_GET(keyed_list/negative_station_traits))) - pick_traits(STATION_TRAIT_POSITIVE, positive_trait_count) - pick_traits(STATION_TRAIT_NEUTRAL, neutral_trait_count) - pick_traits(STATION_TRAIT_NEGATIVE, negative_trait_count) + pick_traits(STATION_TRAIT_POSITIVE, positive_trait_budget) + pick_traits(STATION_TRAIT_NEUTRAL, neutral_trait_budget) + pick_traits(STATION_TRAIT_NEGATIVE, negative_trait_budget) -///Picks traits of a specific category (e.g. bad or good) and a specified amount, then initializes them, adds them to the list of traits, -///then removes them from possible traits as to not roll twice. -/datum/controller/subsystem/processing/station/proc/pick_traits(trait_sign, amount) - if(!amount) +/** + * Picks traits of a specific category (e.g. bad or good), initializes them, adds them to the list of traits, + * then removes them from possible traits as to not roll twice and subtracts their cost from the budget. + * All until the whole budget is spent or no more traits can be picked with it. + */ +/datum/controller/subsystem/processing/station/proc/pick_traits(trait_sign, budget) + if(!budget) return - for(var/iterator in 1 to amount) - var/datum/station_trait/trait_type = pick_weight(selectable_traits_by_types[trait_sign]) //Rolls from the table for the specific trait type - selectable_traits_by_types[trait_sign] -= trait_type + ///A list of traits of the same trait sign + var/list/selectable_traits = selectable_traits_by_types[trait_sign] + while(budget) + ///Remove any station trait with a cost bigger than the budget + for(var/datum/station_trait/proto_trait as anything in selectable_traits) + if(initial(proto_trait.cost) > budget) + selectable_traits -= proto_trait + ///We have spare budget but no trait that can be bought with what's left of it + if(!length(selectable_traits)) + return + //Rolls from the table for the specific trait type + var/datum/station_trait/trait_type = pick_weight(selectable_traits) + selectable_traits -= trait_type + budget -= initial(trait_type.cost) setup_trait(trait_type) ///Creates a given trait of a specific type, while also removing any blacklisted ones from the future pool. diff --git a/code/controllers/subsystem/radioactive_nebula.dm b/code/controllers/subsystem/radioactive_nebula.dm index 3b11a7870af..17c0cc9b3da 100644 --- a/code/controllers/subsystem/radioactive_nebula.dm +++ b/code/controllers/subsystem/radioactive_nebula.dm @@ -50,9 +50,10 @@ SUBSYSTEM_DEF(radioactive_nebula) /// Loop through radioactive space (with lag checks) and make it all radioactive! /datum/controller/subsystem/radioactive_nebula/proc/irradiate_everything() for (var/area/area as anything in get_areas(radioactive_nebula.radioactive_areas)) - for (var/turf/turf as anything in area.get_contained_turfs()) - for (var/atom/movable/target as anything in turf) - fake_irradiate(target) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for (var/turf/area_turf as anything in zlevel_turfs) + for (var/atom/movable/target as anything in area_turf) + fake_irradiate(target) CHECK_TICK diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 1d31582fc5f..5bcf99ca9e2 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -74,6 +74,7 @@ SUBSYSTEM_DEF(research) new /datum/techweb/science new /datum/techweb/admin new /datum/techweb/oldstation + new /datum/techweb/tarkon //Skyrat Edit autosort_categories() error_design = new error_node = new diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 15fecf2a029..69a5edcca3a 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -31,6 +31,11 @@ SUBSYSTEM_DEF(server_maint) "dead_mob_list" = GLOB.dead_mob_list, "keyloop_list" = GLOB.keyloop_list, //A null here will cause new clients to be unable to move. totally unacceptable ) + + var/datum/tgs_version/tgsversion = world.TgsVersion() + if(tgsversion) + SSblackbox.record_feedback("text", "server_tools", 1, tgsversion.raw_parameter) + return SS_INIT_SUCCESS /datum/controller/subsystem/server_maint/fire(resumed = FALSE) @@ -86,9 +91,6 @@ SUBSYSTEM_DEF(server_maint) C?.tgui_panel?.send_roundrestart() if(server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite C << link("byond://[server]") - var/datum/tgs_version/tgsversion = world.TgsVersion() - if(tgsversion) - SSblackbox.record_feedback("text", "server_tools", 1, tgsversion.raw_parameter) /datum/controller/subsystem/server_maint/proc/UpdateHubStatus() diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index b1ebf3d586c..938321c5cd9 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -645,7 +645,7 @@ SUBSYSTEM_DEF(shuttle) var/datum/turf_reservation/proposal = SSmapping.request_turf_block_reservation( transit_width, transit_height, - 1, + z_size = 1, //if this is changed the turf uncontain code below has to be updated to support multiple zs reservation_type = /datum/turf_reservation/transit, turf_type_override = transit_path, ) @@ -679,17 +679,22 @@ SUBSYSTEM_DEF(shuttle) if(!midpoint) qdel(proposal) return FALSE + var/area/old_area = midpoint.loc - old_area.turfs_to_uncontain += proposal.reserved_turfs - var/area/shuttle/transit/A = new() - A.parallax_movedir = travel_dir - A.contents = proposal.reserved_turfs - A.contained_turfs = proposal.reserved_turfs + LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, bottomleft.z, list()) + old_area.turfs_to_uncontain_by_zlevel[bottomleft.z] += proposal.reserved_turfs + + var/area/shuttle/transit/new_area = new() + new_area.parallax_movedir = travel_dir + new_area.contents = proposal.reserved_turfs + LISTASSERTLEN(new_area.turfs_by_zlevel, bottomleft.z, list()) + new_area.turfs_by_zlevel[bottomleft.z] = proposal.reserved_turfs + var/obj/docking_port/stationary/transit/new_transit_dock = new(midpoint) new_transit_dock.reserved_area = proposal new_transit_dock.name = "Transit for [M.shuttle_id]/[M.name]" new_transit_dock.owner = M - new_transit_dock.assigned_area = A + new_transit_dock.assigned_area = new_area // Add 180, because ports point inwards, rather than outwards new_transit_dock.setDir(angle2dir(dock_angle)) diff --git a/code/controllers/subsystem/stock_market.dm b/code/controllers/subsystem/stock_market.dm index c0d85eaf85d..c9f632c7faf 100644 --- a/code/controllers/subsystem/stock_market.dm +++ b/code/controllers/subsystem/stock_market.dm @@ -13,14 +13,16 @@ SUBSYSTEM_DEF(stock_market) var/list/materials_trend_life = list() /// Associated list of materials alongside their available quantity. This is used to determine how much of a material is available to buy, and how much buying and selling affects the price. var/list/materials_quantity = list() + /// A list of all currently active stock market events. + var/list/active_events = list() /// HTML string that is used to display the market events to the player. var/news_string = "" /datum/controller/subsystem/stock_market/Initialize() for(var/datum/material/possible_market as anything in subtypesof(/datum/material)) // I need to make this work like this, but lets hardcode it for now - if(initial(possible_market.tradable)) + if(possible_market.tradable) materials_prices += possible_market - materials_prices[possible_market] = initial(possible_market.value_per_unit) * SHEET_MATERIAL_AMOUNT + materials_prices[possible_market] = possible_market.value_per_unit * SHEET_MATERIAL_AMOUNT materials_trends += possible_market materials_trends[possible_market] = rand(MARKET_TREND_DOWNWARD,MARKET_TREND_UPWARD) //aka -1 to 1 @@ -29,11 +31,14 @@ SUBSYSTEM_DEF(stock_market) materials_trend_life[possible_market] = rand(1,10) materials_quantity += possible_market - materials_quantity[possible_market] = initial(possible_market.tradable_base_quantity) + (rand(-initial(possible_market.tradable_base_quantity) * 0.5, initial(possible_market.tradable_base_quantity) * 0.5)) + materials_quantity[possible_market] = possible_market.tradable_base_quantity + (rand(-(possible_market.tradable_base_quantity) * 0.5, possible_market.tradable_base_quantity * 0.5)) return SS_INIT_SUCCESS + /datum/controller/subsystem/stock_market/fire(resumed) for(var/datum/material/market as anything in materials_prices) handle_trends_and_price(market) + for(var/datum/stock_market_event/event as anything in active_events) + event.handle() /** * Handles shifts in the cost of materials, and in what direction the material is most likely to move. @@ -41,17 +46,16 @@ SUBSYSTEM_DEF(stock_market) /datum/controller/subsystem/stock_market/proc/handle_trends_and_price(datum/material/mat) if(prob(MARKET_EVENT_PROBABILITY)) handle_market_event(mat) - return var/trend = materials_trends[mat] var/trend_life = materials_trend_life[mat] var/price_units = materials_prices[mat] - var/price_minimum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5) - if(!isnull(initial(mat.minimum_value_override))) - price_minimum = round(initial(mat.minimum_value_override) * SHEET_MATERIAL_AMOUNT) - var/price_maximum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3) - var/price_baseline = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT - var/quantity_baseline = initial(mat.tradable_base_quantity) + var/price_minimum = round(mat.value_per_unit * SHEET_MATERIAL_AMOUNT * 0.5) + if(!isnull(mat.minimum_value_override)) + price_minimum = round(mat.minimum_value_override * SHEET_MATERIAL_AMOUNT) + var/price_maximum = round(mat.value_per_unit * SHEET_MATERIAL_AMOUNT * 3) + var/price_baseline = mat.value_per_unit * SHEET_MATERIAL_AMOUNT + var/quantity_baseline = mat.tradable_base_quantity var/stock_quantity = materials_quantity[mat] @@ -76,7 +80,7 @@ SUBSYSTEM_DEF(stock_market) materials_trends[mat] = MARKET_TREND_DOWNWARD else materials_trends[mat] = MARKET_TREND_STABLE - materials_trend_life[mat] = rand(3,10) // Change our trend life for x number of cycles + materials_trend_life[mat] = rand(3,10) // Change our trend life for x number of fires of the subsystem else materials_trend_life[mat] -= 1 @@ -101,55 +105,7 @@ SUBSYSTEM_DEF(stock_market) * Events are also broadcast to the newscaster as a fun little fluff piece. Good way to tell some lore as well, or just make a joke. */ /datum/controller/subsystem/stock_market/proc/handle_market_event(datum/material/mat) - - var/company_name = list( // Pick a random company name from the list, I let copilot make a few up for me which is why some suck - "Nakamura Engineering", - "Robust Industries, LLC", - "MODular Solutions", - "SolGov", - "Australicus Industrial Mining", - "Vey-Medical", - "Aussec Armory", - "Dreamland Robotics" - ) - var/circumstance - var/event = rand(1,3) - - var/price_units = materials_prices[mat] - var/price_minimum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5) - if(!isnull(initial(mat.minimum_value_override))) - price_minimum = round(initial(mat.minimum_value_override) * SHEET_MATERIAL_AMOUNT) - var/price_maximum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3) - var/price_baseline = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT - - switch(event) - if(1) //Reset to stable - materials_prices[mat] = price_baseline - materials_trends[mat] = MARKET_TREND_STABLE - materials_trend_life[mat] = 1 - circumstance = pick(list( - "[pick(company_name)] has been bought out by a private investment firm. As a result, [initial(mat.name)] is now stable at [materials_prices[mat]] cr.", - "Due to a corporate restructuring, the largest supplier of [initial(mat.name)] has had the price changed to [materials_prices[mat]] cr.", - "[initial(mat.name)] is now under a monopoly by [pick(company_name)]. The price has been changed to [materials_prices[mat]] cr accordingly." - )) - if(2) //Big boost - materials_prices[mat] += round(gaussian(price_units * 0.5, price_units * 0.1)) - materials_prices[mat] = clamp(materials_prices[mat], price_minimum, price_maximum) - materials_trends[mat] = MARKET_TREND_UPWARD - materials_trend_life[mat] = rand(1,5) - circumstance = pick(list( - "[pick(company_name)] has just released a new product that uses [initial(mat.name)]! As a result, the price has been raised to [materials_prices[mat]] cr.", - "Due to [pick(company_name)] finding a new property of [initial(mat.name)], its price has been raised to [materials_prices[mat]] cr.", - "A study has found that [initial(mat.name)] may run out within the next 100 years. The price has raised to [materials_prices[mat]] cr due to panic." - )) - if(3) //Big drop - materials_prices[mat] -= round(gaussian(price_units * 1.5, price_units * 0.1)) - materials_prices[mat] = clamp(materials_prices[mat], price_minimum, price_maximum) - materials_trends[mat] = MARKET_TREND_DOWNWARD - materials_trend_life[mat] = rand(1,5) - circumstance = pick(list( - "[pick(company_name)]'s latest product has seen major controversy, and as a result, the price of [initial(mat.name)] has dropped to [materials_prices[mat]] cr.", - "Due to a new competitor, the price of [initial(mat.name)] has dropped to [materials_prices[mat]] cr.", - "[initial(mat.name)] has been found to be a carcinogen. The price has dropped to [materials_prices[mat]] cr due to panic." - )) - news_string += circumstance + "
" // Add the event to the news_string, formatted for newscasters. + var/datum/stock_market_event/event = pick(subtypesof(/datum/stock_market_event)) + event = new event + if(event.start_event(mat)) + active_events += event diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index b391200d6cf..6990a142e4e 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -233,7 +233,8 @@ SUBSYSTEM_DEF(throwing) if(thrownthing) SEND_SIGNAL(thrownthing, COMSIG_MOVABLE_THROW_LANDED, src) var/turf/landed_turf = get_turf(thrownthing) - SEND_SIGNAL(landed_turf, COMSIG_TURF_MOVABLE_THROW_LANDED, thrownthing) + if(landed_turf) + SEND_SIGNAL(landed_turf, COMSIG_TURF_MOVABLE_THROW_LANDED, thrownthing) qdel(src) diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index b78beeed815..78c99f47903 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -85,3 +85,17 @@ SUBSYSTEM_DEF(weather) ///Returns an active storm by its type /datum/controller/subsystem/weather/proc/get_weather_by_type(type) return locate(type) in processing + +/** + * Calls end() on all current weather effects that are currently processing in the weather subsystem. + */ +/client/proc/stop_weather() + set category = "Debug" + set name = "Stop All Active Weather" + + log_admin("[key_name(src)] stopped all currently active weather.") + message_admins("[key_name_admin(src)] stopped all currently active weather.") + for(var/datum/weather/current_weather as anything in SSweather.processing) + if(current_weather in SSweather.processing) + current_weather.end() + BLACKBOX_LOG_ADMIN_VERB("Stop All Active Weather") diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 8ae3da33e3a..e452b860f00 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -48,6 +48,7 @@ name = "My Watchlist Status is Not Important" desc = "You may be under the impression that violent video games are a harmless pastime, but the security and medical personnel swarming your location with batons and knockout gas look like they disagree." database_id = MEDAL_GAMER + icon = "live_sec_reaction" /datum/award/achievement/misc/vendor_squish name = "I Was a Teenage Anarchist" @@ -68,6 +69,7 @@ name = "One Lean, Mean, Cleaning Machine" desc = "How does it feel to know that your workplace values a mop bucket on wheels more than you?" // i can do better than this give me time database_id = MEDAL_CLEANBOSS + icon = "cleanboss" /datum/award/achievement/misc/rule8 name = "Rule 8" @@ -141,6 +143,12 @@ database_id = MEDAL_LOCK_ASCENSION icon = "lockascend" +/datum/award/achievement/misc/moon_ascension + name = "The Last Act" + desc = "You managed to become the ringleader and slay the lie." + database_id = MEDAL_MOON_ASCENSION + icon = "moonascend" + /datum/award/achievement/misc/grand_ritual_finale name = "Archmage" desc = "Made a big impression on the station with your phenomenal cosmic power." diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 69f8fd42dcf..75c9cf59aeb 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -46,6 +46,8 @@ var/overlay_icon = 'icons/mob/actions/backgrounds.dmi' /// This is the icon state for any FOREGROUND overlay icons on the button (such as borders) var/overlay_icon_state + /// Toggles whether this action is usable or not + var/action_disabled = FALSE /datum/action/New(Target) link_to(Target) @@ -162,6 +164,8 @@ /datum/action/proc/IsAvailable(feedback = FALSE) if(!owner) return FALSE + if(action_disabled) + return FALSE if((check_flags & AB_CHECK_HANDS_BLOCKED) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) if (feedback) owner.balloon_alert(owner, "hands blocked!") diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm index ed4309c36e1..18fe9f22e80 100644 --- a/code/datums/actions/cooldown_action.dm +++ b/code/datums/actions/cooldown_action.dm @@ -177,7 +177,7 @@ /// Starts a cooldown time for other abilities that share a cooldown with this. Has some niche usage with more complicated attack ai! /// Will use default cooldown time if an override is not specified /datum/action/cooldown/proc/StartCooldownOthers(override_cooldown_time) - if(!length(owner.actions)) + if(!length(owner?.actions)) return // Possible if they have an action they don't control for(var/datum/action/cooldown/shared_ability in owner.actions - src) if(!(shared_cooldown & shared_ability.shared_cooldown)) @@ -187,6 +187,31 @@ else shared_ability.StartCooldownSelf(cooldown_time) +/// Resets the cooldown of this ability +/datum/action/cooldown/proc/ResetCooldown() + next_use_time = world.time + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/// Re-enables this cooldown action +/datum/action/cooldown/proc/enable() + action_disabled = FALSE + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/// Disables this cooldown action +/datum/action/cooldown/proc/disable() + action_disabled = TRUE + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/// Re-enables all cooldown actions +/datum/action/cooldown/proc/enable_cooldown_actions() + for(var/datum/action/cooldown/cd_action in owner.actions) + cd_action.enable() + +/// Disables all cooldown actions +/datum/action/cooldown/proc/disable_cooldown_actions() + for(var/datum/action/cooldown/cd_action in owner.actions) + cd_action.disable() + /datum/action/cooldown/Trigger(trigger_flags, atom/target) . = ..() if(!.) diff --git a/code/datums/actions/items/hands_free.dm b/code/datums/actions/items/hands_free.dm index 24fddb52942..8b7a4f405b1 100644 --- a/code/datums/actions/items/hands_free.dm +++ b/code/datums/actions/items/hands_free.dm @@ -6,3 +6,7 @@ /datum/action/item_action/hands_free/shift_nerves name = "Shift Nerves" + +/datum/action/item_action/hands_free/moth_googles + name = "Toggle Zoom" + desc = "Look further out with the help of your mothic googles." diff --git a/code/datums/actions/mobs/assume_form.dm b/code/datums/actions/mobs/assume_form.dm index b10a91c5d65..a335d0e745d 100644 --- a/code/datums/actions/mobs/assume_form.dm +++ b/code/datums/actions/mobs/assume_form.dm @@ -29,9 +29,10 @@ return ..() /datum/action/cooldown/mob_cooldown/assume_form/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() determine_intent(target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /// Rapid proc to test if we can assume the form of a given atom. Returns TRUE if we can, FALSE if we can't. Done like this so we can be nice and explicit. diff --git a/code/datums/actions/mobs/blood_warp.dm b/code/datums/actions/mobs/blood_warp.dm index 823f756d7af..8503b360954 100644 --- a/code/datums/actions/mobs/blood_warp.dm +++ b/code/datums/actions/mobs/blood_warp.dm @@ -12,8 +12,10 @@ var/remove_inner_pools = TRUE /datum/action/cooldown/mob_cooldown/blood_warp/Activate(atom/target_atom) + disable_cooldown_actions() blood_warp(target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/blood_warp/proc/blood_warp(atom/target) diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index d235b4d50ab..9b8e1c36ef8 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -22,9 +22,10 @@ var/list/charging = list() /datum/action/cooldown/mob_cooldown/charge/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() charge_sequence(owner, target_atom, charge_delay, charge_past) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/charge/proc/charge_sequence(atom/movable/charger, atom/target_atom, delay, past) @@ -48,10 +49,10 @@ charging += charger actively_moving = FALSE SEND_SIGNAL(owner, COMSIG_STARTED_CHARGE) - RegisterSignal(charger, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump), TRUE) - RegisterSignal(charger, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), TRUE) - RegisterSignal(charger, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), TRUE) - RegisterSignal(charger, COMSIG_LIVING_DEATH, PROC_REF(charge_end)) + RegisterSignal(charger, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump), override = TRUE) + RegisterSignal(charger, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE) + RegisterSignal(charger, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), override = TRUE) + RegisterSignal(charger, COMSIG_LIVING_DEATH, PROC_REF(charge_end), override = TRUE) charger.setDir(dir) do_charge_indicator(charger, target) @@ -62,9 +63,9 @@ var/datum/move_loop/new_loop = SSmove_manager.home_onto(charger, target, delay = charge_speed, timeout = time_to_hit, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) if(!new_loop) return - RegisterSignal(new_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) - RegisterSignal(new_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) - RegisterSignal(new_loop, COMSIG_QDELETING, PROC_REF(charge_end)) + RegisterSignal(new_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move), override = TRUE) + RegisterSignal(new_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move), override = TRUE) + RegisterSignal(new_loop, COMSIG_QDELETING, PROC_REF(charge_end), override = TRUE) // Yes this is disgusting. But we need to queue this stuff, and this code just isn't setup to support that right now. So gotta do it with sleeps sleep(time_to_hit + charge_speed) diff --git a/code/datums/actions/mobs/chase_target.dm b/code/datums/actions/mobs/chase_target.dm new file mode 100644 index 00000000000..c88285dd636 --- /dev/null +++ b/code/datums/actions/mobs/chase_target.dm @@ -0,0 +1,42 @@ +/datum/action/cooldown/mob_cooldown/chase_target + name = "Chase Target" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + desc = "Gain a burst of speed to chase down a target." + cooldown_time = 6 SECONDS + /// Affects volume of the charge tell depending on the size of the mob charging + var/size = 1 + +/datum/action/cooldown/mob_cooldown/chase_target/Activate(atom/target_atom) + disable_cooldown_actions() + charge(target_atom) + StartCooldown() + enable_cooldown_actions() + return TRUE + +/// Causes the mob to gain speed and charge at a target +/datum/action/cooldown/mob_cooldown/chase_target/proc/charge(atom/target) + var/mob/living/living_mob = target + if(istype(living_mob) && living_mob.stat == DEAD) + return + owner.visible_message(span_boldwarning("[owner] charges!")) + owner.SpinAnimation(speed = 20, loops = 3, parallel = FALSE) + if(ishostile(owner)) + var/mob/living/simple_animal/hostile/hostile_mob = owner + hostile_mob.retreat_distance = 0 + hostile_mob.minimum_distance = 0 + hostile_mob.set_varspeed(0) + addtimer(CALLBACK(src, PROC_REF(reset_charge)), 6 SECONDS) + addtimer(CALLBACK(src, PROC_REF(throw_thyself)), 2 SECONDS) + +/// This is the proc that actually does the throwing. Charge only adds a timer for this. +/datum/action/cooldown/mob_cooldown/chase_target/proc/throw_thyself() + playsound(owner, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) + owner.throw_at(target, 7, 1.1, owner, FALSE, FALSE, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY) + +/// Resets the charge buffs. +/datum/action/cooldown/mob_cooldown/chase_target/proc/reset_charge() + var/mob/living/simple_animal/hostile/hostile_mob = owner + hostile_mob.retreat_distance = 5 + hostile_mob.minimum_distance = 5 + hostile_mob.set_varspeed(2) diff --git a/code/datums/actions/mobs/create_legion_skull.dm b/code/datums/actions/mobs/create_legion_skull.dm new file mode 100644 index 00000000000..341ef2d8203 --- /dev/null +++ b/code/datums/actions/mobs/create_legion_skull.dm @@ -0,0 +1,19 @@ +/datum/action/cooldown/mob_cooldown/create_legion_skull + name = "Create Legion Skull" + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_head" + desc = "Create a legion skull to chase down a targeted enemy" + cooldown_time = 2 SECONDS + +/datum/action/cooldown/mob_cooldown/create_legion_skull/Activate(atom/target_atom) + disable_cooldown_actions() + create(target_atom) + StartCooldown() + enable_cooldown_actions() + return TRUE + +/// Creates a new skull assigned to the owner of this action +/datum/action/cooldown/mob_cooldown/create_legion_skull/proc/create(atom/target) + var/mob/living/basic/legion_brood/minion = new(owner.loc) + minion.assign_creator(owner) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target diff --git a/code/datums/actions/mobs/create_legion_turrets.dm b/code/datums/actions/mobs/create_legion_turrets.dm new file mode 100644 index 00000000000..5fb668ebc36 --- /dev/null +++ b/code/datums/actions/mobs/create_legion_turrets.dm @@ -0,0 +1,116 @@ +/datum/action/cooldown/mob_cooldown/create_legion_turrets + name = "Create Sentinels" + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_turret" + desc = "Create legion sentinels that fire at any enemies." + cooldown_time = 2 SECONDS + /// Minimum number of turrets that can be spawned + var/minimum_turrets = 2 + /// Maximum number of turrets that can be spawned + var/maximum_turrets = 2 + +/datum/action/cooldown/mob_cooldown/create_legion_turrets/Activate(atom/target_atom) + disable_cooldown_actions() + create(target_atom) + StartCooldown() + enable_cooldown_actions() + return TRUE + +/// Creates new legion turrets around the owner between the minimum and maximum +/datum/action/cooldown/mob_cooldown/create_legion_turrets/proc/create(atom/target) + playsound(owner, 'sound/magic/RATTLEMEBONES.ogg', 100, TRUE) + var/list/possible_locations = list() + for(var/turf/checked_turf in oview(owner, 4)) //Only place the turrets on open turfs + if(checked_turf.is_blocked_turf()) + continue + possible_locations += checked_turf + for(var/i in 1 to min(rand(minimum_turrets, maximum_turrets), length(possible_locations))) //Makes sure aren't spawning in nullspace. + var/chosen = pick_n_take(possible_locations) + new /obj/structure/legionturret(chosen) + +/// A basic turret that shoots at nearby mobs. Intended to be used for the legion megafauna. +/obj/structure/legionturret + name = "\improper Legion sentinel" + desc = "The eye pierces your soul." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_turret" + light_power = 0.5 + light_range = 2 + max_integrity = 80 + luminosity = 6 + anchored = TRUE + density = TRUE + layer = ABOVE_OBJ_LAYER + armor_type = /datum/armor/structure_legionturret + //Compared with the targeted mobs. If they have the faction, turret won't shoot. + faction = list(FACTION_MINING) + ///What kind of projectile the actual damaging part should be. + var/projectile_type = /obj/projectile/beam/legion + ///Time until the tracer gets shot + var/initial_firing_time = 1.8 SECONDS + ///How long it takes between shooting the tracer and the projectile. + var/shot_delay = 0.8 SECONDS + +/datum/armor/structure_legionturret + laser = 100 + +/obj/structure/legionturret/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(set_up_shot)), initial_firing_time) + ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) + +/// Handles an extremely basic AI +/obj/structure/legionturret/proc/set_up_shot() + for(var/mob/living/possible_target in oview(9, src)) + if(possible_target.stat == DEAD || possible_target.stat == UNCONSCIOUS) + continue + if(faction_check(faction, possible_target.faction)) + continue + fire(possible_target) + return + fire(get_edge_target_turf(src, pick(GLOB.cardinals))) + +/// Called when attacking a target. Shoots a projectile at the turf underneath the target. +/obj/structure/legionturret/proc/fire(atom/target) + var/turf/target_turf = get_turf(target) + var/turf/our_turf = get_turf(src) + if(!target_turf || !our_turf) + return + //Now we generate the tracer. + var/angle = get_angle(our_turf, target_turf) + var/datum/point/vector/V = new(our_turf.x, our_turf.y, our_turf.z, 0, 0, angle) + generate_tracer_between_points(V, V.return_vector_after_increments(6), /obj/effect/projectile/tracer/legion/tracer, 0, shot_delay, 0, 0, 0, null) + playsound(src, 'sound/machines/airlockopen.ogg', 100, TRUE) + addtimer(CALLBACK(src, PROC_REF(fire_beam), angle), shot_delay) + +/// Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction. +/obj/structure/legionturret/proc/fire_beam(angle) + var/obj/projectile/ouchie = new projectile_type(loc) + ouchie.firer = src + ouchie.fire(angle) + playsound(src, 'sound/effects/bin_close.ogg', 100, TRUE) + QDEL_IN(src, 0.5 SECONDS) + +/// Used for the legion turret. +/obj/projectile/beam/legion + name = "blood pulse" + hitsound = 'sound/magic/magic_missile.ogg' + damage = 19 + range = 6 + light_color = COLOR_SOFT_RED + impact_effect_type = /obj/effect/temp_visual/kinetic_blast + tracer_type = /obj/effect/projectile/tracer/legion + muzzle_type = /obj/effect/projectile/tracer/legion + impact_type = /obj/effect/projectile/tracer/legion + hitscan = TRUE + projectile_piercing = ALL + +/// Used for the legion turret tracer. +/obj/effect/projectile/tracer/legion/tracer + icon = 'icons/effects/beam.dmi' + icon_state = "blood_light" + +/// Used for the legion turret beam. +/obj/effect/projectile/tracer/legion + icon = 'icons/effects/beam.dmi' + icon_state = "blood" diff --git a/code/datums/actions/mobs/dash.dm b/code/datums/actions/mobs/dash.dm index ddb814eb24f..81d6f8165d9 100644 --- a/code/datums/actions/mobs/dash.dm +++ b/code/datums/actions/mobs/dash.dm @@ -10,9 +10,10 @@ var/pick_range = 5 /datum/action/cooldown/mob_cooldown/dash/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() dash_to(target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/dash/proc/dash_to(atom/dash_target) diff --git a/code/datums/actions/mobs/defensive_mode.dm b/code/datums/actions/mobs/defensive_mode.dm index a73d6bb25d1..6030afea137 100644 --- a/code/datums/actions/mobs/defensive_mode.dm +++ b/code/datums/actions/mobs/defensive_mode.dm @@ -19,9 +19,10 @@ return ..() /datum/action/cooldown/mob_cooldown/defensive_mode/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() activate_defence(owner) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/defensive_mode/proc/activate_defence(mob/living/basic/owner_mob) diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm index b3673b2f96c..e52fa14d0d9 100644 --- a/code/datums/actions/mobs/fire_breath.dm +++ b/code/datums/actions/mobs/fire_breath.dm @@ -20,8 +20,10 @@ var/mech_damage = 45 /datum/action/cooldown/mob_cooldown/fire_breath/Activate(atom/target_atom) + disable_cooldown_actions() attack_sequence(target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /// Apply our specific fire breathing shape, in proc form so we can override it in subtypes @@ -91,7 +93,7 @@ button_icon = 'icons/effects/fire.dmi' button_icon_state = "1" desc = "Breathe flames in all directions." - cooldown_time = 3 SECONDS + cooldown_time = 10.5 SECONDS click_to_activate = FALSE /// How many fire lines do we produce to turn a full circle? var/sectors = 12 diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index a5acc29bab6..b86a710fbf2 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -21,9 +21,10 @@ M.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), REF(src)) /datum/action/cooldown/mob_cooldown/lava_swoop/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() attack_sequence(target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/lava_swoop/proc/attack_sequence(atom/target) diff --git a/code/datums/actions/mobs/meteors.dm b/code/datums/actions/mobs/meteors.dm index 0c95b6c8e17..11cdac43864 100644 --- a/code/datums/actions/mobs/meteors.dm +++ b/code/datums/actions/mobs/meteors.dm @@ -6,9 +6,10 @@ cooldown_time = 3 SECONDS /datum/action/cooldown/mob_cooldown/meteors/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() create_meteors(target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/meteors/proc/create_meteors(atom/target) diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index 5f97081186d..be7eff89633 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -18,9 +18,10 @@ var/projectile_speed_multiplier = 1 /datum/action/cooldown/mob_cooldown/projectile_attack/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() attack_sequence(owner, target_atom) StartCooldown() + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/projectile_attack/proc/attack_sequence(mob/living/firer, atom/target) @@ -272,7 +273,7 @@ desc = "Fires a kinetic accelerator projectile at the target." cooldown_time = 1.5 SECONDS projectile_type = /obj/projectile/kinetic/miner - projectile_sound = 'sound/weapons/kenetic_accel.ogg' + projectile_sound = 'sound/weapons/kinetic_accel.ogg' /datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator/Activate(atom/target_atom) . = ..() diff --git a/code/datums/actions/mobs/transform_weapon.dm b/code/datums/actions/mobs/transform_weapon.dm index 3abeed5dfbf..b268fac6414 100644 --- a/code/datums/actions/mobs/transform_weapon.dm +++ b/code/datums/actions/mobs/transform_weapon.dm @@ -9,9 +9,10 @@ var/max_cooldown_time = 10 SECONDS /datum/action/cooldown/mob_cooldown/transform_weapon/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) + disable_cooldown_actions() do_transform(target_atom) StartCooldown(rand(cooldown_time, max_cooldown_time), 0) + enable_cooldown_actions() return TRUE /datum/action/cooldown/mob_cooldown/transform_weapon/proc/do_transform(atom/target) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index a13cc8b36fa..b525f66576c 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -435,6 +435,25 @@ multiple modular subtrees with behaviors blackboard[key] = thing post_blackboard_key_set(key) +/** + * Helper to force a key to be a certain thing no matter what's already there + * + * Useful for if you're overriding a list with a new list entirely, + * as otherwise it would throw a runtime error from trying to override a list + * + * Not necessary to use if you aren't dealing with lists, as set_blackboard_key will clear the existing value + * in that case already, but may be useful for clarity. + * + * * key - A blackboard key + * * thing - a value to set the blackboard key to. + */ +/datum/ai_controller/proc/override_blackboard_key(key, thing) + if(blackboard[key] == thing) + return + + clear_blackboard_key(key) + set_blackboard_key(key, thing) + /** * Sets the key at index thing to the passed value * diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm index 55f6ef4c4c0..6eb7c36dadd 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm @@ -8,13 +8,15 @@ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION /// If true we will get rid of our target on completion var/clear_target = FALSE + ///should we use a different movement type? + var/new_movement_type /datum/ai_behavior/travel_towards/setup(datum/ai_controller/controller, target_key) . = ..() var/atom/target = controller.blackboard[target_key] if(QDELETED(target)) return FALSE - set_movement_target(controller, target) + set_movement_target(controller, target, new_movement_type) /datum/ai_behavior/travel_towards/perform(seconds_per_tick, datum/ai_controller/controller, target_key) . = ..() @@ -24,6 +26,8 @@ . = ..() if (clear_target) controller.clear_blackboard_key(target_key) + if(new_movement_type) + controller.change_ai_movement_type(initial(controller.ai_movement)) /datum/ai_behavior/travel_towards/stop_on_arrival clear_target = TRUE diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index 84a007c2559..e06df971561 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -12,11 +12,11 @@ finish_action(controller, TRUE) return var/find_this_thing = search_tactic(controller, locate_path, search_range) - if(find_this_thing) - controller.set_blackboard_key(set_key, find_this_thing) - finish_action(controller, TRUE) - else + if(QDELETED(controller.pawn) || isnull(find_this_thing)) finish_action(controller, FALSE) + return + controller.set_blackboard_key(set_key, find_this_thing) + finish_action(controller, TRUE) /datum/ai_behavior/find_and_set/proc/search_tactic(datum/ai_controller/controller, locate_path, search_range) return locate(locate_path) in oview(search_range, controller.pawn) diff --git a/code/datums/ai/hunting_behavior/hunting_behaviors.dm b/code/datums/ai/hunting_behavior/hunting_behaviors.dm index 3e747640be3..1615a28d53b 100644 --- a/code/datums/ai/hunting_behavior/hunting_behaviors.dm +++ b/code/datums/ai/hunting_behavior/hunting_behaviors.dm @@ -160,3 +160,19 @@ var/datum/action/cooldown/ability = hunter.ai_controller.blackboard[ability_key] ability.InterceptClickOn(hunter, null, hunted) + +/datum/ai_behavior/hunt_target/latch_onto + +/datum/ai_behavior/hunt_target/latch_onto/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(living_pawn.buckled) + return FALSE + +/datum/ai_behavior/hunt_target/latch_onto/target_caught(mob/living/hunter, obj/hunted) + if(hunter.buckled) + return FALSE + if(!hunted.buckle_mob(hunter, force = TRUE)) + return FALSE + hunted.visible_message(span_notice("[hunted] has been latched onto by [hunter]!")) + return TRUE diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 8be754f8d4b..ecfedb86daf 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -5,6 +5,7 @@ have ways of interacting with a specific mob and control it. ///OOK OOK OOK /datum/ai_controller/monkey + ai_movement = /datum/ai_movement/basic_avoidance movement_delay = 0.4 SECONDS planning_subtrees = list( /datum/ai_planning_subtree/generic_resist, diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 3644869140d..6024b7e7562 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -39,7 +39,7 @@ /datum/ai_movement/jps/bot max_pathing_attempts = 25 - maximum_length = AI_BOT_PATH_LENGTH + maximum_length = 25 diagonal_flags = DIAGONAL_REMOVE_ALL /datum/ai_movement/jps/bot/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) @@ -48,3 +48,6 @@ if(isnull(our_pawn)) return our_pawn.RegisterSignal(loop, COMSIG_MOVELOOP_JPS_FINISHED_PATHING, TYPE_PROC_REF(/mob/living/basic/bot, generate_bot_path)) + +/datum/ai_movement/jps/bot/travel_to_beacon + maximum_length = AI_BOT_PATH_LENGTH diff --git a/code/datums/ai_laws/ai_laws.dm b/code/datums/ai_laws/ai_laws.dm index 9b9f9c62841..971dc118f3a 100644 --- a/code/datums/ai_laws/ai_laws.dm +++ b/code/datums/ai_laws/ai_laws.dm @@ -139,7 +139,7 @@ GLOBAL_VAR(round_default_lawset) /// These laws will go away when an AI is reset var/list/hacked = list() -/datum/ai_laws/Destroy(force = FALSE, ...) +/datum/ai_laws/Destroy(force = FALSE) if(!QDELETED(owner)) //Stopgap to help with laws randomly being lost. This stack_trace will hopefully help find the real issues. if(force) //Unless we're forced... stack_trace("AI law datum for [owner] has been forcefully destroyed incorrectly; the owner variable should be cleared first!") @@ -149,6 +149,18 @@ GLOBAL_VAR(round_default_lawset) owner = null return ..() +/// Makes a copy of the lawset and returns a new law datum. +/datum/ai_laws/proc/copy_lawset() + var/datum/ai_laws/new_lawset = new type() + new_lawset.protected_zeroth = protected_zeroth + new_lawset.zeroth = zeroth + new_lawset.zeroth_borg = zeroth_borg + new_lawset.inherent = inherent.Copy() + new_lawset.supplied = supplied.Copy() + new_lawset.ion = ion.Copy() + new_lawset.hacked = hacked.Copy() + return new_lawset + /datum/ai_laws/pai name = "pAI Directives" zeroth = ("Serve your master.") @@ -429,8 +441,10 @@ GLOBAL_VAR(round_default_lawset) to_chat(to_who, examine_block(jointext(printable_laws, "\n"))) /datum/ai_laws/proc/associate(mob/living/silicon/M) - if(!owner) - owner = M + if(owner) + CRASH("AI law datum linked to [owner] attempted to associate with another mob [M]") + + owner = M /** * Generates a list of all laws on this datum, including rendered HTML tags if required diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 90248df1cfb..fc30d7fb3b8 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -330,3 +330,104 @@ /datum/brain_trauma/severe/dyslexia/on_lose() REMOVE_TRAIT(owner, TRAIT_ILLITERATE, TRAUMA_TRAIT) ..() + +/* + * Brain traumas that eldritch paintings apply + * This one is for "The Sister and He Who Wept" or /obj/structure/sign/painting/eldritch + */ +/datum/brain_trauma/severe/weeping + name = "The Weeping" + desc = "Patient hallucinates everyone as a figure called He Who Wept" + scan_desc = "H_E##%%%WEEP6%11S!!,)()" + gain_text = span_warning("HE WEEPS AND I WILL SEE HIM ONCE MORE") + lose_text = span_notice("You feel the tendrils of something slip from your mind.") + random_gain = FALSE + /// Our cooldown declare for causing hallucinations + COOLDOWN_DECLARE(weeping_hallucinations) + +/datum/brain_trauma/severe/weeping/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious()) + return + // If they have examined a painting recently + if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + if(!COOLDOWN_FINISHED(src, weeping_hallucinations)) + return + owner.cause_hallucination(/datum/hallucination/delusion/preset/heretic, "Caused by The Weeping brain trauma") + owner.add_mood_event("eldritch_weeping", /datum/mood_event/eldritch_painting/weeping) + COOLDOWN_START(src, weeping_hallucinations, 10 SECONDS) + ..() + +//This one is for "The First Desire" or /obj/structure/sign/painting/eldritch/desire +/datum/brain_trauma/severe/flesh_desire + name = "The Desire for Flesh" + desc = "Patient appears hungrier and only wishes to eat meats." + scan_desc = "H_(82882)G3E:__))9R" + gain_text = span_warning("I feel a hunger, only organs and flesh will feed it...") + lose_text = span_notice("You no longer feel the hunger for flesh...") + random_gain = FALSE + /// How much faster we loose hunger + var/hunger_rate = 15 + +/datum/brain_trauma/severe/flesh_desire/on_gain() + // Allows them to eat faster, mainly for flavor + ADD_TRAIT(owner, TRAIT_VORACIOUS, REF(src)) + ADD_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src)) + ..() + +/datum/brain_trauma/severe/flesh_desire/on_life(seconds_per_tick, times_fired) + // Causes them to need to eat at 10x the normal rate + owner.adjust_nutrition(-hunger_rate * HUNGER_FACTOR) + if(SPT_PROB(10, seconds_per_tick)) + to_chat(owner, span_notice("You feel a ravenous hunger for flesh...")) + owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0) + +/datum/brain_trauma/severe/flesh_desire/on_lose() + REMOVE_TRAIT(owner, TRAIT_VORACIOUS, REF(src)) + REMOVE_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src)) + return ..() + +// This one is for "Lady out of gates" or /obj/item/wallframe/painting/eldritch/beauty +/datum/brain_trauma/severe/eldritch_beauty + name = "The Pursuit of Perfection" + desc = "Patient seems to furiously scratch at their body, the only way to make them cease is for them to remove their jumpsuit." + scan_desc = "I_)8(P_E##R&&F(E)C__T)" + gain_text = span_warning("I WILL RID MY FLESH FROM IMPERFECTION!! I WILL BE PERFECT WITHOUT MY SUITS!!") + lose_text = span_notice("You feel the influence of something slip your mind, and you feel content as you are.") + random_gain = FALSE + /// How much damage we deal with each scratch + var/scratch_damage = 0.5 + +/datum/brain_trauma/severe/eldritch_beauty/on_life(seconds_per_tick, times_fired) + // Jumpsuits ruin the "perfection" of the body + if(!owner.get_item_by_slot(ITEM_SLOT_ICLOTHING)) + return + + // Scratching code + var/obj/item/bodypart/bodypart = owner.get_bodypart(owner.get_random_valid_zone(even_weights = TRUE)) + if(!(bodypart && IS_ORGANIC_LIMB(bodypart)) && bodypart.bodypart_flags & BODYPART_PSEUDOPART) + return + if(owner.incapacitated()) + return + bodypart.receive_damage(scratch_damage) + if(SPT_PROB(33, seconds_per_tick)) + to_chat(owner, span_notice("You scratch furiously at [bodypart] to ruin the cloth that hides the beauty!")) + +// This one is for "Climb over the rusted mountain" or /obj/structure/sign/painting/eldritch/rust +/datum/brain_trauma/severe/rusting + name = "The Rusted Climb" + desc = "Patient seems to oxidise things around them at random, and seem to believe they are aiding a creature in climbing a mountin." + scan_desc = "C_)L(#_I_##M;B" + gain_text = span_warning("The rusted climb shall finish at the peak") + lose_text = span_notice("The rusted climb? Whats that? An odd dream to be sure.") + random_gain = FALSE + +/datum/brain_trauma/severe/rusting/on_life(seconds_per_tick, times_fired) + var/atom/tile = get_turf(owner) + // Examining a painting should stop this effect to give counterplay + if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + + if(SPT_PROB(50, seconds_per_tick)) + to_chat(owner, span_notice("You feel eldritch energies pulse from your body!")) + tile.rust_heretic_act() diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index d9348f98f4b..651881292e9 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -245,14 +245,15 @@ /datum/brain_trauma/special/psychotic_brawling/on_gain() ..() - psychotic_brawling = new(null) + psychotic_brawling = new() + psychotic_brawling.allow_temp_override = FALSE if(!psychotic_brawling.teach(owner, TRUE)) to_chat(owner, span_notice("But your martial knowledge keeps you grounded.")) qdel(src) /datum/brain_trauma/special/psychotic_brawling/on_lose() ..() - psychotic_brawling.remove(owner) + psychotic_brawling.fully_remove(owner) QDEL_NULL(psychotic_brawling) /datum/brain_trauma/special/psychotic_brawling/bath_salts diff --git a/code/datums/candidate_poll.dm b/code/datums/candidate_poll.dm index 1856858accd..6ccd43c01fd 100644 --- a/code/datums/candidate_poll.dm +++ b/code/datums/candidate_poll.dm @@ -20,8 +20,23 @@ var/finished = FALSE /// Used to categorize in the alerts system and identify polls of same question+role so we can stack the alert buttons var/poll_key + ///Response messages sent in specific key areas for full customization of polling. + var/list/response_messages = list( + POLL_RESPONSE_SIGNUP = "You have signed up for %ROLE%! A candidate will be picked randomly soon.", + POLL_RESPONSE_ALREADY_SIGNED = "You have already signed up for this!", + POLL_RESPONSE_NOT_SIGNED = "You aren't signed up for this!", + POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to unregister yourself, selection has already begun!", + POLL_RESPONSE_UNREGISTERED = "You have been unregistered as a candidate for %ROLE%. You can sign up again before the poll ends.", + ) -/datum/candidate_poll/New(polled_role, polled_question, poll_duration, poll_ignoring_category, poll_jumpable) +/datum/candidate_poll/New( + polled_role, + polled_question, + poll_duration, + poll_ignoring_category, + poll_jumpable, + list/custom_response_messages = list(), +) role = polled_role question = polled_question duration = poll_duration @@ -30,6 +45,10 @@ signed_up = list() time_started = world.time poll_key = "[question]_[role ? role : "0"]" + if(custom_response_messages.len) + response_messages = custom_response_messages + for(var/individual_message in response_messages) + response_messages[individual_message] = replacetext(response_messages[individual_message], "%ROLE%", role) return ..() /datum/candidate_poll/Destroy() @@ -49,7 +68,7 @@ return FALSE if(candidate in signed_up) if(!silent) - to_chat(candidate, span_warning("You have already signed up for this!")) + to_chat(candidate, span_warning(response_messages[POLL_RESPONSE_ALREADY_SIGNED])) return FALSE if(time_left() <= 0) if(!silent) @@ -59,7 +78,7 @@ signed_up += candidate if(!silent) - to_chat(candidate, span_notice("You have signed up for [role]! A candidate will be picked randomly soon.")) + to_chat(candidate, span_notice(response_messages[POLL_RESPONSE_SIGNUP])) // Sign them up for any other polls with the same mob type for(var/datum/candidate_poll/existing_poll as anything in SSpolling.currently_polling) if(src != existing_poll && poll_key == existing_poll.poll_key && !(candidate in existing_poll.signed_up)) @@ -73,17 +92,17 @@ return FALSE if(!(candidate in signed_up)) if(!silent) - to_chat(candidate, span_warning("You aren't signed up for this!")) + to_chat(candidate, span_warning(response_messages[POLL_RESPONSE_NOT_SIGNED])) return FALSE if(time_left() <= 0) if(!silent) - to_chat(candidate, span_danger("It's too late to unregister yourself, selection has already begun!")) + to_chat(candidate, span_danger(response_messages[POLL_RESPONSE_TOO_LATE_TO_UNREGISTER])) return FALSE signed_up -= candidate if(!silent) - to_chat(candidate, span_danger("You have been unregistered as a candidate for [role]. You can sign up again before the poll ends.")) + to_chat(candidate, span_danger(response_messages[POLL_RESPONSE_UNREGISTERED])) for(var/datum/candidate_poll/existing_poll as anything in SSpolling.currently_polling) if(src != existing_poll && poll_key == existing_poll.poll_key && (candidate in existing_poll.signed_up)) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 453a417077d..06b4ca6011c 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -44,10 +44,6 @@ var/eol_complete /// Contains the approximate amount of lines for height decay var/approx_lines - /// Contains the reference to the next chatmessage in the bucket, used by runechat subsystem - var/datum/chatmessage/next - /// Contains the reference to the previous chatmessage in the bucket, used by runechat subsystem - var/datum/chatmessage/prev /// The current index used for adjusting the layer of each sequential chat message such that recent messages will overlay older ones var/static/current_z_idx = 0 /// When we started animating the message @@ -125,11 +121,11 @@ if (length_char(text) > maxlen) text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment - // Calculate target color if not already present + // Calculate target color if not already present - BUBBER EDIT ADDTION if (!target.chat_color || target.chat_color_name != target.name) target.chat_color = get_chat_color_string(target.name) // BUBBER EDIT CHANGE - ORIGINAL: target.chat_color = colorize_string(target.name) target.chat_color_darkened = get_chat_color_string(target.name, darkened = TRUE) // BUBBER EDIT CHANGE - ORIGINAL: target.chat_color_darkened = colorize_string(target.name, 0.85, 0.85) - target.chat_color_name = target.name + target.chat_color_name = target.name // BUBBER EDIT END // Get rid of any URL schemes that might cause BYOND to automatically wrap something in an anchor tag var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g") @@ -150,6 +146,7 @@ extra_classes |= SPAN_YELL var/list/prefixes + var/chat_color_name_to_use // Append radio icon if from a virtual speaker if (extra_classes.Find("virtual-speaker")) @@ -158,6 +155,19 @@ else if (extra_classes.Find("emote")) var/image/r_icon = image('icons/ui_icons/chat/chat_icons.dmi', icon_state = "emote") LAZYADD(prefixes, "\icon[r_icon]") + chat_color_name_to_use = target.get_visible_name(add_id_name = FALSE) // use face name for nonverbal messages + + if(isnull(chat_color_name_to_use)) + if(HAS_TRAIT(target, TRAIT_SIGN_LANG)) + chat_color_name_to_use = target.get_visible_name(add_id_name = FALSE) // use face name for signers too + else + chat_color_name_to_use = target.GetVoice() // for everything else, use the target's voice name + + // Calculate target color if not already present + if (!target.chat_color || target.chat_color_name != chat_color_name_to_use) + target.chat_color = colorize_string(chat_color_name_to_use) + target.chat_color_darkened = colorize_string(chat_color_name_to_use, 0.85, 0.85) + target.chat_color_name = chat_color_name_to_use // Append language icon if the language uses one var/datum/language/language_instance = GLOB.language_datum_instances[language] diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 76538bcb315..9829dfc3f52 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -32,6 +32,7 @@ /obj/singularity, /obj/structure/lattice, /obj/structure/stone_tile, + /obj/structure/ore_vent, )) /datum/component/chasm/Initialize(turf/target, mapload) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 832ad22698b..3581bec4b5a 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -214,10 +214,10 @@ if(result.atom_storage && recipe.delete_contents) for(var/obj/item/thing in result) qdel(thing) - result.reagents?.clear_reagents() var/datum/reagents/holder = locate() in parts if(holder) //transfer reagents from ingredients to result - if(result.reagents) + if(!ispath(recipe.result, /obj/item/reagent_containers) && result.reagents) + result.reagents.clear_reagents() holder.trans_to(result.reagents, holder.total_volume, no_react = TRUE) parts -= holder qdel(holder) diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index d01ffbc00dc..8b2bfa40731 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -205,3 +205,12 @@ /obj/item/stack/cable_coil = 2, ) category = CAT_EQUIPMENT + +/datum/crafting_recipe/bonedice + name = "Bone Die" + result = /obj/item/dice/d6/bone + time = 5 SECONDS + reqs = list( + /obj/item/stack/sheet/bone = 1, + ) + category = CAT_EQUIPMENT diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 8cb6ac1459c..bb01a4d78dc 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -378,3 +378,23 @@ /obj/item/paper = 1, ) category = CAT_CLOTHING + +/datum/crafting_recipe/biohood_sec + name = "security biohood" + result = /obj/item/clothing/head/bio_hood/security + time = 2 SECONDS + reqs = list( + /obj/item/clothing/head/bio_hood/general = 1, + /obj/item/clothing/head/helmet/sec = 1, + ) + category = CAT_CLOTHING + +/datum/crafting_recipe/biosuit_sec + name = "security biosuit" + result = /obj/item/clothing/suit/bio_suit/security + time = 2 SECONDS + reqs = list( + /obj/item/clothing/suit/bio_suit/general = 1, + /obj/item/clothing/suit/armor/vest = 1, + ) + category = CAT_CLOTHING diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm index b7d93f162a5..65843e6baf4 100644 --- a/code/datums/components/crafting/tools.dm +++ b/code/datums/components/crafting/tools.dm @@ -55,3 +55,26 @@ ) result = /obj/item/stack/medical/bandage/makeshift category = CAT_TOOLS + +/datum/crafting_recipe/bone_rod + name = "Bone Fishing Rod" + result = /obj/item/fishing_rod/bone + time = 5 SECONDS + reqs = list(/obj/item/stack/sheet/leather = 1, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/bone = 2) + category = CAT_TOOLS + +/datum/crafting_recipe/sinew_line + name = "Sinew Fishing Line Reel" + result = /obj/item/fishing_line/sinew + reqs = list(/obj/item/stack/sheet/sinew = 2) + time = 2 SECONDS + category = CAT_TOOLS + +/datum/crafting_recipe/bone_hook + name = "Goliath Bone Hook" + result = /obj/item/fishing_hook/bone + reqs = list(/obj/item/stack/sheet/bone = 1) + time = 2 SECONDS + category = CAT_TOOLS diff --git a/code/datums/components/customizable_reagent_holder.dm b/code/datums/components/customizable_reagent_holder.dm index 7bffb3d9ada..bd88508bec0 100644 --- a/code/datums/components/customizable_reagent_holder.dm +++ b/code/datums/components/customizable_reagent_holder.dm @@ -57,6 +57,7 @@ /datum/component/customizable_reagent_holder/Destroy(force) QDEL_NULL(top_overlay) + LAZYCLEARLIST(ingredients) return ..() @@ -64,6 +65,7 @@ . = ..() RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(customizable_attack)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(food_exited)) RegisterSignal(parent, COMSIG_ATOM_PROCESSED, PROC_REF(on_processed)) RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) ADD_TRAIT(parent, TRAIT_CUSTOMIZABLE_REAGENT_HOLDER, REF(src)) @@ -74,6 +76,7 @@ UnregisterSignal(parent, list( COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_EXITED, COMSIG_ATOM_PROCESSED, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, )) @@ -91,20 +94,13 @@ SIGNAL_HANDLER var/atom/atom_parent = parent - var/ingredients_listed = "" - if (LAZYLEN(ingredients)) - for (var/i in 1 to ingredients.len) - var/obj/item/ingredient = ingredients[i] - var/ending = ", " - switch(length(ingredients)) - if (2) - if (i == 1) - ending = " and " - if (3 to INFINITY) - if (i == ingredients.len - 1) - ending = ", and " - ingredients_listed += "\a [ingredient.name][ending]" - examine_list += "It [LAZYLEN(ingredients) ? "contains [ingredients_listed]making a [custom_adjective()]-sized [initial(atom_parent.name)]" : "does not contain any ingredients"]." + var/list/ingredients_listed = list() + for(var/obj/item/ingredient as anything in ingredients) + ingredients_listed += "\a [ingredient.name]" + + examine_list += "It [LAZYLEN(ingredients) \ + ? "contains [english_list(ingredients_listed)] making a [custom_adjective()]-sized [initial(atom_parent.name)]" \ + : "does not contain any ingredients"]." //// Proc that checks if an ingredient is valid or not, returning false if it isnt and true if it is. /datum/component/customizable_reagent_holder/proc/valid_ingredient(obj/ingredient) @@ -289,3 +285,8 @@ context[SCREENTIP_CONTEXT_LMB] = "[screentip_verb] [held_item]" return CONTEXTUAL_SCREENTIP_SET + +/// Clear refs if our food "goes away" somehow +/datum/component/customizable_reagent_holder/proc/food_exited(datum/source, atom/movable/gone) + SIGNAL_HANDLER + LAZYREMOVE(ingredients, gone) diff --git a/code/datums/components/deployable.dm b/code/datums/components/deployable.dm index 14fc6747bd6..f45a5b226c3 100644 --- a/code/datums/components/deployable.dm +++ b/code/datums/components/deployable.dm @@ -76,10 +76,8 @@ new_direction = direction deployed_object = new thing_to_be_deployed(deploy_location) - deployed_object.setDir(new_direction) - - // Sets the direction of the resulting object if the variable says to if(direction_setting) + deployed_object.setDir(new_direction) deployed_object.update_icon_state() deployments -= 1 diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 05456380235..c8a00ce74cd 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -33,7 +33,7 @@ var/obj/item/fishing_rod/rod = possibly_rod if(!istype(rod)) return - if(HAS_TRAIT(user,TRAIT_GONE_FISHING) || rod.currently_hooked_item) + if(HAS_TRAIT(user,TRAIT_GONE_FISHING) || rod.fishing_line) user.balloon_alert(user, "already fishing") return COMPONENT_NO_AFTERATTACK var/denial_reason = fish_source.reason_we_cant_fish(rod, user, parent) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index b7b6bda2f5a..ded8b8c4161 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -580,8 +580,10 @@ Behavior that's still missing from this component that original food items had t food_quality = min(food_quality, FOOD_QUALITY_TOP) var/atom/owner = parent var/timeout_mod = owner.reagents.get_average_purity(/datum/reagent/consumable) * 2 // mood event duration is 100% at average purity of 50% - var/event = GLOB.food_quality_events[food_quality] - gourmand.add_mood_event("quality_food", event, timeout_mod) + var/datum/mood_event/event = GLOB.food_quality_events[food_quality] + event = new event.type + event.timeout *= timeout_mod + gourmand.add_mood_event("quality_food", event) gourmand.adjust_disgust(-5 + -2 * food_quality * fraction) var/quality_label = GLOB.food_quality_description[food_quality] to_chat(gourmand, span_notice("That's \an [quality_label] meal.")) diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index 29625a8a321..f3db67efab5 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -138,19 +138,12 @@ /datum/component/ice_cream_holder/proc/on_item_attack_obj(obj/item/source, obj/target, mob/user) SIGNAL_HANDLER if(!istype(target, /obj/machinery/icecream_vat)) - return + return COMPONENT_CANCEL_ATTACK_CHAIN + if(length(scoops) >= max_scoops) + target.balloon_alert(user, "too many scoops!") + return COMPONENT_CANCEL_ATTACK_CHAIN var/obj/machinery/icecream_vat/dispenser = target - if(length(scoops) < max_scoops) - if(dispenser.product_types[dispenser.selected_flavour] > 0) - var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[dispenser.selected_flavour] - if(flavour.add_flavour(src, dispenser.beaker?.reagents.total_volume ? dispenser.beaker.reagents : null)) - dispenser.visible_message("[icon2html(dispenser, viewers(source))] [span_info("[user] scoops delicious [dispenser.selected_flavour] ice cream into [source].")]") - dispenser.product_types[dispenser.selected_flavour]-- - INVOKE_ASYNC(dispenser, TYPE_PROC_REF(/obj/machinery/icecream_vat, updateDialog)) - else - to_chat(user, span_warning("There is not enough ice cream left!")) - else - to_chat(user, span_warning("[source] can't hold anymore ice cream!")) + dispenser.add_flavor_to_cone(src, user, source) return COMPONENT_CANCEL_ATTACK_CHAIN /datum/component/ice_cream_holder/proc/check_food_order(obj/item/source, datum/custom_order/our_order) @@ -221,21 +214,21 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr var/reagent_amount = 3 /// Is this flavour shown in the ice cream vat menu or not? var/hidden = FALSE + ///Whether this type of ice cream will take custom ingredients from a beaker in the ice cream vat. + var/takes_custom_ingredients = FALSE /datum/ice_cream_flavour/New() if(ingredients) - ingredients_text = "(Ingredients: [reagent_paths_list_to_text(ingredients, ingredients_text)])" + ingredients_text = "Requires: [reagent_paths_list_to_text(ingredients, ingredients_text)]" /// Adds a new flavour to the ice cream cone. -/datum/ice_cream_flavour/proc/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/R, custom_name) +/datum/ice_cream_flavour/proc/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/custom_ingredients) var/atom/owner = target.parent - LAZYADD(target.scoops, custom_name || name) - if(color) + LAZYADD(target.scoops, name) + if(!takes_custom_ingredients && color) var/image/flavoring = image('icons/obj/service/kitchen.dmi', "icecream_custom") flavoring.color = color LAZYADD(target.scoop_overlays, flavoring) - if(custom_name) - LAZYSET(target.special_scoops, custom_name, name) owner.reagents.maximum_volume += EXTRA_MAX_VOLUME_PER_SCOOP if(reagent_type) @@ -336,10 +329,11 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr /datum/ice_cream_flavour/custom name = ICE_CREAM_CUSTOM - color = "" //has its own mutable appearance overlay + color = COLOR_STARLIGHT //has its own mutable appearance overlay it will be overwritten with anyways. desc = "filled with artisanal icecream. Made with real $CUSTOM_NAME. Ain't that something." ingredients = list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice) ingredients_text = "optional flavorings" + takes_custom_ingredients = TRUE /datum/ice_cream_flavour/custom/korta name = ICE_CREAM_KORTA_CUSTOM @@ -347,16 +341,15 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr ingredients = list(/datum/reagent/consumable/korta_milk, /datum/reagent/consumable/ice) ingredients_text = "optional flavorings" -/datum/ice_cream_flavour/custom/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/R, custom_name) - if(!R || R.total_volume < 4) //consumable reagents have stronger taste so higher volume are required to allow non-food flavourings to break through better. +/datum/ice_cream_flavour/custom/add_flavour(datum/component/ice_cream_holder/target, datum/reagents/custom_ingredients) + if(!custom_ingredients || custom_ingredients.total_volume < 4) //consumable reagents have stronger taste so higher volume are required to allow non-food flavourings to break through better. return GLOB.ice_cream_flavours[ICE_CREAM_BLAND].add_flavour(target) //Bland, sugary ice and milk. var/image/flavoring = image('icons/obj/service/kitchen.dmi', "icecream_custom") - var/datum/reagent/master = R.get_master_reagent() - custom_name = lowertext(master.name) // reagent names are capitalized, while items' aren't. + var/datum/reagent/master = custom_ingredients.get_master_reagent() flavoring.color = master.color LAZYADD(target.scoop_overlays, flavoring) . = ..() // Make some space for reagents before attempting to transfer some to the target. - R.trans_to(target.parent, 4) + custom_ingredients.trans_to(target.parent, 4) /datum/ice_cream_flavour/bland name = ICE_CREAM_BLAND diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index cb8dfb1ec8d..ed4142f41ce 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -45,7 +45,7 @@ COMSIG_LIVING_START_PULL), PROC_REF(trigger_reaction)) RegisterSignal(targ, COMSIG_ATOM_EXAMINE, PROC_REF(examine_target)) RegisterSignal(targ, COMSIG_LIVING_PRE_MOB_BUMP, PROC_REF(block_bumps_target)) - RegisterSignals(targ, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED), PROC_REF(cancel)) + RegisterSignals(targ, list(COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_GET_PULLED), PROC_REF(cancel)) RegisterSignals(weapon, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED), PROC_REF(cancel)) var/distance = min(get_dist(shooter, target), 1) // treat 0 distance as adjacent @@ -88,7 +88,7 @@ RegisterSignals(parent, list(COMSIG_LIVING_START_PULL, COMSIG_MOVABLE_BUMP), PROC_REF(check_bump)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_LIVING_PRE_MOB_BUMP, PROC_REF(block_bumps_parent)) - RegisterSignal(parent, COMSIG_HUMAN_DISARM_HIT, PROC_REF(cancel)) + RegisterSignal(parent, COMSIG_LIVING_DISARM_HIT, PROC_REF(cancel)) /datum/component/gunpoint/UnregisterFromParent() UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) @@ -98,7 +98,7 @@ UnregisterSignal(parent, list(COMSIG_LIVING_START_PULL, COMSIG_MOVABLE_BUMP)) UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) UnregisterSignal(parent, COMSIG_LIVING_PRE_MOB_BUMP) - UnregisterSignal(parent, COMSIG_HUMAN_DISARM_HIT) + UnregisterSignal(parent, COMSIG_LIVING_DISARM_HIT) ///If the shooter bumps the target, cancel the holdup to avoid cheesing and forcing the charged shot /datum/component/gunpoint/proc/check_bump(atom/B, atom/A) diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index 6d89f6e5cd9..97df6342aeb 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -161,3 +161,20 @@ /datum/component/infective/proc/try_infect(mob/living/L, target_zone) for(var/V in diseases) L.ContactContractDisease(V, target_zone) + +/datum/component/infective/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_FOOD_EATEN, + COMSIG_PILL_CONSUMED, + COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_MOVABLE_BUMP, + COMSIG_MOVABLE_IMPACT_ZONE, + COMSIG_ITEM_ATTACK_ZONE, + COMSIG_ITEM_ATTACK, + COMSIG_ITEM_EQUIPPED, + COMSIG_GLASS_DRANK, + COMSIG_ORGAN_IMPLANTED, + COMSIG_GIBS_STREAK, + )) + qdel(GetComponent(/datum/component/connect_loc_behalf)) diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index b5563433c72..db72072789c 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -29,11 +29,11 @@ var/obj/item/item_parent = parent if(ismob(item_parent.loc)) - UnregisterSignal(item_parent.loc, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) + UnregisterSignal(item_parent.loc, list(COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) -/// Signal proc for [COMSIG_HUMAN_DISARM_HIT] on the mob who's equipped our parent +/// Signal proc for [COMSIG_LIVING_DISARM_HIT] on the mob who's equipped our parent /// Rolls a chance for knockoff whenever we're disarmed -/datum/component/knockoff/proc/on_equipped_mob_disarm(mob/living/carbon/human/source, mob/living/attacker, zone) +/datum/component/knockoff/proc/on_equipped_mob_disarm(mob/living/source, mob/living/attacker, zone, obj/item/weapon) SIGNAL_HANDLER if(!istype(source)) @@ -85,10 +85,10 @@ return if(slots_knockoffable && !(slot & slots_knockoffable)) - UnregisterSignal(equipper, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) + UnregisterSignal(equipper, list(COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) return - RegisterSignal(equipper, COMSIG_HUMAN_DISARM_HIT, PROC_REF(on_equipped_mob_disarm), TRUE) + RegisterSignal(equipper, COMSIG_LIVING_DISARM_HIT, PROC_REF(on_equipped_mob_disarm), TRUE) RegisterSignal(equipper, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(on_equipped_mob_knockdown), TRUE) /// Signal proc for [COMSIG_ITEM_DROPPED] @@ -96,4 +96,4 @@ /datum/component/knockoff/proc/on_dropped(datum/source, mob/living/dropper) SIGNAL_HANDLER - UnregisterSignal(dropper, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) + UnregisterSignal(dropper, list(COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) diff --git a/code/datums/components/listen_and_repeat.dm b/code/datums/components/listen_and_repeat.dm index 9ffee682972..bd311118dc0 100644 --- a/code/datums/components/listen_and_repeat.dm +++ b/code/datums/components/listen_and_repeat.dm @@ -82,7 +82,7 @@ if(!LAZYLEN(speech_buffer)) // what? well whatever let's just move on return - controller.set_blackboard_key(BB_EXPORTABLE_STRING_BUFFER_LIST, speech_buffer.Copy()) + controller.override_blackboard_key(BB_EXPORTABLE_STRING_BUFFER_LIST, speech_buffer.Copy()) #undef MAX_SPEECH_BUFFER_SIZE #undef RADIO_IGNORE_CHANCE diff --git a/code/datums/components/lock_on_cursor.dm b/code/datums/components/lock_on_cursor.dm index 4b78f031aa0..84e315dc6ce 100644 --- a/code/datums/components/lock_on_cursor.dm +++ b/code/datums/components/lock_on_cursor.dm @@ -97,7 +97,6 @@ return for(var/image/overlay as anything in lock_images) owner.client.images -= overlay - qdel(overlay) lock_images.Cut() /// Reset the overlays on all targets diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index e84e3a46c82..fc7e42c6c43 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -459,15 +459,15 @@ if(MATERIAL_INSERT_ITEM_SUCCESS) //no problems full item was consumed if(chat_data["stack"]) var/sheets = min(count, amount) //minimum between sheets inserted vs sheets consumed(values differ for alloys) - to_chat(user, span_notice("[sheets > 1 ? sheets : ""] [item_name][sheets > 1 ? "'s" : ""] was consumed by [parent]")) + to_chat(user, span_notice("[sheets > 1 ? sheets : ""] [item_name][sheets > 1 ? "s were" : " was"] added to [parent].")) else - to_chat(user, span_notice("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] worth [amount] sheets of material was consumed by [parent]")) + to_chat(user, span_notice("[count > 1 ? count : ""] [item_name][count > 1 ? "s" : ""], worth [amount] sheets, [count > 1 ? "were" : "was"] added to [parent].")) if(MATERIAL_INSERT_ITEM_NO_SPACE) //no space - to_chat(user, span_warning("[parent] has no space to accept [item_name]")) + to_chat(user, span_warning("[parent] has no space to accept [item_name]!")) if(MATERIAL_INSERT_ITEM_NO_MATS) //no materials inside these items - to_chat(user, span_warning("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] has no materials to be accepted by [parent]")) + to_chat(user, span_warning("[item_name][count > 1 ? "s have" : " has"] no materials that can be accepted by [parent]!")) if(MATERIAL_INSERT_ITEM_FAILURE) //could be because the material type was not accepted or other stuff - to_chat(user, span_warning("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] was rejected by [parent]")) + to_chat(user, span_warning("[item_name][count > 1 ? "s were" : " was"] rejected by [parent]!")) /// Proc that allows players to fill the parent with mats /datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user) @@ -581,7 +581,9 @@ return FALSE for(var/x in mats) //Loop through all required materials - if(!has_enough_of_material(x, OPTIMAL_COST(mats[x] * coefficient) * multiplier))//Not a category, so just check the normal way + var/wanted = OPTIMAL_COST(mats[x] * coefficient) * multiplier + if(!has_enough_of_material(x, wanted))//Not a category, so just check the normal way + testing("didnt have: [x] wanted: [wanted]") return FALSE return TRUE diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 33d85a5376f..97c6b4e6282 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -74,8 +74,8 @@ handles linking back and forth. if (silo) silo.ore_connected_machines -= src silo.holds -= src - silo.updateUsrDialog() silo = null + UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) mat_container = null return ..() @@ -135,6 +135,7 @@ handles linking back and forth. silo.ore_connected_machines -= src silo = null mat_container = null + UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) if (allow_standalone) _MakeLocal() @@ -170,7 +171,6 @@ handles linking back and forth. if (silo) silo.ore_connected_machines -= src silo.holds -= src - silo.updateUsrDialog() else if (mat_container) //transfer all mats to silo. whatever cannot be transfered is dumped out as sheets if(mat_container.total_amount()) @@ -183,12 +183,11 @@ handles linking back and forth. qdel(mat_container) silo = new_silo silo.ore_connected_machines += src - silo.updateUsrDialog() mat_container = new_container if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) - return ITEM_INTERACT_BLOCKING + return ITEM_INTERACT_SUCCESS /** * Checks if the param silo is in the same level as this components parent i.e. connected machine, rcd, etc diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index c5a0da1f368..b413b6f8e51 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -1,17 +1,22 @@ +///A component that allows players to use the item to zoom out. Mainly intended for firearms, but now works with other items too. /datum/component/scope /// How far we can extend, with modifier of 1, up to our vision edge, higher numbers multiply. var/range_modifier = 1 - /// Fullscreen object we use for tracking the shots. + /// Fullscreen object we use for tracking. var/atom/movable/screen/fullscreen/cursor_catcher/scope/tracker /// The owner of the tracker's ckey. For comparing with the current owner mob, in case the client has left it (e.g. ghosted). var/tracker_owner_ckey - /// Are we zooming currently? - var/zooming + /// The method which we zoom in and out + var/zoom_method = ZOOM_METHOD_RIGHT_CLICK + /// if not null, an item action will be added. Redundant if the mode is ZOOM_METHOD_RIGHT_CLICK or ZOOM_METHOD_WIELD. + var/item_action_type -/datum/component/scope/Initialize(range_modifier) - if(!isgun(parent)) +/datum/component/scope/Initialize(range_modifier = 1, zoom_method = ZOOM_METHOD_RIGHT_CLICK, item_action_type) + if(!isitem(parent)) return COMPONENT_INCOMPATIBLE src.range_modifier = range_modifier + src.zoom_method = zoom_method + src.item_action_type = item_action_type /datum/component/scope/Destroy(force) if(tracker) @@ -20,14 +25,30 @@ /datum/component/scope/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK_SECONDARY, PROC_REF(on_secondary_afterattack)) - RegisterSignal(parent, COMSIG_GUN_TRY_FIRE, PROC_REF(on_gun_fire)) + switch(zoom_method) + if(ZOOM_METHOD_RIGHT_CLICK) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK_SECONDARY, PROC_REF(on_secondary_afterattack)) + if(ZOOM_METHOD_WIELD) + RegisterSignal(parent, SIGNAL_ADDTRAIT(TRAIT_WIELDED), PROC_REF(on_wielded)) + RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_WIELDED), PROC_REF(on_unwielded)) + if(item_action_type) + var/obj/item/parent_item = parent + var/datum/action/item_action/scope = parent_item.add_item_action(item_action_type) + RegisterSignal(scope, COMSIG_ACTION_TRIGGER, PROC_REF(on_action_trigger)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + if(isgun(parent)) + RegisterSignal(parent, COMSIG_GUN_TRY_FIRE, PROC_REF(on_gun_fire)) /datum/component/scope/UnregisterFromParent() + if(item_action_type) + var/obj/item/parent_item = parent + var/datum/action/item_action/scope = locate(item_action_type) in parent_item.actions + parent_item.remove_item_action(scope) UnregisterSignal(parent, list( COMSIG_MOVABLE_MOVED, COMSIG_ITEM_AFTERATTACK_SECONDARY, + SIGNAL_ADDTRAIT(TRAIT_WIELDED), + SIGNAL_REMOVETRAIT(TRAIT_WIELDED), COMSIG_GUN_TRY_FIRE, COMSIG_ATOM_EXAMINE, )) @@ -56,9 +77,28 @@ if(tracker) stop_zooming(user) else - start_zooming(user) + zoom(user) return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN +/datum/component/scope/proc/on_action_trigger(datum/action/source) + SIGNAL_HANDLER + var/obj/item/item = source.target + var/mob/living/user = item.loc + if(tracker) + stop_zooming(user) + else + zoom(user) + +/datum/component/scope/proc/on_wielded(obj/item/source, trait) + SIGNAL_HANDLER + var/mob/living/user = source.loc + zoom(user) + +/datum/component/scope/proc/on_unwielded(obj/item/source, trait) + SIGNAL_HANDLER + var/mob/living/user = source.loc + stop_zooming(user) + /datum/component/scope/proc/on_gun_fire(obj/item/gun/source, mob/living/user, atom/target, flag, params) SIGNAL_HANDLER @@ -70,7 +110,12 @@ /datum/component/scope/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_notice("You can scope in with right-click.") + var/scope = isgun(parent) ? "scope in" : "zoom out" + switch(zoom_method) + if(ZOOM_METHOD_RIGHT_CLICK) + examine_list += span_notice("You can [scope] with right-click.") + if(ZOOM_METHOD_WIELD) + examine_list += span_notice("You can [scope] by wielding it with both hands.") /** * We find and return the best target to hit on a given turf. @@ -105,17 +150,7 @@ return target_turf /** - * Wrapper for zoom(), so in case we runtime we do not get stuck in a bad state - * - * Arguments: - * * user: The mob we are starting zooming on. -*/ -/datum/component/scope/proc/start_zooming(mob/user) - if(zoom(user)) - zooming = TRUE - -/** - * We start zooming by hiding the mouse pointer, adding our tracker overlay and starting our processing. + * We start zooming by adding our tracker overlay and starting our processing. * * Arguments: * * user: The mob we are starting zooming on. @@ -123,18 +158,33 @@ /datum/component/scope/proc/zoom(mob/user) if(isnull(user.client)) return - if(zooming) + if(HAS_TRAIT(user, TRAIT_USER_SCOPED)) + user.balloon_alert(user, "already zoomed!") return - user.client.mouse_override_icon = 'icons/effects/mouse_pointers/scope_hide.dmi' - user.update_mouse_pointer() user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE) - tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/cursor_catcher/scope, 0) + tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/cursor_catcher/scope, isgun(parent)) tracker.assign_to_mob(user, range_modifier) tracker_owner_ckey = user.ckey - RegisterSignals(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING), PROC_REF(stop_zooming)) + if(user.is_holding(parent)) + RegisterSignals(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING), PROC_REF(stop_zooming)) + else // The item is likely worn (eg. mothic cap) + RegisterSignal(user, COMSIG_QDELETING, PROC_REF(stop_zooming)) + var/static/list/capacity_signals = list( + COMSIG_LIVING_STATUS_KNOCKDOWN, + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + ) + RegisterSignals(user, capacity_signals, PROC_REF(on_incapacitated)) START_PROCESSING(SSprojectiles, src) + ADD_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) return TRUE +/datum/component/scope/proc/on_incapacitated(mob/living/source, amount = 0, ignore_canstun = FALSE) + SIGNAL_HANDLER + + if(amount > 0) + stop_zooming(source) + /** * We stop zooming, canceling processing, resetting stuff back to normal and deleting our tracker. * @@ -144,13 +194,18 @@ /datum/component/scope/proc/stop_zooming(mob/user) SIGNAL_HANDLER - if(!zooming) + if(!HAS_TRAIT(user, TRAIT_USER_SCOPED)) return STOP_PROCESSING(SSprojectiles, src) - UnregisterSignal(user, list(COMSIG_MOB_SWAP_HANDS, COMSIG_QDELETING)) - - zooming = FALSE + UnregisterSignal(user, list( + COMSIG_LIVING_STATUS_KNOCKDOWN, + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + COMSIG_MOB_SWAP_HANDS, + COMSIG_QDELETING, + )) + REMOVE_TRAIT(user, TRAIT_USER_SCOPED, REF(src)) user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE, frequency = -1) user.clear_fullscreen("scope") @@ -165,8 +220,6 @@ if(user.client) animate(user.client, 0.2 SECONDS, pixel_x = 0, pixel_y = 0) - user.client.mouse_override_icon = null - user.update_mouse_pointer() tracker = null tracker_owner_ckey = null diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index a436a40d516..4646d30fc31 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -1,6 +1,6 @@ /// Makes an atom a shell that is able to take in an attached circuit. /datum/component/shell - dupe_mode = COMPONENT_DUPE_UNIQUE + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /// The circuitboard attached to this shell var/obj/item/integrated_circuit/attached_circuit @@ -60,12 +60,15 @@ unremovable_circuit_components = list() for(var/obj/item/circuit_component/circuit_component as anything in components) - if(ispath(circuit_component)) - circuit_component = new circuit_component() - circuit_component.removable = FALSE - circuit_component.set_circuit_size(0) - RegisterSignal(circuit_component, COMSIG_CIRCUIT_COMPONENT_SAVE, PROC_REF(save_component)) - unremovable_circuit_components += circuit_component + add_unremovable_circuit_component(circuit_component) + +/datum/component/shell/proc/add_unremovable_circuit_component(obj/item/circuit_component/component) + if(ispath(component)) + component = new component() + component.removable = FALSE + component.set_circuit_size(0) + RegisterSignal(component, COMSIG_CIRCUIT_COMPONENT_SAVE, PROC_REF(save_component)) + unremovable_circuit_components += component /datum/component/shell/proc/save_component(datum/source, list/objects) SIGNAL_HANDLER @@ -154,7 +157,7 @@ */ /datum/component/shell/proc/on_set_anchored(atom/movable/source, previous_value) SIGNAL_HANDLER - attached_circuit?.on = source.anchored + attached_circuit?.set_on(source.anchored) /** * Called when an item hits the parent. This is the method to add the circuitboard to the component. @@ -305,6 +308,7 @@ return locked = FALSE attached_circuit = circuitboard + SEND_SIGNAL(src, COMSIG_SHELL_CIRCUIT_ATTACHED) if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE) && !circuitboard.admin_only) RegisterSignal(circuitboard, COMSIG_MOVABLE_MOVED, PROC_REF(on_circuit_moved)) if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) @@ -318,20 +322,21 @@ parent_atom.name = "[initial(parent_atom.name)] ([attached_circuit.display_name])" attached_circuit.set_locked(FALSE) - if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) - attached_circuit.on = parent_atom.anchored - if((shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE) || circuitboard.admin_only) circuitboard.moveToNullspace() else if(circuitboard.loc != parent_atom) circuitboard.forceMove(parent_atom) attached_circuit.set_shell(parent_atom) + + // call after set_shell() sets on to true + if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) + attached_circuit.set_on(parent_atom.anchored) /** * Removes the circuit from the component. Doesn't do any checks to see for an existing circuit so that should be done beforehand. */ /datum/component/shell/proc/remove_circuit() - attached_circuit.on = TRUE + // remove_current_shell() also turns off the circuit attached_circuit.remove_current_shell() UnregisterSignal(attached_circuit, list( COMSIG_MOVABLE_MOVED, @@ -347,6 +352,7 @@ attached_circuit.remove_component(to_remove) to_remove.moveToNullspace() attached_circuit.set_locked(FALSE) + SEND_SIGNAL(src, COMSIG_SHELL_CIRCUIT_REMOVED) attached_circuit = null /datum/component/shell/proc/on_atom_usb_cable_try_attach(atom/source, obj/item/usb_cable/usb_cable, mob/user) diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 3f660d5fcbd..a9bb9b4432b 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -11,10 +11,15 @@ var/list/faction /// List of weak references to things we have already created var/list/spawned_things = list() - /// Time until we next spawn + /// How many mobs can we spawn maximum each time we try to spawn? (1 - max) + var/max_spawn_per_attempt + /// Distance from the spawner to spawn mobs + var/spawn_distance + /// Distance from the spawner to exclude mobs from spawning + var/spawn_distance_exclude COOLDOWN_DECLARE(spawn_delay) -/datum/component/spawner/Initialize(spawn_types = list(), spawn_time = 30 SECONDS, max_spawned = 5, faction = list(FACTION_MINING), spawn_text = null) +/datum/component/spawner/Initialize(spawn_types = list(), spawn_time = 30 SECONDS, max_spawned = 5, max_spawn_per_attempt = 2 , faction = list(FACTION_MINING), spawn_text = null, spawn_distance = 1, spawn_distance_exclude = 0) if (!islist(spawn_types)) CRASH("invalid spawn_types to spawn specified for spawner component!") src.spawn_time = spawn_time @@ -22,8 +27,12 @@ src.faction = faction src.spawn_text = spawn_text src.max_spawned = max_spawned + src.max_spawn_per_attempt = max_spawn_per_attempt + src.spawn_distance = spawn_distance + src.spawn_distance_exclude = spawn_distance_exclude RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(stop_spawning)) + RegisterSignal(parent, COMSIG_VENT_WAVE_CONCLUDED, PROC_REF(stop_spawning)) START_PROCESSING((spawn_time < 2 SECONDS ? SSfastprocess : SSprocessing), src) /datum/component/spawner/process() @@ -47,22 +56,41 @@ return var/atom/spawner = parent COOLDOWN_START(src, spawn_delay, spawn_time) - var/chosen_mob_type = pick(spawn_types) - var/atom/created = new chosen_mob_type(spawner.loc) - created.flags_1 |= (spawner.flags_1 & ADMIN_SPAWNED_1) - spawned_things += WEAKREF(created) - if (isliving(created)) - var/mob/living/created_mob = created - created_mob.faction = src.faction - RegisterSignal(created, COMSIG_MOB_STATCHANGE, PROC_REF(mob_stat_changed)) + var/adjusted_spawn_count = 1 + if (max_spawn_per_attempt > 1) + adjusted_spawn_count = rand(1, max_spawn_per_attempt) + for(var/i in 1 to adjusted_spawn_count) + var/atom/created + var/turf/picked_spot + + if(spawn_distance == 1) + created = new chosen_mob_type(spawner.loc) + else if(spawn_distance >= 1 && spawn_distance_exclude >= 1) + picked_spot = pick(turf_peel(spawn_distance, spawn_distance_exclude, spawner.loc, view_based = TRUE)) + if(!picked_spot) + picked_spot = pick(circle_range_turfs(spawner.loc, spawn_distance)) + created = new chosen_mob_type(picked_spot) + else if (spawn_distance >= 1) + picked_spot = pick(circle_range_turfs(spawner.loc, spawn_distance)) + created = new chosen_mob_type(picked_spot) + + created.flags_1 |= (spawner.flags_1 & ADMIN_SPAWNED_1) + spawned_things += WEAKREF(created) + + if (isliving(created)) + var/mob/living/created_mob = created + created_mob.faction = src.faction + RegisterSignal(created, COMSIG_MOB_STATCHANGE, PROC_REF(mob_stat_changed)) + + SEND_SIGNAL(src, COMSIG_SPAWNER_SPAWNED, created) + RegisterSignal(created, COMSIG_QDELETING, PROC_REF(on_deleted)) if (spawn_text) - spawner.visible_message(span_danger("[created] [spawn_text] [spawner].")) + spawner.visible_message(span_danger("A creature [spawn_text] [spawner].")) + - SEND_SIGNAL(src, COMSIG_SPAWNER_SPAWNED, created) - RegisterSignal(created, COMSIG_QDELETING, PROC_REF(on_deleted)) /// Remove weakrefs to atoms which have been killed or deleted without us picking it up somehow /datum/component/spawner/proc/validate_references() diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index cf9e9d36a82..122cc021fab 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -345,7 +345,7 @@ near_mob.show_message(span_hear("An unearthly ringing fills your ears, and you find your skin covered in new radiation burns."), MSG_AUDIBLE) consume_returns(matter_increase, damage_increase) var/obj/machinery/power/supermatter_crystal/our_crystal = parent - if(istype(parent)) + if(istype(our_crystal)) our_crystal.log_activation(who = consumed_object) /datum/component/supermatter_crystal/proc/consume_returns(matter_increase = 0, damage_increase = 0) diff --git a/code/datums/components/swabbing.dm b/code/datums/components/swabbing.dm index 12d851afe39..34a2283677c 100644 --- a/code/datums/components/swabbing.dm +++ b/code/datums/components/swabbing.dm @@ -106,7 +106,7 @@ This component is used in vat growing to swab for microbiological samples which LAZYINITLIST(swabbed_items) //If it isn't initialized, initialize it. As we need to pass it by reference if(SEND_SIGNAL(target, COMSIG_SWAB_FOR_SAMPLES, swabbed_items) == NONE) //If we found something to swab now we let the swabbed thing handle what it would do, we just sit back and relax now. - to_chat(user, span_warning("You do not manage to find a anything on [target]!")) + to_chat(user, span_warning("You do not manage to find anything on [target]!")) return to_chat(user, span_nicegreen("You manage to collect a microbiological sample from [target]!")) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index d89c028c584..acd25fb328b 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -234,7 +234,7 @@ target.Knockdown(3 SECONDS) target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(human_sacker.dna.species, TYPE_PROC_REF(/datum/species, grab), human_sacker, human_target) + INVOKE_ASYNC(human_sacker, TYPE_PROC_REF(/mob/living, grab), human_sacker, human_target) human_sacker.setGrabState(GRAB_PASSIVE) if(50 to INFINITY) // absolutely BODIED @@ -260,7 +260,7 @@ target.Knockdown(3 SECONDS) target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS) if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(human_sacker.dna.species, TYPE_PROC_REF(/datum/species, grab), human_sacker, human_target) + INVOKE_ASYNC(human_sacker, TYPE_PROC_REF(/mob/living, grab), human_sacker, human_target) human_sacker.setGrabState(GRAB_AGGRESSIVE) /** @@ -400,7 +400,7 @@ defense_mod += 2 if(tackle_target.mob_negates_gravity()) defense_mod += 1 - if(tackle_target.is_shove_knockdown_blocked()) // riot armor and such + if(HAS_TRAIT(tackle_target, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) // riot armor and such defense_mod += 5 var/obj/item/organ/external/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) @@ -451,7 +451,7 @@ attack_mod += 15 human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA - if(human_sacker.is_shove_knockdown_blocked()) // tackling with riot specialized armor, like riot armor, is effective but tiring + if(HAS_TRAIT(human_sacker, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) // tackling with riot specialized armor, like riot armor, is effective but tiring attack_mod += 2 human_sacker.adjustStaminaLoss(20) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index adb10f128ae..e418988c058 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -384,17 +384,18 @@ // PDA signal responses -/datum/component/uplink/proc/new_ringtone(datum/source, mob/living/user, new_ring_text) +/datum/component/uplink/proc/new_ringtone(datum/source, atom/source, new_ring_text) SIGNAL_HANDLER if(trim(lowertext(new_ring_text)) != trim(lowertext(unlock_code))) if(trim(lowertext(new_ring_text)) == trim(lowertext(failsafe_code))) - failsafe(user) + failsafe(source) return COMPONENT_STOP_RINGTONE_CHANGE return locked = FALSE - interact(null, user) - to_chat(user, span_hear("The computer softly beeps.")) + if(ismob(source)) + interact(null, source) + to_chat(source, span_hear("The computer softly beeps.")) return COMPONENT_STOP_RINGTONE_CHANGE /datum/component/uplink/proc/check_detonate() @@ -500,14 +501,22 @@ locked = FALSE replacement_uplink.balloon_alert_to_viewers("beep", vision_distance = COMBAT_MESSAGE_RANGE) -/datum/component/uplink/proc/failsafe(mob/living/carbon/user) +/datum/component/uplink/proc/failsafe(atom/source) if(!parent) return var/turf/T = get_turf(parent) if(!T) return - message_admins("[ADMIN_LOOKUPFLW(user)] has triggered an uplink failsafe explosion at [AREACOORD(T)] The owner of the uplink was [ADMIN_LOOKUPFLW(owner)].") - user.log_message("triggered an uplink failsafe explosion. Uplink owner: [key_name(owner)].", LOG_ATTACK) + var/user_deets = "an uplink failsafe explosion has been triggered" + if(ismob(source)) + user_deets = "[ADMIN_LOOKUPFLW(source)] has triggered an uplink failsafe explosion" + source.log_message("triggered an uplink failsafe explosion. Uplink owner: [key_name(owner)].", LOG_ATTACK) + else if(istype(source, /obj/item/circuit_component)) + var/obj/item/circuit_component/circuit = source + user_deets = "[circuit.parent.get_creator_admin()] has triggered an uplink failsafe explosion" + else + source?.log_message("somehow triggered an uplink failsafe explosion. Uplink owner: [key_name(owner)].", LOG_ATTACK) + message_admins("[user_deets] at [AREACOORD(T)] The owner of the uplink was [ADMIN_LOOKUPFLW(owner)].") explosion(parent, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 3) qdel(parent) //Alternatively could brick the uplink. diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 07fad7092a3..e98f0941d64 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -60,8 +60,12 @@ var/list/filter_data #ifdef REFERENCE_TRACKING - var/running_find_references + /// When was this datum last touched by a reftracker? + /// If this value doesn't match with the start of the search + /// We know this datum has never been seen before, and we should check it var/last_find_references = 0 + /// How many references we're trying to find when searching + var/references_to_clear = 0 #ifdef REFERENCE_TRACKING_DEBUG ///Stores info about where refs are found, used for sanity checks and testing var/list/found_refs diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index bcf60670104..f428abdb016 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -69,7 +69,7 @@ /datum/symptom/fire/proc/warn_mob(mob/living/living_mob) if(prob(33.33)) - living_mob.audible_message(self_message = "You hear a crackling noise.") + living_mob.show_message(span_hear("You hear a crackling noise."), type = MSG_AUDIBLE) else to_chat(living_mob, span_warning("[pick("You feel hot.", "You smell smoke.")]")) diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index c497c0be039..fe0502387f9 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -161,8 +161,10 @@ random_spells += sneeze_spacetime var/datum/action/cooldown/spell/timestop/sneeze_timestop = new(src) - sneeze_timestop.timestop_range = 1 // heh + sneeze_timestop.timestop_range = 0 // heh sneeze_timestop.timestop_duration = 5 SECONDS + sneeze_timestop.owner_is_immune_to_all_timestop = FALSE + sneeze_timestop.owner_is_immune_to_self_timestop = FALSE random_spells += sneeze_timestop var/datum/action/cooldown/spell/aoe/repulse/sneeze_repulse = new(src) diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index ae4cb55330d..bcafc83497c 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -51,7 +51,10 @@ /// Finds the singleton for the element type given and attaches it to src /datum/proc/_AddElement(list/arguments) if(QDELING(src)) - CRASH("We just tried to add an element to a qdeleted datum, something is fucked") + var/datum/element/element_type = arguments[1] + stack_trace("We just tried to add the element [element_type] to a qdeleted datum, something is fucked") + return + var/datum/element/ele = SSdcs.GetElement(arguments) if(!ele) // We couldn't fetch the element, likely because it was not an element. return // the crash message has already been sent diff --git a/code/datums/elements/connect_loc.dm b/code/datums/elements/connect_loc.dm index 32b3b50b783..2e34d1d37b9 100644 --- a/code/datums/elements/connect_loc.dm +++ b/code/datums/elements/connect_loc.dm @@ -24,7 +24,7 @@ /datum/element/connect_loc/proc/update_signals(atom/movable/listener) var/atom/listener_loc = listener.loc - if(isnull(listener_loc)) + if(QDELETED(listener) || QDELETED(listener_loc)) return for (var/signal in connections) diff --git a/code/datums/elements/disarm_attack.dm b/code/datums/elements/disarm_attack.dm new file mode 100644 index 00000000000..a788cd9f35e --- /dev/null +++ b/code/datums/elements/disarm_attack.dm @@ -0,0 +1,35 @@ +///An element that allows items to be used to shove people around just like right-clicking would. +/datum/element/disarm_attack + +/datum/element/disarm_attack/Attach(datum/target) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ITEM_ATTACK_SECONDARY, PROC_REF(secondary_attack)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + +/datum/element/disarm_attack/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_ATTACK_SECONDARY)) + return ..() + +/datum/element/disarm_attack/proc/secondary_attack(obj/item/source, mob/living/victim, mob/living/user, params) + SIGNAL_HANDLER + if(!user.can_disarm(victim) || !can_disarm_attack(source, victim, user)) + return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + if(victim.check_block(source, 0, "the [source.name]", MELEE_ATTACK, 0)) + return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + user.disarm(victim, source) + user.changeNext_move(source.secondary_attack_speed || source.attack_speed) + return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + +///check if the item conditions for the disarm action are met. +/datum/element/disarm_attack/proc/can_disarm_attack(obj/item/source, mob/living/victim, mob/living/user, message = TRUE) + if(SEND_SIGNAL(source, COMSIG_ITEM_CAN_DISARM_ATTACK, victim, user, message) & COMPONENT_BLOCK_ITEM_DISARM_ATTACK) + return FALSE + return TRUE + +/datum/element/disarm_attack/proc/examine(obj/item/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(can_disarm_attack(source, user, user, FALSE)) + examine_list += span_notice("You can use it to shove people with right-click.") diff --git a/code/datums/elements/dryable.dm b/code/datums/elements/dryable.dm index c17547971b5..d0cdf235523 100644 --- a/code/datums/elements/dryable.dm +++ b/code/datums/elements/dryable.dm @@ -20,20 +20,20 @@ UnregisterSignal(target, COMSIG_FOOD_CONSUMED) REMOVE_TRAIT(target, TRAIT_DRYABLE, ELEMENT_TRAIT(type)) -/datum/element/dryable/proc/finish_drying(atom/source) +/datum/element/dryable/proc/finish_drying(atom/source, datum/weakref/drying_user) SIGNAL_HANDLER var/atom/dried_atom = source if(dry_result == dried_atom.type)//if the dried type is the same as our currrent state, don't bother creating a whole new item, just re-color it. var/atom/movable/resulting_atom = dried_atom resulting_atom.add_atom_colour(COLOR_DRIED_TAN, FIXED_COLOUR_PRIORITY) - ADD_TRAIT(resulting_atom, TRAIT_DRIED, ELEMENT_TRAIT(type)) + apply_dried_status(resulting_atom, drying_user) resulting_atom.forceMove(source.drop_location()) return else if(isstack(source)) //Check if its a sheet var/obj/item/stack/itemstack = dried_atom for(var/i in 1 to itemstack.amount) var/atom/movable/resulting_atom = new dry_result(source.drop_location()) - ADD_TRAIT(resulting_atom, TRAIT_DRIED, ELEMENT_TRAIT(type)) + apply_dried_status(resulting_atom, drying_user) qdel(source) return else if(istype(source, /obj/item/food) && ispath(dry_result, /obj/item/food)) @@ -41,11 +41,16 @@ var/obj/item/food/resulting_food = new dry_result(source.drop_location()) resulting_food.reagents.clear_reagents() source_food.reagents.trans_to(resulting_food, source_food.reagents.total_volume) - ADD_TRAIT(resulting_food, TRAIT_DRIED, ELEMENT_TRAIT(type)) + apply_dried_status(resulting_food, drying_user) qdel(source) return else var/atom/movable/resulting_atom = new dry_result(source.drop_location()) - ADD_TRAIT(resulting_atom, TRAIT_DRIED, ELEMENT_TRAIT(type)) + apply_dried_status(resulting_atom, drying_user) qdel(source) +/datum/element/dryable/proc/apply_dried_status(atom/target, datum/weakref/drying_user) + ADD_TRAIT(target, TRAIT_DRIED, ELEMENT_TRAIT(type)) + var/datum/mind/user_mind = drying_user?.resolve() + if(drying_user && istype(target, /obj/item/food)) + ADD_TRAIT(target, TRAIT_FOOD_CHEF_MADE, REF(user_mind)) diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index 645ee2a6081..ffa6de398b6 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -152,10 +152,13 @@ /datum/element/elevation_core/proc/on_exited(turf/source, atom/movable/gone) SIGNAL_HANDLER if((isnull(gone.loc) || !HAS_TRAIT_FROM(gone.loc, TRAIT_ELEVATED_TURF, REF(src))) && isliving(gone)) + // Always unregister the signal, we're still leaving even if already shifted down. + UnregisterSignal(gone, COMSIG_LIVING_SET_BUCKLED) + if(!HAS_TRAIT_FROM(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src))) + return REMOVE_TRAIT(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src)) var/elevate_time = isturf(gone.loc) && source.Adjacent(gone.loc) ? ELEVATE_TIME : 0 elevate_mob(gone, -pixel_shift, elevate_time) - UnregisterSignal(gone, COMSIG_LIVING_SET_BUCKLED) /datum/element/elevation_core/proc/elevate_mob(mob/living/target, z_shift = pixel_shift, elevate_time = ELEVATE_TIME) var/buckled_to_vehicle = FALSE diff --git a/code/datums/elements/food/processable.dm b/code/datums/elements/food/processable.dm index b45fc33f8b1..625dba61494 100644 --- a/code/datums/elements/food/processable.dm +++ b/code/datums/elements/food/processable.dm @@ -71,9 +71,9 @@ else if(result_gender == PLURAL) - examine_list += span_notice("It can be turned into some [result_name] with [span_bold(tool_desc)]!") + examine_list += span_notice("It can be turned into some [result_name] with [span_bold(tool_desc)]!") else - examine_list += span_notice("It can be turned into \a [result_name] with [span_bold(tool_desc)]!") + examine_list += span_notice("It can be turned into \a [result_name] with [span_bold(tool_desc)]!") /** * Adds context sensitivy directly to the processable file for screentips diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index 3900c9a65c5..5a2e4d032fc 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -141,7 +141,7 @@ return //cache for sanic speed (lists are references anyways) - var/static/list/footstep_sounds = GLOB.footstep + var/footstep_sounds = GLOB.footstep ///list returned by playsound() filled by client mobs who heard the footstep. given to play_fov_effect() var/list/heard_clients @@ -161,7 +161,7 @@ heard_clients = playsound(source.loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) else var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT] - var/static/list/bare_footstep_sounds = GLOB.barefootstep + var/bare_footstep_sounds = GLOB.barefootstep if(!isnull(barefoot_type) && bare_footstep_sounds[barefoot_type]) // barefoot_type can be null heard_clients = playsound(source.loc, pick(bare_footstep_sounds[barefoot_type][1]), bare_footstep_sounds[barefoot_type][2] * volume * volume_multiplier, diff --git a/code/datums/elements/haunted.dm b/code/datums/elements/haunted.dm index d678083dd19..04f985c0d89 100644 --- a/code/datums/elements/haunted.dm +++ b/code/datums/elements/haunted.dm @@ -23,7 +23,6 @@ QDEL_NULL(master.ai_controller) REMOVE_TRAIT(master, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type)) master.RemoveElement(/datum/element/movetype_handler) - return ..() /atom/movable/proc/make_haunted(source, color) //if not haunted, make haunted if(!HAS_TRAIT(src, TRAIT_HAUNTED)) diff --git a/code/datums/elements/immerse.dm b/code/datums/elements/immerse.dm index d4171588c31..89148fad7e2 100644 --- a/code/datums/elements/immerse.dm +++ b/code/datums/elements/immerse.dm @@ -32,7 +32,7 @@ if(!isturf(target) || !icon || !icon_state || !mask_icon) return ELEMENT_INCOMPATIBLE - if(!movables_to_ignore) + if(isnull(movables_to_ignore)) movables_to_ignore = typecacheof(list( /obj/effect, /mob/dead, @@ -96,8 +96,8 @@ /datum/element/immerse/proc/stop_immersion(turf/source) SIGNAL_HANDLER UnregisterSignal(source, list(COMSIG_ATOM_ABSTRACT_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, COMSIG_ATOM_ABSTRACT_EXITED)) - for(var/datum/weakref/movable as anything in attached_turfs_and_movables[source]) - remove_from_element(source, movable.resolve()) + for(var/atom/movable/movable as anything in attached_turfs_and_movables[source]) + remove_from_element(source, movable) attached_turfs_and_movables -= source /** @@ -122,7 +122,7 @@ try_immerse(movable, buckled) RegisterSignal(movable, COMSIG_QDELETING, PROC_REF(on_movable_qdel)) - LAZYADD(attached_turfs_and_movables[source], WEAKREF(movable)) + LAZYADD(attached_turfs_and_movables[source], movable) ADD_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) /datum/element/immerse/proc/on_movable_qdel(atom/movable/source) @@ -170,7 +170,7 @@ movable.vis_contents |= vis_overlay - LAZYSET(immersed_movables, WEAKREF(movable), vis_overlay) + LAZYSET(immersed_movables, movable, vis_overlay) ///Initializes and caches a new visual overlay given parameters such as width, height and whether it should appear fully underwater. /datum/element/immerse/proc/generate_vis_overlay(width, height, is_below_water) @@ -212,16 +212,14 @@ ///This proc removes the vis_overlay, the keep together trait and some signals from the movable. /datum/element/immerse/proc/remove_immerse_overlay(atom/movable/movable) - var/atom/movable/immerse_overlay/vis_overlay = LAZYACCESS(immersed_movables, WEAKREF(movable)) - if(!vis_overlay) - return - movable.vis_contents -= vis_overlay - LAZYREMOVE(immersed_movables, WEAKREF(movable)) - if(HAS_TRAIT(movable, TRAIT_UNIQUE_IMMERSE)) - UnregisterSignal(movable, list(COMSIG_ATOM_SPIN_ANIMATION, COMSIG_LIVING_POST_UPDATE_TRANSFORM)) - qdel(vis_overlay) + var/atom/movable/immerse_overlay/vis_overlay = LAZYACCESS(immersed_movables, movable) + LAZYREMOVE(immersed_movables, movable) REMOVE_KEEP_TOGETHER(movable, ELEMENT_TRAIT(src)) - + movable.vis_contents -= vis_overlay + if(HAS_TRAIT(movable, TRAIT_UNIQUE_IMMERSE)) + UnregisterSignal(movable, list(COMSIG_ATOM_SPIN_ANIMATION, COMSIG_LIVING_POST_UPDATE_TRANSFORM, COMSIG_QDELETING)) + if(!QDELETED(vis_overlay)) + qdel(vis_overlay) /** * Called by init_or_entered() and on_set_buckled(). * This applies the overlay if neither the movable or whatever is buckled to (exclusive to living mobs) are flying @@ -298,8 +296,8 @@ if(!(exited.loc in attached_turfs_and_movables)) remove_from_element(source, exited) else - LAZYREMOVE(attached_turfs_and_movables[source], WEAKREF(exited)) - LAZYADD(attached_turfs_and_movables[exited.loc], WEAKREF(exited)) + LAZYREMOVE(attached_turfs_and_movables[source], exited) + LAZYADD(attached_turfs_and_movables[exited.loc], exited) ///Remove any signal, overlay, trait given to the movable and reference to it within the element. /datum/element/immerse/proc/remove_from_element(turf/source, atom/movable/movable) @@ -309,9 +307,9 @@ buckled = living_mob.buckled try_unimmerse(movable, buckled) + LAZYREMOVE(attached_turfs_and_movables[source], movable) UnregisterSignal(movable, list(COMSIG_LIVING_SET_BUCKLED, COMSIG_QDELETING)) REMOVE_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) - LAZYREMOVE(attached_turfs_and_movables[source], WEAKREF(movable)) /// A band-aid to keep the (unique) visual overlay from scaling and rotating along with its owner. I'm sorry. /datum/element/immerse/proc/on_update_transform(mob/living/source, resize, new_lying_angle, is_opposite_angle) @@ -320,7 +318,7 @@ new_transform.Scale(1/source.current_size) new_transform.Turn(-new_lying_angle) - var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[WEAKREF(source)] + var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[source] if(is_opposite_angle) vis_overlay.transform = new_transform vis_overlay.adjust_living_overlay_offset(source) @@ -361,7 +359,7 @@ ///Spin the overlay in the opposite direction so it doesn't look like it's spinning at all. /datum/element/immerse/proc/on_spin_animation(atom/source, speed, loops, segments, segment) SIGNAL_HANDLER - var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[WEAKREF(source)] + var/atom/movable/immerse_overlay/vis_overlay = immersed_movables[source] vis_overlay.do_spin_animation(speed, loops, segments, -segment) ///We need to make sure to remove hard refs from the element when deleted. diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 6ea1a8121f0..bee48a2bb49 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -65,8 +65,9 @@ return FALSE if(!forced) - if(!check_teleport_valid(teleatom, destination, channel)) - teleatom.balloon_alert(teleatom, "something holds you back!") + if(!check_teleport_valid(teleatom, destturf, channel, original_destination = destination)) + if(ismob(teleatom)) + teleatom.balloon_alert(teleatom, "something holds you back!") return FALSE if(isobserver(teleatom)) @@ -184,7 +185,7 @@ return pick(turfs) /// Validates that the teleport being attempted is valid or not -/proc/check_teleport_valid(atom/teleported_atom, atom/destination, channel) +/proc/check_teleport_valid(atom/teleported_atom, atom/destination, channel, atom/original_destination = null) var/area/origin_area = get_area(teleported_atom) var/turf/origin_turf = get_turf(teleported_atom) @@ -194,6 +195,11 @@ if(HAS_TRAIT(teleported_atom, TRAIT_NO_TELEPORT)) return FALSE + // prevent unprecise teleports from landing you outside of the destination's reserved area + if(is_reserved_level(destination_turf.z) && istype(original_destination) \ + && SSmapping.get_reservation_from_turf(destination_turf) != SSmapping.get_reservation_from_turf(get_turf(original_destination))) + return FALSE + if((origin_area.area_flags & NOTELEPORT) || (destination_area.area_flags & NOTELEPORT)) return FALSE diff --git a/code/datums/looping_sounds/music.dm b/code/datums/looping_sounds/music.dm index 56723f5db49..ac76e236bc7 100644 --- a/code/datums/looping_sounds/music.dm +++ b/code/datums/looping_sounds/music.dm @@ -8,3 +8,4 @@ use_reverb = FALSE direct = TRUE sound_channel = CHANNEL_ELEVATOR + diff --git a/code/datums/looping_sounds/projectiles.dm b/code/datums/looping_sounds/projectiles.dm new file mode 100644 index 00000000000..6bc9a466ea1 --- /dev/null +++ b/code/datums/looping_sounds/projectiles.dm @@ -0,0 +1,4 @@ +/datum/looping_sound/moon_parade + mid_sounds = list('sound/effects/moon_parade_soundloop.ogg' = 1) + mid_length = 0 + volume = 20 diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 754b8755545..5211c413531 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -35,7 +35,7 @@ ///Base chance of spawning flora var/flora_spawn_chance = 2 ///Base chance of spawning features - var/feature_spawn_chance = 0.15 + var/feature_spawn_chance = 0.25 ///Unique ID for this spawner var/string_gen @@ -73,7 +73,10 @@ ) flora_spawn_list = expand_weights(weighted_flora_spawn_list) if(!weighted_feature_spawn_list) - weighted_feature_spawn_list = list(/obj/structure/geyser/random = 1) + weighted_feature_spawn_list = list( + /obj/structure/geyser/random = 1, + /obj/structure/ore_vent/random = 1, + ) feature_spawn_list = expand_weights(weighted_feature_spawn_list) open_turf_types = expand_weights(weighted_open_turf_types) closed_turf_types = expand_weights(weighted_closed_turf_types) @@ -115,6 +118,7 @@ var/megas_allowed = (generate_in.area_flags & MEGAFAUNA_SPAWN_ALLOWED) && length(megafauna_spawn_list) var/start_time = REALTIMEOFDAY + SSore_generation.ore_vent_minerals = (SSore_generation.ore_vent_minerals_default).Copy() //reset the ore vent minerals to the default for(var/turf/target_turf as anything in turfs) if(!(target_turf.type in open_turf_types)) //only put stuff on open turfs we generated, so closed walls and rivers and stuff are skipped diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 96d30fbd359..0e1425ead39 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -1,6 +1,10 @@ /datum/map_generator/cave_generator/icemoon weighted_open_turf_types = list(/turf/open/misc/asteroid/snow/icemoon = 19, /turf/open/misc/ice/icemoon = 1) - weighted_closed_turf_types = list(/turf/closed/mineral/random/snow = 1) + weighted_closed_turf_types = list( + //turf/closed/mineral/snowmountain/icemoon = 100, + //turf/closed/mineral/gibtonite/ice/icemoon = 4, + /turf/closed/mineral/random/snow = 1, //SKYRAT EDIT: Hybrid Mining + ) weighted_mob_spawn_list = list( @@ -26,6 +30,7 @@ /obj/structure/geyser/protozine = 10, /obj/structure/geyser/random = 2, /obj/structure/geyser/wittel = 10, + /obj/structure/ore_vent/boss/icebox = 1, ) /datum/map_generator/cave_generator/icemoon/surface @@ -59,7 +64,7 @@ /datum/map_generator/cave_generator/icemoon/surface/noruins //use this for when you don't want ruins to spawn in a certain area /datum/map_generator/cave_generator/icemoon/deep - weighted_closed_turf_types = list(/turf/closed/mineral/random/snow/underground = 1) + weighted_closed_turf_types = list(/turf/closed/mineral/random/snow/underground = 1) // SKYRAT EDIT: Original: /turf/closed/mineral/snowmountain/icemoon = 1 weighted_mob_spawn_list = list( SPAWN_MEGAFAUNA = 1, /mob/living/basic/mining/ice_demon = 100, diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index 6f8aa7ed1bb..846e23181e0 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -33,6 +33,7 @@ /obj/structure/geyser/protozine = 10, /obj/structure/geyser/random = 2, /obj/structure/geyser/wittel = 10, + /obj/structure/ore_vent/boss = 1, ) initial_closed_chance = 45 @@ -42,4 +43,4 @@ /datum/map_generator/cave_generator/lavaland/ruin_version weighted_open_turf_types = list(/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins = 1) - weighted_closed_turf_types = list(/turf/closed/mineral/random/volcanic/do_not_chasm = 1) + weighted_closed_turf_types = list(/turf/closed/mineral/volcanic/lava_land_surface/do_not_chasm = 1) diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index 2af604cd8fe..e5dc7860b0b 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -1,20 +1,41 @@ /datum/martial_art + /// Player readable name of the martial art var/name = "Martial Art" - var/id = "" //ID, used by mind/has_martialart + /// ID of the martial art + var/id = "" + /// The streak of attacks the user has performed var/streak = "" + /// The maximum length of streaks allowed var/max_streak_length = 6 - var/current_target - var/datum/martial_art/base // The permanent style. This will be null unless the martial art is temporary + + /// The current mob associated with this martial art datum. Do not set directly. + VAR_PRIVATE/mob/living/holder + /// Weakref to the last mob we attacked, for determining when to reset streaks + VAR_PRIVATE/datum/weakref/current_target + /// Used for temporary martial arts. + /// This is a reference to the last martial art that was replaced by this one. + VAR_PRIVATE/datum/martial_art/base + + /// Path to verb to display help text for this martial art. var/help_verb - var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts - var/smashes_tables = FALSE //If the martial art smashes tables when performing table slams and head smashes - var/datum/weakref/holder //owner of the martial art - var/display_combos = FALSE //shows combo meter if true - var/combo_timer = 6 SECONDS // period of time after which the combo streak is reset. + /// If TRUE, this martial art can be overridden and stored (via base) by other martial arts if deemed "temporary" via teach(). + var/allow_temp_override = TRUE + /// If TRUE, this martial art smashes tables when performing table slams and head smashes + var/smashes_tables = FALSE + /// If TRUE, a combo meter will be displayed on the HUD for the current streak + var/display_combos = FALSE + /// The length of time until streaks are auto-reset. + var/combo_timer = 6 SECONDS + /// Timer ID for the combo reset timer. var/timerid - /// If set to true this style allows you to punch people despite being a pacifist (for instance Boxing, which does no damage) + /// If TRUE, this style allows you to punch people despite being a pacifist (IE: Boxing, which does no damage) var/pacifist_style = FALSE +/datum/martial_art/Destroy() + if(!isnull(holder)) + remove(holder) + return ..() + /datum/martial_art/serialize_list(list/options, list/semvers) . = ..() @@ -25,78 +46,317 @@ SET_SERIALIZATION_SEMVER(semvers, "1.0.0") return . +/// Signal proc for [COMSIG_LIVING_UNARMED_ATTACK] to hook into the appropriate proc +/datum/martial_art/proc/unarmed_strike(mob/living/source, atom/attack_target, proximity, modifiers) + SIGNAL_HANDLER + + if(!proximity || !isliving(attack_target)) + return NONE + + if(HAS_TRAIT(attack_target, TRAIT_MARTIAL_ARTS_IMMUNE)) + return NONE + + if(!can_use(source)) + return NONE + + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + return disarm_act(source, attack_target) + + if(source.combat_mode) + if(HAS_TRAIT(source, TRAIT_PACIFISM) && !pacifist_style) + return NONE + + return harm_act(source, attack_target) + + return help_act(source, attack_target) + +/// Signal proc for [COMSIG_LIVING_GRAB] to hook into the grab +/datum/martial_art/proc/attempt_grab(mob/living/source, mob/living/grabbing) + SIGNAL_HANDLER + + if(HAS_TRAIT(grabbing, TRAIT_MARTIAL_ARTS_IMMUNE)) + return NONE + + if(!source.can_unarmed_attack()) // For parity with unarmed attacks + return NONE + + if(!can_use(source)) + return NONE + + return grab_act(source, grabbing) + +/** + * Called when help-intenting on someone + * + * What is checked going into this: + * Adjacency, [TRAIT_MARTIAL_ARTS_IMMUNE], attacker incapacitated, can_unarmed_attack, can_use + * + * What is NOT: + * check_block + * + * Arguments + * * mob/living/attacker - The mob attacking + * * mob/living/defender - The mob being attacked + * + * Returns + * * MARTIAL_ATTACK_INVALID - The attack is not valid, do normal unarmed attack + * * MARTIAL_ATTACK_FAIL - The attack is valid, but failed. No followup attack is made. + * * MARTIAL_ATTACK_SUCCESS - The attack is valid, and succeeded. No followup attack is made. + */ /datum/martial_art/proc/help_act(mob/living/attacker, mob/living/defender) + SHOULD_CALL_PARENT(FALSE) + PROTECTED_PROC(TRUE) return MARTIAL_ATTACK_INVALID +/** + * Called when disarm-intenting on someone + * + * What is checked going into this: + * Adjacency, [TRAIT_MARTIAL_ARTS_IMMUNE], attacker incapacitated, can_unarmed_attack, can_use + * + * What is NOT: + * check_block + * + * Arguments + * * mob/living/attacker - The mob attacking + * * mob/living/defender - The mob being attacked + * + * Returns + * * MARTIAL_ATTACK_INVALID - The attack is not valid, do normal unarmed attack + * * MARTIAL_ATTACK_FAIL - The attack is valid, but failed. No followup attack is made. + * * MARTIAL_ATTACK_SUCCESS - The attack is valid, and succeeded. No followup attack is made. + */ /datum/martial_art/proc/disarm_act(mob/living/attacker, mob/living/defender) + SHOULD_CALL_PARENT(FALSE) + PROTECTED_PROC(TRUE) return MARTIAL_ATTACK_INVALID +/** + * Called when harm-intenting on someone + * + * What is checked going into this: + * Adjacency, [TRAIT_MARTIAL_ARTS_IMMUNE], attacker incapacitated, can_unarmed_attack, can_use + * + * What is NOT: + * check_block + * + * Arguments + * * mob/living/attacker - The mob attacking + * * mob/living/defender - The mob being attacked + * + * Returns + * * MARTIAL_ATTACK_INVALID - The attack is not valid, do normal unarmed attack + * * MARTIAL_ATTACK_FAIL - The attack is valid, but failed. No followup attack is made. + * * MARTIAL_ATTACK_SUCCESS - The attack is valid, and succeeded. No followup attack is made. + */ /datum/martial_art/proc/harm_act(mob/living/attacker, mob/living/defender) + SHOULD_CALL_PARENT(FALSE) + PROTECTED_PROC(TRUE) return MARTIAL_ATTACK_INVALID +/** + * Called when grabbing someone + * + * What is checked going into this: + * Adjacency, [TRAIT_MARTIAL_ARTS_IMMUNE], attacker incapacitated, can_unarmed_attack, can_use + * + * What is NOT: + * check_block + * + * Arguments + * * mob/living/attacker - The mob attacking + * * mob/living/defender - The mob being attacked + * + * Returns + * * MARTIAL_ATTACK_INVALID - The attack is not valid, do normal unarmed attack + * * MARTIAL_ATTACK_FAIL - The attack is valid, but failed. No followup attack is made. + * * MARTIAL_ATTACK_SUCCESS - The attack is valid, and succeeded. No followup attack is made. + */ /datum/martial_art/proc/grab_act(mob/living/attacker, mob/living/defender) + SHOULD_CALL_PARENT(FALSE) + PROTECTED_PROC(TRUE) return MARTIAL_ATTACK_INVALID -/datum/martial_art/proc/can_use(mob/living/L) +/** + * Checks if the passed mob can use this martial art. + * + * Arguments + * * mob/living/martial_artist - The mob to check + * + * Returns + * * TRUE - The mob can use this martial art + * * FALSE - The mob cannot use this martial art + */ +/datum/martial_art/proc/can_use(mob/living/martial_artist) return TRUE +/** + * Adds the passed element to the current streak, resetting it if the target is not the same as the last target. + * + * Arguments + * * element - The element to add to the streak. This is some one letter string. + * * mob/living/defender - The mob being attacked + */ /datum/martial_art/proc/add_to_streak(element, mob/living/defender) - if(defender != current_target) + if(!IS_WEAKREF_OF(defender, current_target)) reset_streak(defender) - streak = streak+element + streak += element if(length(streak) > max_streak_length) streak = copytext(streak, 1 + length(streak[1])) - if (display_combos) - var/mob/living/holder_living = holder.resolve() + if(display_combos) timerid = addtimer(CALLBACK(src, PROC_REF(reset_streak), null, FALSE), combo_timer, TIMER_UNIQUE | TIMER_STOPPABLE) - holder_living?.hud_used?.combo_display.update_icon_state(streak, combo_timer - 2 SECONDS) + holder.hud_used?.combo_display.update_icon_state(streak, combo_timer - 2 SECONDS) +/** + * Resets the current streak. + * + * Arguments + * * mob/living/new_target - (Optional) The mob being attacked while the reset is occuring. + * * update_icon - If TRUE, the combo display will be updated. + */ /datum/martial_art/proc/reset_streak(mob/living/new_target, update_icon = TRUE) if(timerid) deltimer(timerid) - current_target = new_target + current_target = WEAKREF(new_target) streak = "" - if(update_icon) - var/mob/living/holder_living = holder?.resolve() - holder_living?.hud_used?.combo_display.update_icon_state(streak) + if(display_combos && update_icon) + holder.hud_used?.combo_display.update_icon_state(streak) -/datum/martial_art/proc/teach(mob/living/holder_living, make_temporary=FALSE) - if(!istype(holder_living) || !holder_living.mind) +/** + * Teaches the passed mob this martial art. + * + * Arguments + * * mob/living/new_holder - The mob to teach this martial art to. + * * make_temporary - If FALSE, this martial art will completely replace any existing martial arts. + * If TRUE, any existing martial art will be stored in the base variable, and will be restored when this martial art is removed. + * This can only occur if allow_temp_override is TRUE. + * + * Returns + * * TRUE - The martial art was successfully taught. + * * FALSE - The mob failed to learn the martial art, for whatever reason. + */ +/datum/martial_art/proc/teach(mob/living/new_holder, make_temporary = FALSE) + SHOULD_CALL_PARENT(TRUE) + + if(!istype(new_holder) || isnull(new_holder.mind)) return FALSE - if(holder_living.mind.martial_art) - if(make_temporary) - if(!holder_living.mind.martial_art.allow_temp_override) - return FALSE - store(holder_living.mind.martial_art, holder_living) - else - holder_living.mind.martial_art.on_remove(holder_living) - else if(make_temporary) - base = holder_living.mind.default_martial_art - if(help_verb) - add_verb(holder_living, help_verb) - holder_living.mind.martial_art = src - holder = WEAKREF(holder_living) + + var/datum/martial_art/existing_martial = new_holder.mind.martial_art + if(!isnull(existing_martial)) + if(make_temporary && !existing_martial.allow_temp_override) + return FALSE + + if(!isnull(existing_martial.base)) + store_martial_art(existing_martial.base) + existing_martial.unstore_martial_art() + else if(make_temporary) + store_martial_art(existing_martial) + + // Nulls out any existing martial art, it'll get GC'd if nothing owns it + existing_martial.remove(new_holder) + + new_holder.mind.martial_art = src + holder = new_holder + on_teach(new_holder) return TRUE -/datum/martial_art/proc/store(datum/martial_art/old, mob/living/holder_living) - old.on_remove(holder_living) - if (old.base) //Checks if old is temporary, if so it will not be stored. - base = old.base - else //Otherwise, old is stored. - base = old +/// Stores the passed martial art in the base var. +/datum/martial_art/proc/store_martial_art(datum/martial_art/martial) + if(!isnull(base)) + UnregisterSignal(base, COMSIG_QDELETING) -/datum/martial_art/proc/remove(mob/living/holder_living) - if(!istype(holder_living) || !holder_living.mind || holder_living.mind.martial_art != src) - return - on_remove(holder_living) - if(base) - base.teach(holder_living) - else - var/datum/martial_art/default = holder_living.mind.default_martial_art - default.teach(holder_living) + base = martial + RegisterSignal(base, COMSIG_QDELETING, PROC_REF(base_deleted)) + +/// Unstores the base var. +/datum/martial_art/proc/unstore_martial_art() + UnregisterSignal(base, COMSIG_QDELETING) + base = null + +/datum/martial_art/proc/base_deleted(datum/source) + SIGNAL_HANDLER + base = null + +/** + * Removes this martial art from the passed mob AND their mind. + * + * Arguments + * * mob/living/old_holder - The mob to remove this martial art from. + */ +/datum/martial_art/proc/remove(mob/living/old_holder) + SHOULD_CALL_PARENT(TRUE) + + ASSERT(old_holder == holder) + ASSERT(old_holder.mind.martial_art == src) + + on_remove(old_holder) + old_holder.mind.martial_art = null + if(!isnull(base)) + base.teach(old_holder) + unstore_martial_art() holder = null -/datum/martial_art/proc/on_remove(mob/living/holder_living) +/** + * A helper proc to remove the martial art from the passed mob fully, e + * ven if stored in another martial art's base. + * + * Arguments + * * mob/living/maybe_holder - The mob to check. + * + * Returns + * * TRUE - If the martial art was removed in some way + * * FALSE - If nothing happened + */ +/datum/martial_art/proc/fully_remove(mob/living/maybe_holder) + var/datum/martial_art/holder_art = maybe_holder.mind?.martial_art + if(isnull(holder_art)) + return FALSE + + if(holder_art == src) + remove(maybe_holder) + return TRUE + + if(holder_art.base == src) + holder_art.unstore_martial_art() + return TRUE + + return FALSE + +/** + * Called when this martial art is added to a mob. + */ +/datum/martial_art/proc/on_teach(mob/living/new_holder) if(help_verb) - remove_verb(holder_living, help_verb) - return + add_verb(new_holder, help_verb) + RegisterSignal(new_holder, COMSIG_QDELETING, PROC_REF(holder_deleted)) + RegisterSignal(new_holder, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(unarmed_strike)) + RegisterSignal(new_holder, COMSIG_LIVING_GRAB, PROC_REF(attempt_grab)) + RegisterSignal(new_holder, COMSIG_MOB_MIND_TRANSFERRED_OUT_OF, PROC_REF(transfer_martial_arts)) + +/** + * Called when this martial art is removed from a mob. + */ +/datum/martial_art/proc/on_remove(mob/living/remove_from) + if(help_verb) + remove_verb(remove_from, help_verb) + UnregisterSignal(remove_from, list(COMSIG_QDELETING, COMSIG_LIVING_UNARMED_ATTACK, COMSIG_LIVING_GRAB, COMSIG_MOB_MIND_TRANSFERRED_OUT_OF)) + +/datum/martial_art/proc/holder_deleted(datum/source) + SIGNAL_HANDLER + holder = null + +/// Signal proc for [COMSIG_MOB_MIND_TRANSFERRED_OUT_OF] to pass martial arts between bodies on mind transfer +/// By this point the martial art's holder is the old body, but the mind that owns it is in the new body +/datum/martial_art/proc/transfer_martial_arts(mob/living/old_body, mob/living/new_body) + SIGNAL_HANDLER + + // This has some notable issues in that martial arts granted by items like Krav Maga + // will follow the body swap, the easiest fix would be to move martial arts off of the mind + + if(!isnull(base)) // If we're home to a temporary one just don't touch it, give the base to the new body and leave it at that + base.teach(new_body) + unstore_martial_art() + return + + on_remove(old_body) // on_remove rather than remove, because by this point the mind is already in the new body, which remove handles. + teach(new_body) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 9ba1a53d40c..8ef30db63aa 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -3,69 +3,78 @@ id = MARTIALART_BOXING pacifist_style = TRUE -/datum/martial_art/boxing/disarm_act(mob/living/attacker, mob/living/defender) - to_chat(attacker, span_warning("Can't disarm while boxing!")) - return TRUE +/datum/martial_art/boxing/teach(mob/living/new_holder, make_temporary) + if(!ishuman(new_holder)) + return FALSE + return ..() -/datum/martial_art/boxing/grab_act(mob/living/attacker, mob/living/defender) - to_chat(attacker, span_warning("Can't grab while boxing!")) - return TRUE +/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/attacker, mob/living/defender) + attacker.balloon_alert(attacker, "can't disarm while boxing!") + return MARTIAL_ATTACK_FAIL -/datum/martial_art/boxing/harm_act(mob/living/attacker, mob/living/defender) - - var/mob/living/carbon/human/attacker_human = attacker - var/obj/item/bodypart/arm/active_arm = attacker_human.get_active_hand() +/datum/martial_art/boxing/grab_act(mob/living/carbon/human/attacker, mob/living/defender) + attacker.balloon_alert(attacker, "can't grab while boxing!") + return MARTIAL_ATTACK_FAIL +/datum/martial_art/boxing/harm_act(mob/living/carbon/human/attacker, mob/living/defender) + var/obj/item/bodypart/arm/active_arm = attacker.get_active_hand() attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - var/atk_verb = pick("left hook","right hook","straight punch") - var/damage = rand(5, 8) + active_arm.unarmed_damage_low - if(!damage) - playsound(defender.loc, active_arm.unarmed_miss_sound, 25, TRUE, -1) - defender.visible_message(span_warning("[attacker]'s [atk_verb] misses [defender]!"), \ - span_danger("You avoid [attacker]'s [atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, attacker) + var/atk_verb = pick("left hook", "right hook", "straight punch") + if(damage <= 0) + playsound(defender, active_arm.unarmed_miss_sound, 25, TRUE, -1) + defender.visible_message( + span_warning("[attacker]'s [atk_verb] misses [defender]!"), + span_danger("You avoid [attacker]'s [atk_verb]!"), + span_hear("You hear a swoosh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_warning("Your [atk_verb] misses [defender]!")) log_combat(attacker, defender, "attempted to hit", atk_verb) - return FALSE + return MARTIAL_ATTACK_FAIL + if(defender.check_block(attacker, damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) var/armor_block = defender.run_armor_check(affecting, MELEE) - // SKYRAT EDIT CHANGE - var/sound/attack_sound - if(!active_arm.unarmed_attack_sound) - attack_sound = get_sfx("punch") - else - attack_sound = active_arm.unarmed_attack_sound - playsound(defender.loc, attack_sound, 25, TRUE, -1) - //SKYRAT EDIT END - - defender.visible_message(span_danger("[attacker] [atk_verb]ed [defender]!"), \ - span_userdanger("You're [atk_verb]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + playsound(defender, active_arm.unarmed_attack_sound, 25, TRUE, -1) + defender.visible_message( + span_danger("[attacker] [atk_verb]ed [defender]!"), + span_userdanger("You're [atk_verb]ed by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You [atk_verb]ed [defender]!")) - defender.apply_damage(damage, STAMINA, affecting, armor_block) log_combat(attacker, defender, "punched (boxing) ") if(defender.getStaminaLoss() > 50 && istype(defender.mind?.martial_art, /datum/martial_art/boxing)) - var/knockout_prob = defender.getStaminaLoss() + rand(-15,15) - if((defender.stat != DEAD) && prob(knockout_prob)) - defender.visible_message(span_danger("[attacker] knocks [defender] out with a haymaker!"), \ - span_userdanger("You're knocked unconscious by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + var/knockout_prob = defender.getStaminaLoss() + rand(-15, 15) + if(defender.stat != DEAD && prob(knockout_prob)) + defender.visible_message( + span_danger("[attacker] knocks [defender] out with a haymaker!"), + span_userdanger("You're knocked unconscious by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You knock [defender] out with a haymaker!")) - defender.apply_effect(20 SECONDS,EFFECT_KNOCKDOWN, armor_block) + defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, armor_block) defender.SetSleeping(10 SECONDS) log_combat(attacker, defender, "knocked out (boxing) ") - return TRUE + return MARTIAL_ATTACK_SUCCESS -/datum/martial_art/boxing/can_use(mob/living/owner) - if(!ishuman(owner)) +/datum/martial_art/boxing/can_use(mob/living/martial_artist) + if(!ishuman(martial_artist)) return FALSE return ..() /obj/item/clothing/gloves/boxing - var/datum/martial_art/boxing/style = new + var/datum/martial_art/boxing/style /obj/item/clothing/gloves/boxing/Initialize(mapload) . = ..() @@ -76,18 +85,18 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) + style = new() + style.allow_temp_override = FALSE + +/obj/item/clothing/gloves/boxing/Destroy() + QDEL_NULL(style) + return ..() + /obj/item/clothing/gloves/boxing/equipped(mob/user, slot) - ..() - // boxing requires human - if(!ishuman(user)) - return + . = ..() if(slot & ITEM_SLOT_GLOVES) - var/mob/living/student = user - style.teach(student, 1) + style.teach(user, TRUE) /obj/item/clothing/gloves/boxing/dropped(mob/user) - ..() - if(!ishuman(user)) - return - var/mob/living/owner = user - style.remove(owner) + . = ..() + style.fully_remove(user) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index de609a82015..8e33ac5a851 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -10,19 +10,19 @@ help_verb = /mob/living/proc/CQC_help smashes_tables = TRUE display_combos = TRUE - var/old_grab_state = null - var/mob/restraining_mob + /// Weakref to a mob we're currently restraining (with grab-grab combo) + VAR_PRIVATE/datum/weakref/restraining_mob /// Probability of successfully blocking attacks while on throw mode var/block_chance = 75 -/datum/martial_art/cqc/teach(mob/living/cqc_user, make_temporary) +/datum/martial_art/cqc/on_teach(mob/living/new_holder) . = ..() - RegisterSignal(cqc_user, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) - RegisterSignal(cqc_user, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(check_block)) + RegisterSignal(new_holder, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(new_holder, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(check_block)) -/datum/martial_art/cqc/on_remove(mob/living/cqc_user) - UnregisterSignal(cqc_user, list(COMSIG_ATOM_ATTACKBY, COMSIG_LIVING_CHECK_BLOCK)) - . = ..() +/datum/martial_art/cqc/on_remove(mob/living/remove_from) + UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_LIVING_CHECK_BLOCK)) + return ..() ///Signal from getting attacked with an item, for a special interaction with touch spells /datum/martial_art/cqc/proc/on_attackby(mob/living/cqc_user, obj/item/attack_weapon, mob/attacker, params) @@ -69,13 +69,11 @@ /datum/martial_art/cqc/reset_streak(mob/living/new_target) - if(new_target && new_target != restraining_mob) + if(!IS_WEAKREF_OF(new_target, restraining_mob)) restraining_mob = null return ..() /datum/martial_art/cqc/proc/check_streak(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) - return FALSE if(findtext(streak, SLAM_COMBO)) reset_streak() return Slam(attacker, defender) @@ -94,125 +92,159 @@ return FALSE /datum/martial_art/cqc/proc/Slam(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) + if(defender.body_position != STANDING_UP) return FALSE - if(defender.body_position == STANDING_UP) - defender.visible_message(span_danger("[attacker] slams [defender] into the ground!"), \ - span_userdanger("You're slammed into the ground by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) - to_chat(attacker, span_danger("You slam [defender] into the ground!")) - playsound(get_turf(attacker), 'sound/weapons/slam.ogg', 50, TRUE, -1) - defender.apply_damage(10, BRUTE) - defender.Paralyze(12 SECONDS) - log_combat(attacker, defender, "slammed (CQC)") - return TRUE + + attacker.do_attack_animation(defender) + defender.visible_message( + span_danger("[attacker] slams [defender] into the ground!"), + span_userdanger("You're slammed into the ground by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) + to_chat(attacker, span_danger("You slam [defender] into the ground!")) + playsound(attacker, 'sound/weapons/slam.ogg', 50, TRUE, -1) + defender.apply_damage(10, BRUTE) + defender.Paralyze(12 SECONDS) + log_combat(attacker, defender, "slammed (CQC)") + return TRUE /datum/martial_art/cqc/proc/Kick(mob/living/attacker, mob/living/defender) - if(!can_use(attacker) || defender.stat != CONSCIOUS) + if(defender.stat != CONSCIOUS) return FALSE + attacker.do_attack_animation(defender) if(defender.body_position == LYING_DOWN && !defender.IsUnconscious() && defender.getStaminaLoss() >= 100) log_combat(attacker, defender, "knocked out (Head kick)(CQC)") - defender.visible_message(span_danger("[attacker] kicks [defender]'s head, knocking [defender.p_them()] out!"), \ - span_userdanger("You're knocked unconscious by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + defender.visible_message( + span_danger("[attacker] kicks [defender]'s head, knocking [defender.p_them()] out!"), + span_userdanger("You're knocked unconscious by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You kick [defender]'s head, knocking [defender.p_them()] out!")) - playsound(get_turf(attacker), 'sound/weapons/genhit1.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/weapons/genhit1.ogg', 50, TRUE, -1) var/helmet_protection = defender.run_armor_check(BODY_ZONE_HEAD, MELEE) defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, helmet_protection) defender.apply_effect(10 SECONDS, EFFECT_UNCONSCIOUS, helmet_protection) defender.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) + else - defender.visible_message(span_danger("[attacker] kicks [defender] back!"), \ - span_userdanger("You're kicked back by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + defender.visible_message( + span_danger("[attacker] kicks [defender] back!"), + span_userdanger("You're kicked back by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You kick [defender] back!")) - playsound(get_turf(attacker), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(defender, attacker.dir) defender.throw_at(throw_target, 1, 14, attacker) defender.apply_damage(10, attacker.get_attack_type()) if(defender.body_position == LYING_DOWN && !defender.IsUnconscious()) defender.adjustStaminaLoss(45) log_combat(attacker, defender, "kicked (CQC)") - . = TRUE + + return TRUE /datum/martial_art/cqc/proc/Pressure(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) - return FALSE + attacker.do_attack_animation(defender) log_combat(attacker, defender, "pressured (CQC)") - defender.visible_message(span_danger("[attacker] punches [defender]'s neck!"), \ - span_userdanger("Your neck is punched by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + defender.visible_message( + span_danger("[attacker] punches [defender]'s neck!"), + span_userdanger("Your neck is punched by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You punch [defender]'s neck!")) defender.adjustStaminaLoss(60) - playsound(get_turf(attacker), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) return TRUE /datum/martial_art/cqc/proc/Restrain(mob/living/attacker, mob/living/defender) - if(restraining_mob) - return - if(!can_use(attacker)) + if(restraining_mob?.resolve()) return FALSE - if(!defender.stat) - log_combat(attacker, defender, "restrained (CQC)") - defender.visible_message(span_warning("[attacker] locks [defender] into a restraining position!"), \ - span_userdanger("You're locked into a restraining position by [attacker]!"), span_hear("You hear shuffling and a muffled groan!"), null, attacker) - to_chat(attacker, span_danger("You lock [defender] into a restraining position!")) - defender.adjustStaminaLoss(20) - defender.Stun(10 SECONDS) - restraining_mob = defender - addtimer(VARSET_CALLBACK(src, restraining_mob, null), 50, TIMER_UNIQUE) - return TRUE + if(defender.stat != CONSCIOUS) + return FALSE + + log_combat(attacker, defender, "restrained (CQC)") + defender.visible_message( + span_warning("[attacker] locks [defender] into a restraining position!"), + span_userdanger("You're locked into a restraining position by [attacker]!"), + span_hear("You hear shuffling and a muffled groan!"), + null, + attacker, + ) + to_chat(attacker, span_danger("You lock [defender] into a restraining position!")) + defender.adjustStaminaLoss(20) + defender.Stun(10 SECONDS) + restraining_mob = WEAKREF(defender) + addtimer(VARSET_CALLBACK(src, restraining_mob, null), 5 SECONDS, TIMER_UNIQUE) + return TRUE /datum/martial_art/cqc/proc/Consecutive(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) + if(defender.stat != CONSCIOUS) return FALSE - if(!defender.stat) - log_combat(attacker, defender, "consecutive CQC'd (CQC)") - defender.visible_message(span_danger("[attacker] strikes [defender]'s abdomen, neck and back consecutively"), \ - span_userdanger("Your abdomen, neck and back are struck consecutively by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, span_danger("You strike [defender]'s abdomen, neck and back consecutively!")) - playsound(get_turf(defender), 'sound/weapons/cqchit2.ogg', 50, TRUE, -1) - var/obj/item/held_item = defender.get_active_held_item() - if(held_item && defender.temporarilyRemoveItemFromInventory(held_item)) - attacker.put_in_hands(held_item) - defender.adjustStaminaLoss(50) - defender.apply_damage(25, attacker.get_attack_type()) - return TRUE + + attacker.do_attack_animation(defender) + log_combat(attacker, defender, "consecutive CQC'd (CQC)") + defender.visible_message( + span_danger("[attacker] strikes [defender]'s abdomen, neck and back consecutively"), \ + span_userdanger("Your abdomen, neck and back are struck consecutively by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You strike [defender]'s abdomen, neck and back consecutively!")) + playsound(defender, 'sound/weapons/cqchit2.ogg', 50, TRUE, -1) + var/obj/item/held_item = defender.get_active_held_item() + if(held_item && defender.temporarilyRemoveItemFromInventory(held_item)) + attacker.put_in_hands(held_item) + defender.adjustStaminaLoss(50) + defender.apply_damage(25, attacker.get_attack_type()) + return TRUE /datum/martial_art/cqc/grab_act(mob/living/attacker, mob/living/defender) - if(attacker != defender && can_use(attacker)) // attacker != defender prevents grabbing yourself - add_to_streak("G", defender) - if(check_streak(attacker, defender)) //if a combo is made no grab upgrade is done - return TRUE - old_grab_state = attacker.grab_state - defender.grabbedby(attacker, 1) - if(old_grab_state == GRAB_PASSIVE) - defender.drop_all_held_items() - attacker.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab if on grab intent - log_combat(attacker, defender, "grabbed", addition="aggressively") - defender.visible_message(span_warning("[attacker] violently grabs [defender]!"), \ - span_userdanger("You're grabbed violently by [attacker]!"), span_hear("You hear sounds of aggressive fondling!"), COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, span_danger("You violently grab [defender]!")) - return TRUE - else - return FALSE + if(attacker == defender) + return MARTIAL_ATTACK_INVALID + if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + + add_to_streak("G", defender) + if(check_streak(attacker, defender)) //if a combo is made no grab upgrade is done + return MARTIAL_ATTACK_SUCCESS + if(attacker.body_position == LYING_DOWN) + return MARTIAL_ATTACK_INVALID + + var/old_grab_state = attacker.grab_state + defender.grabbedby(attacker, TRUE) + if(old_grab_state == GRAB_PASSIVE) + defender.drop_all_held_items() + attacker.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab if on grab intent + log_combat(attacker, defender, "grabbed", addition="aggressively") + defender.visible_message( + span_warning("[attacker] violently grabs [defender]!"), + span_userdanger("You're grabbed violently by [attacker]!"), + span_hear("You hear sounds of aggressive fondling!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You violently grab [defender]!")) + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/cqc/harm_act(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) - return FALSE - - if(attacker.resting && defender.stat != DEAD && defender.body_position == STANDING_UP) - defender.visible_message(span_danger("[attacker] leg sweeps [defender]!"), \ - span_userdanger("Your legs are sweeped by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) - to_chat(attacker, span_danger("You leg sweep [defender]!")) - playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - attacker.do_attack_animation(defender) - defender.apply_damage(10, BRUTE) - defender.Knockdown(5 SECONDS) - log_combat(attacker, defender, "sweeped (CQC)") - reset_streak() - return TRUE - if((attacker.grab_state == GRAB_KILL) && attacker.zone_selected == BODY_ZONE_HEAD && defender.stat != DEAD) - var/obj/item/bodypart/head = defender.get_bodypart("head") - if(head) + if(attacker.grab_state == GRAB_KILL \ + && attacker.zone_selected == BODY_ZONE_HEAD \ + && attacker.pulling == defender \ + && defender.stat != DEAD \ + ) + var/obj/item/bodypart/head = defender.get_bodypart(BODY_ZONE_HEAD) + if(!isnull(head)) playsound(defender, 'sound/effects/wounds/crack1.ogg', 100) defender.visible_message( span_danger("[attacker] snaps the neck of [defender]!"), @@ -226,66 +258,109 @@ if(!HAS_TRAIT(defender, TRAIT_NODEATH)) defender.death() defender.investigate_log("has had [defender.p_their()] neck snapped by [attacker].", INVESTIGATE_DEATHS) + return MARTIAL_ATTACK_SUCCESS - return TRUE + if(defender.check_block(attacker, 10, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + + if(attacker.resting && defender.stat != DEAD && defender.body_position == STANDING_UP) + defender.visible_message( + span_danger("[attacker] leg sweeps [defender]!"), + span_userdanger("Your legs are sweeped by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) + to_chat(attacker, span_danger("You leg sweep [defender]!")) + playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + attacker.do_attack_animation(defender) + defender.apply_damage(10, BRUTE) + defender.Knockdown(5 SECONDS) + log_combat(attacker, defender, "sweeped (CQC)") + reset_streak() + return MARTIAL_ATTACK_SUCCESS add_to_streak("H", defender) if(check_streak(attacker, defender)) - return TRUE - log_combat(attacker, defender, "attacked (CQC)") + return MARTIAL_ATTACK_SUCCESS attacker.do_attack_animation(defender) var/picked_hit_type = pick("CQC", "Big Boss") var/bonus_damage = 13 if(defender.body_position == LYING_DOWN) bonus_damage += 5 - picked_hit_type = "stomp" + picked_hit_type = pick("kick", "stomp") defender.apply_damage(bonus_damage, BRUTE) - if(picked_hit_type == "kick" || picked_hit_type == "stomp") - playsound(get_turf(defender), 'sound/weapons/cqchit2.ogg', 50, TRUE, -1) - else - playsound(get_turf(defender), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) - defender.visible_message(span_danger("[attacker] [picked_hit_type]ed [defender]!"), \ - span_userdanger("You're [picked_hit_type]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, span_danger("You [picked_hit_type] [defender]!")) - log_combat(attacker, defender, "[picked_hit_type]s (CQC)") - return TRUE + playsound(defender, (picked_hit_type == "kick" || picked_hit_type == "stomp") ? 'sound/weapons/cqchit2.ogg' : 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + + defender.visible_message( + span_danger("[attacker] [picked_hit_type]ed [defender]!"), + span_userdanger("You're [picked_hit_type]ed by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You [picked_hit_type] [defender]!")) + log_combat(attacker, defender, "attacked ([picked_hit_type]'d)(CQC)") + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/cqc/disarm_act(mob/living/attacker, mob/living/defender) - if(!can_use(attacker)) - return FALSE + if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + add_to_streak("D", defender) - var/obj/item/held_item = null if(check_streak(attacker, defender)) - return TRUE - log_combat(attacker, defender, "disarmed (CQC)", "[held_item ? " grabbing \the [held_item]" : ""]") - if(restraining_mob && attacker.pulling == restraining_mob) - log_combat(attacker, defender, "knocked out (Chokehold)(CQC)") - defender.visible_message(span_danger("[attacker] puts [defender] into a chokehold!"), \ - span_userdanger("You're put into a chokehold by [attacker]!"), span_hear("You hear shuffling and a muffled groan!"), null, attacker) + return MARTIAL_ATTACK_SUCCESS + + if(IS_WEAKREF_OF(attacker.pulling, restraining_mob)) + log_combat(attacker, defender, "disarmed (CQC)", addition = "knocked out (CQC Chokehold)") + defender.visible_message( + span_danger("[attacker] puts [defender] into a chokehold!"), + span_userdanger("You're put into a chokehold by [attacker]!"), + span_hear("You hear shuffling and a muffled groan!"), + null, + attacker, + ) to_chat(attacker, span_danger("You put [defender] into a chokehold!")) defender.SetSleeping(40 SECONDS) restraining_mob = null if(attacker.grab_state < GRAB_NECK && !HAS_TRAIT(attacker, TRAIT_PACIFISM)) attacker.setGrabState(GRAB_NECK) - return TRUE - if(prob(65)) - if(!defender.stat || !defender.IsParalyzed() || !restraining_mob) - held_item = defender.get_active_held_item() - defender.visible_message(span_danger("[attacker] strikes [defender]'s jaw with their hand!"), \ - span_userdanger("Your jaw is struck by [attacker], you feel disoriented!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, span_danger("You strike [defender]'s jaw, leaving [defender.p_them()] disoriented!")) - playsound(get_turf(defender), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) - if(held_item && defender.temporarilyRemoveItemFromInventory(held_item)) - attacker.put_in_hands(held_item) - defender.set_jitter_if_lower(4 SECONDS) - defender.apply_damage(5, attacker.get_attack_type()) - else - defender.visible_message(span_danger("[attacker] fails to disarm [defender]!"), \ - span_userdanger("You're nearly disarmed by [attacker]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, span_warning("You fail to disarm [defender]!")) - playsound(defender, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - return FALSE + return MARTIAL_ATTACK_SUCCESS + + attacker.do_attack_animation(defender, ATTACK_EFFECT_DISARM) + if(prob(65) && (defender.stat == CONSCIOUS || !defender.IsParalyzed() || !restraining_mob?.resolve())) + var/obj/item/disarmed_item = defender.get_active_held_item() + if(disarmed_item && defender.temporarilyRemoveItemFromInventory(disarmed_item)) + attacker.put_in_hands(disarmed_item) + else + disarmed_item = null + + defender.visible_message( + span_danger("[attacker] strikes [defender]'s jaw with their hand[disarmed_item ? ", disarming [defender.p_them()] of [disarmed_item]" : ""]!"), + span_userdanger("[attacker] strikes your jaw,[disarmed_item ? " disarming you of [disarmed_item] and" : ""] leaving you disoriented!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You strike [defender]'s jaw,[disarmed_item ? " disarming [defender.p_them()] of [disarmed_item] and" : ""] leaving [defender.p_them()] disoriented!")) + playsound(defender, 'sound/weapons/cqchit1.ogg', 50, TRUE, -1) + defender.set_jitter_if_lower(4 SECONDS) + defender.apply_damage(5, attacker.get_attack_type()) + log_combat(attacker, defender, "disarmed (CQC)", addition = disarmed_item ? "(disarmed of [disarmed_item])" : null) + return MARTIAL_ATTACK_SUCCESS + + defender.visible_message( + span_danger("[attacker] fails to disarm [defender]!"), \ + span_userdanger("You're nearly disarmed by [attacker]!"), + span_hear("You hear a swoosh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_warning("You fail to disarm [defender]!")) + playsound(defender, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + log_combat(attacker, defender, "failed to disarm (CQC)") + return MARTIAL_ATTACK_FAIL /mob/living/proc/CQC_help() @@ -327,8 +402,8 @@ kitchen_areas |= path /// Limits where the chef's CQC can be used to only whitelisted areas. -/datum/martial_art/cqc/under_siege/can_use(mob/living/owner) - if(!is_type_in_list(get_area(owner), kitchen_areas)) +/datum/martial_art/cqc/under_siege/can_use(mob/living/martial_artist) + if(!is_type_in_list(get_area(martial_artist), kitchen_areas)) return FALSE return ..() diff --git a/code/datums/martial/hugs_of_the_gondola.dm b/code/datums/martial/hugs_of_the_gondola.dm deleted file mode 100644 index a1fae03a35a..00000000000 --- a/code/datums/martial/hugs_of_the_gondola.dm +++ /dev/null @@ -1,20 +0,0 @@ -/// Gondola love, makes hugs inject pax if the arms are exposed -/datum/martial_art/hugs_of_the_gondola - name = "Hugs of the Gondola" - id = MARTIALART_HUGS_OF_THE_GONDOLA - -/datum/martial_art/hugs_of_the_gondola/help_act(mob/living/attacker, mob/living/defender) - if(ishuman(defender) && ishuman(attacker)) - var/mob/living/carbon/human/human_attacker = attacker - var/mob/living/carbon/human/human_defender = defender - var/list/covered_body_zones = human_attacker.get_covered_body_zones() - var/pax_injected = 4 - if(BODY_ZONE_L_ARM in covered_body_zones) - pax_injected -= 2 - if(BODY_ZONE_R_ARM in covered_body_zones) - pax_injected -= 2 - if(pax_injected) - human_defender.reagents.add_reagent(/datum/reagent/pax, pax_injected) - to_chat(defender, span_warning("You feel a tiny prick!")) - //this is so it hugs/shakes up as usual - return MARTIAL_ATTACK_INVALID diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index fcc432d41f8..f053c64dc05 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -1,18 +1,31 @@ /datum/martial_art/krav_maga name = "Krav Maga" id = MARTIALART_KRAVMAGA - var/datum/action/neck_chop/neckchop = new/datum/action/neck_chop() - var/datum/action/leg_sweep/legsweep = new/datum/action/leg_sweep() - var/datum/action/lung_punch/lungpunch = new/datum/action/lung_punch() + VAR_PRIVATE/datum/action/neck_chop/neckchop + VAR_PRIVATE/datum/action/leg_sweep/legsweep + VAR_PRIVATE/datum/action/lung_punch/lungpunch + +/datum/martial_art/krav_maga/New() + . = ..() + neckchop = new(src) + legsweep = new(src) + lungpunch = new(src) + +/datum/martial_art/krav_maga/Destroy() + neckchop = null + legsweep = null + lungpunch = null + return ..() /datum/action/neck_chop name = "Neck Chop - Injures the neck, stopping the victim from speaking for a while." button_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "neckchop" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS /datum/action/neck_chop/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't use [name] while you're incapacitated.")) + . = ..() + if(!.) return if (owner.mind.martial_art.streak == "neck_chop") owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") @@ -25,10 +38,11 @@ name = "Leg Sweep - Trips the victim, knocking them down for a brief moment." button_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "legsweep" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS /datum/action/leg_sweep/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't use [name] while you're incapacitated.")) + . = ..() + if(!.) return if (owner.mind.martial_art.streak == "leg_sweep") owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") @@ -41,10 +55,11 @@ name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time." button_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "lungpunch" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS /datum/action/lung_punch/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't use [name] while you're incapacitated.")) + . = ..() + if(!.) return if (owner.mind.martial_art.streak == "quick_choke") owner.visible_message(span_danger("[owner] assumes a neutral stance."), "Your next attack is cleared.") @@ -53,19 +68,20 @@ owner.visible_message(span_danger("[owner] assumes the Lung Punch stance!"), "Your next attack will be a Lung Punch.") owner.mind.martial_art.streak = "quick_choke"//internal name for lung punch -/datum/martial_art/krav_maga/teach(mob/living/owner, make_temporary=FALSE) - if(..()) - to_chat(owner, span_userdanger("You know the arts of [name]!")) - to_chat(owner, span_danger("Place your cursor over a move at the top of the screen to see what it does.")) - neckchop.Grant(owner) - legsweep.Grant(owner) - lungpunch.Grant(owner) +/datum/martial_art/krav_maga/on_teach(mob/living/new_holder) + . = ..() + to_chat(new_holder, span_userdanger("You know the arts of [name]!")) + to_chat(new_holder, span_danger("Place your cursor over a move at the top of the screen to see what it does.")) + neckchop.Grant(new_holder) + legsweep.Grant(new_holder) + lungpunch.Grant(new_holder) -/datum/martial_art/krav_maga/on_remove(mob/living/owner) - to_chat(owner, span_userdanger("You suddenly forget the arts of [name]...")) - neckchop.Remove(owner) - legsweep.Remove(owner) - lungpunch.Remove(owner) +/datum/martial_art/krav_maga/on_remove(mob/living/remove_from) + to_chat(remove_from, span_userdanger("You suddenly forget the arts of [name]...")) + neckchop?.Remove(remove_from) + legsweep?.Remove(remove_from) + lungpunch?.Remove(remove_from) + return ..() /datum/martial_art/krav_maga/proc/check_streak(mob/living/attacker, mob/living/defender) switch(streak) @@ -84,80 +100,134 @@ return FALSE /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/attacker, mob/living/defender) - if(defender.stat || defender.IsParalyzed()) - return FALSE - defender.visible_message(span_warning("[attacker] leg sweeps [defender]!"), \ - span_userdanger("Your legs are sweeped by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + if(defender.stat != CONSCIOUS || defender.IsParalyzed()) + return MARTIAL_ATTACK_INVALID + defender.visible_message( + span_warning("[attacker] leg sweeps [defender]!"), + span_userdanger("Your legs are sweeped by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You leg sweep [defender]!")) - playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) defender.apply_damage(5, BRUTE, BODY_ZONE_CHEST) defender.Knockdown(6 SECONDS) log_combat(attacker, defender, "leg sweeped") - return TRUE + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/krav_maga/proc/quick_choke(mob/living/attacker, mob/living/defender)//is actually lung punch - defender.visible_message(span_warning("[attacker] pounds [defender] on the chest!"), \ - span_userdanger("Your chest is slammed by [attacker]! You can't breathe!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + attacker.do_attack_animation(defender) + defender.visible_message( + span_warning("[attacker] pounds [defender] on the chest!"), + span_userdanger("Your chest is slammed by [attacker]! You can't breathe!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You pound [defender] on the chest!")) - playsound(get_turf(attacker), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) if(defender.losebreath <= 10) defender.losebreath = clamp(defender.losebreath + 5, 0, 10) defender.adjustOxyLoss(10) log_combat(attacker, defender, "quickchoked") - return TRUE + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/krav_maga/proc/neck_chop(mob/living/attacker, mob/living/defender) - defender.visible_message(span_warning("[attacker] karate chops [defender]'s neck!"), \ - span_userdanger("Your neck is karate chopped by [attacker], rendering you unable to speak!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + attacker.do_attack_animation(defender) + defender.visible_message( + span_warning("[attacker] karate chops [defender]'s neck!"), + span_userdanger("Your neck is karate chopped by [attacker], rendering you unable to speak!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You karate chop [defender]'s neck, rendering [defender.p_them()] unable to speak!")) - playsound(get_turf(attacker), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) defender.apply_damage(10, attacker.get_attack_type(), BODY_ZONE_HEAD) defender.adjust_silence_up_to(20 SECONDS, 20 SECONDS) log_combat(attacker, defender, "neck chopped") - return TRUE + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/krav_maga/harm_act(mob/living/attacker, mob/living/defender) - if(check_streak(attacker, defender)) - return TRUE - log_combat(attacker, defender, "punched") - var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) var/picked_hit_type = pick("punch", "kick") var/bonus_damage = 0 if(defender.body_position == LYING_DOWN) bonus_damage += 5 picked_hit_type = "stomp" + + if(defender.check_block(attacker, 10 + bonus_damage, "[attacker]'s [picked_hit_type]", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + if(check_streak(attacker, defender)) + return MARTIAL_ATTACK_SUCCESS + + log_combat(attacker, defender, "[picked_hit_type]ed") + var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) defender.apply_damage(10 + bonus_damage, attacker.get_attack_type(), affecting) if(picked_hit_type == "kick" || picked_hit_type == "stomp") attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) - playsound(get_turf(defender), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + playsound(defender, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) else attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - playsound(get_turf(defender), 'sound/effects/hit_punch.ogg', 50, TRUE, -1) - defender.visible_message(span_danger("[attacker] [picked_hit_type]s [defender]!"), \ - span_userdanger("You're [picked_hit_type]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) + playsound(defender, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + defender.visible_message( + span_danger("[attacker] [picked_hit_type]s [defender]!"), + span_userdanger("You're [picked_hit_type]ed by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You [picked_hit_type] [defender]!")) log_combat(attacker, defender, "[picked_hit_type] with [name]") - return TRUE + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/krav_maga/disarm_act(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL if(check_streak(attacker, defender)) - return TRUE - var/obj/item/stuff_in_hand = null - stuff_in_hand = defender.get_active_held_item() - if(prob(60) && stuff_in_hand) - if(defender.temporarilyRemoveItemFromInventory(stuff_in_hand)) - attacker.put_in_hands(stuff_in_hand) - defender.visible_message("[attacker] disarms [defender]!", \ - "You're disarmed by [attacker]!", "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, attacker) - to_chat(attacker, "You disarm [defender]!") - playsound(defender, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - log_combat(attacker, defender, "shoved (Krav Maga)", "[stuff_in_hand ? " removing \the [stuff_in_hand]" : ""]") - return FALSE + return MARTIAL_ATTACK_SUCCESS + attacker.do_attack_animation(defender, ATTACK_EFFECT_DISARM) + var/obj/item/stuff_in_hand = defender.get_active_held_item() + if(prob(60) && stuff_in_hand && defender.temporarilyRemoveItemFromInventory(stuff_in_hand)) + attacker.put_in_hands(stuff_in_hand) + defender.visible_message( + span_danger("[attacker] disarms [defender]!"), + span_userdanger("You're disarmed by [attacker]!"), + span_hear("You hear aggressive shuffling!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You disarm [defender]!")) + playsound(defender, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + log_combat(attacker, defender, "disarmed (Krav Maga)", addition = "(disarmed of [stuff_in_hand])") + return MARTIAL_ATTACK_SUCCESS + + defender.visible_message( + span_danger("[attacker] fails to disarm [defender]!"), \ + span_userdanger("You're nearly disarmed by [attacker]!"), + span_hear("You hear a swoosh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_warning("You fail to disarm [defender]!")) + playsound(defender, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + log_combat(attacker, defender, "failed to disarm (Krav Maga)") + return MARTIAL_ATTACK_FAIL //Krav Maga Gloves /obj/item/clothing/gloves/krav_maga - var/datum/martial_art/krav_maga/style = new + var/datum/martial_art/krav_maga/style + clothing_traits = list(TRAIT_FAST_CUFFING) + +/obj/item/clothing/gloves/krav_maga/Initialize(mapload) + . = ..() + style = new() + style.allow_temp_override = FALSE + +/obj/item/clothing/gloves/krav_maga/Destroy() + QDEL_NULL(style) + return ..() /obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot) . = ..() @@ -166,8 +236,7 @@ /obj/item/clothing/gloves/krav_maga/dropped(mob/user) . = ..() - if(user.get_item_by_slot(ITEM_SLOT_GLOVES) == src) - style.remove(user) + style.fully_remove(user) /obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec name = "krav maga gloves" diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm index eea4439691f..e571f46be35 100644 --- a/code/datums/martial/mushpunch.dm +++ b/code/datums/martial/mushpunch.dm @@ -2,39 +2,56 @@ name = "Mushroom Punch" id = MARTIALART_MUSHPUNCH -/datum/martial_art/mushpunch/harm_act(mob/living/A, mob/living/D) - var/atk_verb - to_chat(A, span_spiderbroodmother("You begin to wind up an attack...")) - if(!do_after(A, 2.5 SECONDS, target = D)) - to_chat(A, span_spiderbroodmother("Your attack was interrupted!")) - return TRUE //martial art code was a mistake - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - atk_verb = pick("punch", "smash", "crack") - D.visible_message(span_danger("[A] [atk_verb]ed [D] with such inhuman strength that it sends [D.p_them()] flying backwards!"), \ - span_userdanger("You're [atk_verb]ed by [A] with such inhuman strength that it sends you flying backwards!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A) - to_chat(A, span_danger("You [atk_verb] [D] with such inhuman strength that it sends [D.p_them()] flying backwards!")) - D.apply_damage(rand(15,30), A.get_attack_type()) - playsound(D, 'sound/effects/meteorimpact.ogg', 25, TRUE, -1) - var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) - D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. - D.Paralyze(2 SECONDS) - if(atk_verb) - log_combat(A, D, "[atk_verb] (Mushroom Punch)") - return TRUE +/datum/martial_art/mushpunch/harm_act(mob/living/attacker, mob/living/defender) + INVOKE_ASYNC(src, PROC_REF(charge_up_attack), attacker, defender) + return MARTIAL_ATTACK_SUCCESS + +/datum/martial_art/mushpunch/proc/charge_up_attack(mob/living/attacker, mob/living/defender) + + to_chat(attacker, span_spiderbroodmother("You begin to wind up an attack...")) + if(!do_after(attacker, 2.5 SECONDS, defender)) + to_chat(attacker, span_spiderbroodmother("Your attack was interrupted!")) + return + + var/final_damage = rand(15, 30) + var/atk_verb = pick("punch", "smash", "crack") + if(defender.check_block(attacker, final_damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) + return + + attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) + defender.visible_message( + span_danger("[attacker] [atk_verb]ed [defender] with such inhuman strength that it sends [defender.p_them()] flying backwards!"), \ + span_userdanger("You're [atk_verb]ed by [attacker] with such inhuman strength that it sends you flying backwards!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) + to_chat(attacker, span_danger("You [atk_verb] [defender] with such inhuman strength that it sends [defender.p_them()] flying backwards!")) + defender.apply_damage(final_damage, attacker.get_attack_type()) + playsound(defender, 'sound/effects/meteorimpact.ogg', 25, TRUE, -1) + var/throwtarget = get_edge_target_turf(attacker, get_dir(attacker, get_step_away(defender, attacker))) + defender.throw_at(throwtarget, 4, 2, attacker)//So stuff gets tossed around at the same time. + defender.Paralyze(2 SECONDS) + log_combat(attacker, defender, "[atk_verb] (Mushroom Punch)") /obj/item/mushpunch name = "odd mushroom" - desc = "Sapienza Ophioglossoides:An odd mushroom from the flesh of a mushroom person. It has apparently retained some innate power of its owner, as it quivers with barely-contained POWER!" + desc = "Sapienza Ophioglossoides:An odd mushroom from the flesh of a mushroom person. \ + It has apparently retained some innate power of its owner, as it quivers with barely-contained POWER!" icon = 'icons/obj/service/hydroponics/seeds.dmi' icon_state = "mycelium-angel" /obj/item/mushpunch/attack_self(mob/living/user) - if(!istype(user) || !user) + if(!istype(user)) return - var/message = span_spiderbroodmother("You devour [src], and a confluence of skill and power from the mushroom enhances your punches! You do need a short moment to charge these powerful punches.") - to_chat(user, message) - var/datum/martial_art/mushpunch/mush = new(null) + to_chat(user, span_spiderbroodmother("You devour [src], \ + and a confluence of skill and power from the mushroom enhances your punches! \ + You do need a short moment to charge these powerful punches.")) + var/datum/martial_art/mushpunch/mush = new() mush.teach(user) + visible_message( + span_warning("[user] devours [src]."), + span_notice("You devour [src]."), + ) + qdel(src) - visible_message(span_warning("[user] devours [src]."), \ - span_notice("You devour [src].")) diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index f4c89177ac3..8a73f47093b 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -10,60 +10,71 @@ var/plasma_power = 1 //starts at a 1, 2, 4 explosion. var/plasma_increment = 1 //how much explosion power gets added per kill (1 = 1, 2, 4. 2 = 2, 4, 8 and so on) var/plasma_cap = 12 //max size explosion level + var/datum/action/cooldown/spell/aoe/repulse/tornado_spell display_combos = TRUE +/datum/martial_art/plasma_fist/New() + . = ..() + tornado_spell = new(src) + +/datum/martial_art/plasma_fist/Destroy() + tornado_spell = null + return ..() + /datum/martial_art/plasma_fist/proc/check_streak(mob/living/attacker, mob/living/defender) if(findtext(streak,TORNADO_COMBO)) if(attacker == defender)//helps using apotheosis return FALSE reset_streak() - Tornado(attacker, defender) - return TRUE + return Tornado(attacker, defender) if(findtext(streak,THROWBACK_COMBO)) if(attacker == defender)//helps using apotheosis return FALSE reset_streak() - Throwback(attacker, defender) - return TRUE + return Throwback(attacker, defender) if(findtext(streak,PLASMA_COMBO)) reset_streak() if(attacker == defender && !nobomb) - Apotheosis(attacker, defender) - else - Plasma(attacker, defender) - return TRUE + return Apotheosis(attacker, defender) + return Plasma(attacker, defender) return FALSE /datum/martial_art/plasma_fist/proc/Tornado(mob/living/attacker, mob/living/defender) attacker.say("TORNADO SWEEP!", forced="plasma fist") - dance_rotate(attacker, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), attacker.loc, 'sound/weapons/punch1.ogg', 15, TRUE, -1)) - - var/datum/action/cooldown/spell/aoe/repulse/tornado_spell = new(src) + dance_rotate(attacker, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), attacker, 'sound/weapons/punch1.ogg', 15, TRUE, -1)) tornado_spell.cast(attacker) - qdel(tornado_spell) - - log_combat(attacker, defender, "tornado sweeped(Plasma Fist)") - return + log_combat(attacker, defender, "tornado sweeped (Plasma Fist)") + return TRUE /datum/martial_art/plasma_fist/proc/Throwback(mob/living/attacker, mob/living/defender) - defender.visible_message(span_danger("[attacker] hits [defender] with Plasma Punch!"), \ - span_userdanger("You're hit with a Plasma Punch by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + defender.visible_message( + span_danger("[attacker] hits [defender] with Plasma Punch!"), + span_userdanger("You're hit with a Plasma Punch by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You hit [defender] with Plasma Punch!")) - playsound(defender.loc, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(defender, 'sound/weapons/punch1.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(defender, get_dir(defender, get_step_away(defender, attacker))) defender.throw_at(throw_target, 200, 4,attacker) attacker.say("HYAH!", forced="plasma fist") log_combat(attacker, defender, "threw back (Plasma Fist)") - return + return TRUE /datum/martial_art/plasma_fist/proc/Plasma(mob/living/attacker, mob/living/defender) - var/hasclient = defender.client ? TRUE : FALSE + var/hasclient = !!defender.client attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - playsound(defender.loc, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(defender, 'sound/weapons/punch1.ogg', 50, TRUE, -1) attacker.say("PLASMA FIST!", forced="plasma fist") - defender.visible_message(span_danger("[attacker] hits [defender] with THE PLASMA FIST TECHNIQUE!"), \ - span_userdanger("You're suddenly hit with THE PLASMA FIST TECHNIQUE by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + defender.visible_message( + span_danger("[attacker] hits [defender] with THE PLASMA FIST TECHNIQUE!"), + span_userdanger("You're suddenly hit with THE PLASMA FIST TECHNIQUE by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You hit [defender] with THE PLASMA FIST TECHNIQUE!")) log_combat(attacker, defender, "gibbed (Plasma Fist)") var/turf/Dturf = get_turf(defender) @@ -71,13 +82,15 @@ defender.gib(DROP_ALL_REMAINS) if(nobomb) return + if(!hasclient) to_chat(attacker, span_warning("Taking this plasma energy for your [span_notice("Apotheosis")] would bring dishonor to the clan!")) new /obj/effect/temp_visual/plasma_soul(Dturf)//doesn't beam to you, so it just hangs around and poofs. - return + else if(plasma_power >= plasma_cap) to_chat(attacker, span_warning("You cannot power up your [span_notice("Apotheosis")] any more!")) new /obj/effect/temp_visual/plasma_soul(Dturf)//doesn't beam to you, so it just hangs around and poofs. + else plasma_power += plasma_increment to_chat(attacker, span_nicegreen("Power increasing! Your [span_notice("Apotheosis")] is now at power level [plasma_power]!")) @@ -87,6 +100,7 @@ flash_color(attacker, flash_color = "#9C00FF", flash_time = 3 SECONDS) animate(attacker, color = oldcolor, time = 3 SECONDS) + return TRUE /datum/martial_art/plasma_fist/proc/Apotheosis(mob/living/user, mob/living/target) user.say("APOTHEOSIS!!", forced="plasma fist") @@ -109,12 +123,13 @@ to_chat(user, span_userdanger("The explosion knocks your soul out of your body!")) user.ghostize(FALSE) //prevents... horrible memes just believe me - user.apply_damage(rand(50,70), BRUTE) + user.apply_damage(rand(50, 70), BRUTE, wound_bonus = CANT_WOUND) addtimer(CALLBACK(src, PROC_REF(Apotheosis_end), user), 6 SECONDS) playsound(boomspot, 'sound/weapons/punch1.ogg', 50, TRUE, -1) explosion(user, devastation_range = plasma_power, heavy_impact_range = plasma_power*2, light_impact_range = plasma_power*4, ignorecap = TRUE, explosion_cause = src) plasma_power = 1 //just in case there is any clever way to cause it to happen again + return TRUE /datum/martial_art/plasma_fist/proc/Apotheosis_end(mob/living/dying) dying.remove_traits(list(TRAIT_FORCED_STANDING, TRAIT_BOMBIMMUNE), type) @@ -124,24 +139,29 @@ dying.death() /datum/martial_art/plasma_fist/harm_act(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 10, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + add_to_streak("H", defender) - if(check_streak(attacker, defender)) - return TRUE - return FALSE + return check_streak(attacker, defender) ? MARTIAL_ATTACK_SUCCESS : MARTIAL_ATTACK_INVALID /datum/martial_art/plasma_fist/disarm_act(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL add_to_streak("D", defender) if(check_streak(attacker, defender)) - return TRUE + return MARTIAL_ATTACK_SUCCESS if(attacker == defender)//there is no disarming yourself, so we need to let plasma fist user know to_chat(attacker, span_notice("You have added a disarm to your streak.")) - return FALSE + return MARTIAL_ATTACK_FAIL + return MARTIAL_ATTACK_INVALID /datum/martial_art/plasma_fist/grab_act(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 0, "[attacker]'s grab", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + add_to_streak("G", defender) - if(check_streak(attacker, defender)) - return TRUE - return FALSE + return check_streak(attacker, defender) ? MARTIAL_ATTACK_SUCCESS : MARTIAL_ATTACK_INVALID /mob/living/proc/plasma_fist_help() set name = "Recall Teachings" diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 671867f4252..9ba78f9ef45 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -24,6 +24,11 @@ attacker.Stun(2 SECONDS) atk_verb = "cried looking at" if(3) + if(defender.check_block(attacker, 0, "[attacker]'s grab", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + if(attacker.body_position == LYING_DOWN) + return MARTIAL_ATTACK_INVALID + if(attacker.grab_state >= GRAB_AGGRESSIVE) defender.grabbedby(attacker, 1) else @@ -33,22 +38,37 @@ defender.stop_pulling() if(grab_attack) log_combat(attacker, defender, "grabbed", addition="aggressively") - defender.visible_message(span_warning("[attacker] violently grabs [defender]!"), \ - span_userdanger("You're violently grabbed by [attacker]!"), span_hear("You hear sounds of aggressive fondling!"), null, attacker) + defender.visible_message( + span_warning("[attacker] violently grabs [defender]!"), + span_userdanger("You're violently grabbed by [attacker]!"), + span_hear("You hear sounds of aggressive fondling!"), + null, + attacker, + ) to_chat(attacker, span_danger("You violently grab [defender]!")) attacker.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab else log_combat(attacker, defender, "grabbed", addition="passively") attacker.setGrabState(GRAB_PASSIVE) if(4) - attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) atk_verb = "headbutt" - defender.visible_message(span_danger("[attacker] [atk_verb]s [defender]!"), \ - span_userdanger("You're [atk_verb]ed by [attacker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + var/defender_damage = rand(5, 10) + if(defender.check_block(attacker, defender_damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + + attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) + attacker.emote("flip") + defender.visible_message( + span_danger("[attacker] [atk_verb]s [defender]!"), + span_userdanger("You're [atk_verb]ed by [attacker]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You [atk_verb] [defender]!")) - playsound(get_turf(defender), 'sound/weapons/punch1.ogg', 40, TRUE, -1) - defender.apply_damage(rand(5,10), attacker.get_attack_type(), BODY_ZONE_HEAD) - attacker.apply_damage(rand(5,10), attacker.get_attack_type(), BODY_ZONE_HEAD) + playsound(defender, 'sound/weapons/punch1.ogg', 40, TRUE, -1) + defender.apply_damage(defender_damage, attacker.get_attack_type(), BODY_ZONE_HEAD) + attacker.apply_damage(rand(5, 10), attacker.get_attack_type(), BODY_ZONE_HEAD) if(iscarbon(defender)) var/mob/living/carbon/carbon_defender = defender if(!istype(carbon_defender.head, /obj/item/clothing/head/helmet/) && !istype(carbon_defender.head, /obj/item/clothing/head/utility/hardhat)) @@ -56,19 +76,29 @@ attacker.Stun(rand(1 SECONDS, 4.5 SECONDS)) defender.Stun(rand(0.5 SECONDS, 3 SECONDS)) if(5,6) - attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) atk_verb = pick("kick", "hit", "slam") - defender.visible_message(span_danger("[attacker] [atk_verb]s [defender] with such inhuman strength that it sends [defender.p_them()] flying backwards!"), \ - span_userdanger("You're [atk_verb]ed by [attacker] with such inhuman strength that it sends you flying backwards!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, attacker) + if(defender.check_block(attacker, 0, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + + attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) + defender.visible_message( + span_danger("[attacker] [atk_verb]s [defender] with such inhuman strength that it sends [defender.p_them()] flying backwards!"), + span_userdanger("You're [atk_verb]ed by [attacker] with such inhuman strength that it sends you flying backwards!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You [atk_verb] [defender] with such inhuman strength that it sends [defender.p_them()] flying backwards!")) - defender.apply_damage(rand(15,30), attacker.get_attack_type()) - playsound(get_turf(defender), 'sound/effects/meteorimpact.ogg', 25, TRUE, -1) + defender.apply_damage(rand(15, 30), attacker.get_attack_type()) + playsound(defender, 'sound/effects/meteorimpact.ogg', 25, TRUE, -1) var/throwtarget = get_edge_target_turf(attacker, get_dir(attacker, get_step_away(defender, attacker))) defender.throw_at(throwtarget, 4, 2, attacker)//So stuff gets tossed around at the same time. defender.Paralyze(6 SECONDS) if(7,8) - return FALSE //Resume default behaviour + return MARTIAL_ATTACK_INVALID //Resume default behaviour if(atk_verb) log_combat(attacker, defender, "[atk_verb] (Psychotic Brawling)") - return TRUE + return MARTIAL_ATTACK_SUCCESS + + return MARTIAL_ATTACK_FAIL diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 0e061b35daf..fa6f8416e2c 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -8,69 +8,77 @@ allow_temp_override = FALSE help_verb = /mob/living/proc/sleeping_carp_help display_combos = TRUE + /// List of traits applied to users of this martial art. var/list/scarp_traits = list(TRAIT_NOGUNS, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER, TRAIT_HEAVY_SLEEPER) -/datum/martial_art/the_sleeping_carp/teach(mob/living/target, make_temporary = FALSE) +/datum/martial_art/the_sleeping_carp/on_teach(mob/living/new_holder) . = ..() - if(!.) - return - target.add_traits(scarp_traits, SLEEPING_CARP_TRAIT) - RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) - RegisterSignal(target, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) - target.faction |= FACTION_CARP //:D + new_holder.add_traits(scarp_traits, SLEEPING_CARP_TRAIT) + RegisterSignal(new_holder, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(new_holder, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) + new_holder.faction |= FACTION_CARP //:D -/datum/martial_art/the_sleeping_carp/on_remove(mob/living/target) - target.remove_traits(scarp_traits, SLEEPING_CARP_TRAIT) - UnregisterSignal(target, COMSIG_ATOM_ATTACKBY) - UnregisterSignal(target, COMSIG_ATOM_PRE_BULLET_ACT) - target.faction -= FACTION_CARP //:( - . = ..() +/datum/martial_art/the_sleeping_carp/on_remove(mob/living/remove_from) + remove_from.remove_traits(scarp_traits, SLEEPING_CARP_TRAIT) + UnregisterSignal(remove_from, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_PRE_BULLET_ACT)) + remove_from.faction -= FACTION_CARP //:( + return ..() /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/attacker, mob/living/defender) if(findtext(streak,STRONG_PUNCH_COMBO)) reset_streak() - strongPunch(attacker, defender) - return TRUE + return strongPunch(attacker, defender) + if(findtext(streak,LAUNCH_KICK_COMBO)) reset_streak() - launchKick(attacker, defender) - return TRUE + return launchKick(attacker, defender) + if(findtext(streak,DROP_KICK_COMBO)) reset_streak() - dropKick(attacker, defender) - return TRUE + return dropKick(attacker, defender) + return FALSE ///Gnashing Teeth: Harm Harm, consistent 20 force punch on every second harm punch /datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/attacker, mob/living/defender) - ///this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating + // this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) var/atk_verb = pick("precisely kick", "brutally chop", "cleanly hit", "viciously slam") - defender.visible_message(span_danger("[attacker] [atk_verb]s [defender]!"), \ - span_userdanger("[attacker] [atk_verb]s you!"), null, null, attacker) + defender.visible_message( + span_danger("[attacker] [atk_verb]s [defender]!"), + span_userdanger("[attacker] [atk_verb]s you!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You [atk_verb] [defender]!")) playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) log_combat(attacker, defender, "strong punched (Sleeping Carp)") defender.apply_damage(20, attacker.get_attack_type(), affecting) - return + return TRUE ///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards /datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/attacker, mob/living/defender) attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) - defender.visible_message(span_warning("[attacker] kicks [defender] square in the chest, sending them flying!"), \ - span_userdanger("You are kicked square in the chest by [attacker], sending you flying!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker) - playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + defender.visible_message( + span_warning("[attacker] kicks [defender] square in the chest, sending them flying!"), + span_userdanger("You are kicked square in the chest by [attacker], sending you flying!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(defender, attacker.dir) defender.throw_at(throw_target, 7, 4, attacker) defender.apply_damage(15, attacker.get_attack_type(), BODY_ZONE_CHEST, wound_bonus = CANT_WOUND) log_combat(attacker, defender, "launchkicked (Sleeping Carp)") - return + return TRUE ///Keelhaul: Disarm Disarm combo, knocks people down and deals substantial stamina damage, and also discombobulates them. Knocks objects out of their hands if they're already on the ground. /datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/attacker, mob/living/defender) attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK) - playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) if(defender.body_position == STANDING_UP) defender.Knockdown(4 SECONDS) defender.visible_message(span_warning("[attacker] kicks [defender] in the head, sending them face first into the floor!"), \ @@ -83,33 +91,41 @@ defender.adjust_dizzy_up_to(10 SECONDS, 10 SECONDS) defender.adjust_temp_blindness_up_to(2 SECONDS, 10 SECONDS) log_combat(attacker, defender, "dropkicked (Sleeping Carp)") - return + return TRUE /datum/martial_art/the_sleeping_carp/grab_act(mob/living/attacker, mob/living/defender) if(!can_deflect(attacker)) //allows for deniability - return ..() + return MARTIAL_ATTACK_INVALID + + if(defender.check_block(attacker, 0, "[attacker]'s grab", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL add_to_streak("G", defender) if(check_streak(attacker, defender)) - return TRUE + return MARTIAL_ATTACK_SUCCESS + var/grab_log_description = "grabbed" attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) if(defender.stat != DEAD && !defender.IsUnconscious() && defender.getStaminaLoss() >= 80) //We put our target to sleep. defender.visible_message( - span_danger("[attacker] carefully pinch a nerve in [defender]'s neck, knocking them out cold"), + span_danger("[attacker] carefully pinch a nerve in [defender]'s neck, knocking them out cold!"), span_userdanger("[attacker] pinches something in your neck, and you fall unconscious!"), ) grab_log_description = "grabbed and nerve pinched" defender.Unconscious(10 SECONDS) defender.apply_damage(20, STAMINA) log_combat(attacker, defender, "[grab_log_description] (Sleeping Carp)") - return ..() + return MARTIAL_ATTACK_INVALID // normal grab /datum/martial_art/the_sleeping_carp/harm_act(mob/living/attacker, mob/living/defender) - if((attacker.grab_state == GRAB_KILL) && attacker.zone_selected == BODY_ZONE_HEAD && defender.stat != DEAD) - var/obj/item/bodypart/head = defender.get_bodypart("head") - if(head) + if(attacker.grab_state == GRAB_KILL \ + && attacker.zone_selected == BODY_ZONE_HEAD \ + && attacker.pulling == defender \ + && defender.stat != DEAD \ + ) + var/obj/item/bodypart/head = defender.get_bodypart(BODY_ZONE_HEAD) + if(!isnull(head)) playsound(defender, 'sound/effects/wounds/crack1.ogg', 100) defender.visible_message( span_danger("[attacker] snaps the neck of [defender]!"), @@ -123,37 +139,47 @@ if(!HAS_TRAIT(defender, TRAIT_NODEATH)) defender.death() defender.investigate_log("has had [defender.p_their()] neck snapped by [attacker].", INVESTIGATE_DEATHS) + return MARTIAL_ATTACK_SUCCESS + + var/atk_verb = pick("kick", "chop", "hit", "slam") + var/final_damage = rand(10, 15) + if(defender.check_block(attacker, final_damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL + add_to_streak("H", defender) if(check_streak(attacker, defender)) - return TRUE + return MARTIAL_ATTACK_SUCCESS var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected)) attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) - var/atk_verb = pick("kick", "chop", "hit", "slam") - defender.visible_message(span_danger("[attacker] [atk_verb]s [defender]!"), \ - span_userdanger("[attacker] [atk_verb]s you!"), null, null, attacker) + defender.visible_message( + span_danger("[attacker] [atk_verb]s [defender]!"), + span_userdanger("[attacker] [atk_verb]s you!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + null, + attacker, + ) to_chat(attacker, span_danger("You [atk_verb] [defender]!")) - - defender.apply_damage(rand(10,15), attacker.get_attack_type(), affecting, wound_bonus = CANT_WOUND) + defender.apply_damage(final_damage, attacker.get_attack_type(), affecting, wound_bonus = CANT_WOUND) playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) log_combat(attacker, defender, "punched (Sleeping Carp)") - - return TRUE + return MARTIAL_ATTACK_SUCCESS /datum/martial_art/the_sleeping_carp/disarm_act(mob/living/attacker, mob/living/defender) if(!can_deflect(attacker)) //allows for deniability - return ..() + return MARTIAL_ATTACK_INVALID + if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL add_to_streak("D", defender) if(check_streak(attacker, defender)) - return TRUE + return MARTIAL_ATTACK_SUCCESS attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH) playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1) defender.apply_damage(20, STAMINA) log_combat(attacker, defender, "disarmed (Sleeping Carp)") - - return ..() + return MARTIAL_ATTACK_INVALID // normal disarm /datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user) if(!can_use(carp_user) || !carp_user.combat_mode) diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index a28c2e75646..23591852ec9 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -18,13 +18,32 @@ If you make a derivative work from this code, you must include this notification /datum/martial_art/wrestling name = "Wrestling" id = MARTIALART_WRESTLING - var/datum/action/slam/slam = new/datum/action/slam() - var/datum/action/throw_wrassle/throw_wrassle = new/datum/action/throw_wrassle() - var/datum/action/kick/kick = new/datum/action/kick() - var/datum/action/strike/strike = new/datum/action/strike() - var/datum/action/drop/drop = new/datum/action/drop() + VAR_PRIVATE/datum/action/slam/slam + VAR_PRIVATE/datum/action/throw_wrassle/throw_wrassle + VAR_PRIVATE/datum/action/kick/kick + VAR_PRIVATE/datum/action/strike/strike + VAR_PRIVATE/datum/action/drop/drop + +/datum/martial_art/wrestling/New() + . = ..() + slam = new(src) + throw_wrassle = new(src) + kick = new(src) + strike = new(src) + drop = new(src) + +/datum/martial_art/wrestling/Destroy() + slam = null + throw_wrassle = null + kick = null + strike = null + drop = null + return ..() /datum/martial_art/wrestling/proc/check_streak(mob/living/attacker, mob/living/defender) + if(defender.check_block(attacker, 10, "[attacker]'s [streak]", UNARMED_ATTACK)) + return FALSE + switch(streak) if("drop") streak = "" @@ -51,10 +70,11 @@ If you make a derivative work from this code, you must include this notification /datum/action/slam name = "Slam (Cinch) - Slam a grappled opponent into the floor." button_icon_state = "wrassle_slam" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS /datum/action/slam/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) + . = ..() + if(!.) return owner.visible_message(span_danger("[owner] prepares to BODY SLAM!"), "Your next attack will be a BODY SLAM.") owner.mind.martial_art.streak = "slam" @@ -62,10 +82,11 @@ If you make a derivative work from this code, you must include this notification /datum/action/throw_wrassle name = "Throw (Cinch) - Spin a cinched opponent around and throw them." button_icon_state = "wrassle_throw" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS /datum/action/throw_wrassle/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) + . = ..() + if(!.) return owner.visible_message(span_danger("[owner] prepares to THROW!"), "Your next attack will be a THROW.") owner.mind.martial_art.streak = "throw" @@ -73,10 +94,11 @@ If you make a derivative work from this code, you must include this notification /datum/action/kick name = "Kick - A powerful kick, sends people flying away from you. Also useful for escaping from bad situations." button_icon_state = "wrassle_kick" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS // This is supposed to be usable while cuffed but it probably isn't /datum/action/kick/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) + . = ..() + if(!.) return owner.visible_message(span_danger("[owner] prepares to KICK!"), "Your next attack will be a KICK.") owner.mind.martial_art.streak = "kick" @@ -84,10 +106,11 @@ If you make a derivative work from this code, you must include this notification /datum/action/strike name = "Strike - Hit a neaby opponent with a quick attack." button_icon_state = "wrassle_strike" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS /datum/action/strike/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) + . = ..() + if(!.) return owner.visible_message(span_danger("[owner] prepares to STRIKE!"), "Your next attack will be a STRIKE.") owner.mind.martial_art.streak = "strike" @@ -95,37 +118,36 @@ If you make a derivative work from this code, you must include this notification /datum/action/drop name = "Drop - Smash down onto an opponent." button_icon_state = "wrassle_drop" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED /datum/action/drop/Trigger(trigger_flags) - if(owner.incapacitated()) - to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) + . = ..() + if(!.) return owner.visible_message(span_danger("[owner] prepares to LEG DROP!"), "Your next attack will be a LEG DROP.") owner.mind.martial_art.streak = "drop" -/datum/martial_art/wrestling/teach(mob/living/owner, make_temporary=FALSE) - if(..()) - to_chat(owner, span_userdanger("SNAP INTO A THIN TIM!")) - to_chat(owner, span_danger("Place your cursor over a move at the top of the screen to see what it does.")) - drop.Grant(owner) - kick.Grant(owner) - slam.Grant(owner) - throw_wrassle.Grant(owner) - strike.Grant(owner) +/datum/martial_art/wrestling/on_teach(mob/living/new_holder) + . = ..() + to_chat(new_holder, span_userdanger("SNAP INTO A THIN TIM!")) + to_chat(new_holder, span_danger("Place your cursor over a move at the top of the screen to see what it does.")) + drop.Grant(new_holder) + kick.Grant(new_holder) + slam.Grant(new_holder) + throw_wrassle.Grant(new_holder) + strike.Grant(new_holder) -/datum/martial_art/wrestling/on_remove(mob/living/owner) - to_chat(owner, span_userdanger("You no longer feel that the tower of power is too sweet to be sour...")) - drop.Remove(owner) - kick.Remove(owner) - slam.Remove(owner) - throw_wrassle.Remove(owner) - strike.Remove(owner) +/datum/martial_art/wrestling/on_remove(mob/living/remove_from) + to_chat(remove_from, span_userdanger("You no longer feel that the tower of power is too sweet to be sour...")) + drop?.Remove(remove_from) + kick?.Remove(remove_from) + slam?.Remove(remove_from) + throw_wrassle?.Remove(remove_from) + strike?.Remove(remove_from) + return ..() /datum/martial_art/wrestling/harm_act(mob/living/attacker, mob/living/defender) - if(check_streak(attacker, defender)) - return 1 - log_combat(attacker, defender, "punched with wrestling") - ..() + return check_streak(attacker, defender) ? MARTIAL_ATTACK_SUCCESS : MARTIAL_ATTACK_INVALID /datum/martial_art/wrestling/proc/throw_wrassle(mob/living/attacker, mob/living/defender) if(!defender) @@ -444,36 +466,46 @@ If you make a derivative work from this code, you must include this notification return /datum/martial_art/wrestling/disarm_act(mob/living/attacker, mob/living/defender) - if(check_streak(attacker, defender)) - return 1 - log_combat(attacker, defender, "wrestling-disarmed") - ..() + return check_streak(attacker, defender) ? MARTIAL_ATTACK_SUCCESS : MARTIAL_ATTACK_INVALID /datum/martial_art/wrestling/grab_act(mob/living/attacker, mob/living/defender) if(check_streak(attacker, defender)) - return 1 + return MARTIAL_ATTACK_SUCCESS + if(defender.check_block(attacker, 0, "[attacker]'s grab", UNARMED_ATTACK)) + return MARTIAL_ATTACK_FAIL if(attacker.pulling == defender) - return 1 + return MARTIAL_ATTACK_FAIL attacker.start_pulling(defender) - defender.visible_message(span_danger("[attacker] gets [defender] in a cinch!"), \ - span_userdanger("You're put into a cinch by [attacker]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, attacker) + defender.visible_message( + span_danger("[attacker] gets [defender] in a cinch!"), + span_userdanger("You're put into a cinch by [attacker]!"), + span_hear("You hear aggressive shuffling!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) to_chat(attacker, span_danger("You get [defender] in a cinch!")) defender.Stun(rand(6 SECONDS, 10 SECONDS)) log_combat(attacker, defender, "cinched") - return 1 + return MARTIAL_ATTACK_SUCCESS /obj/item/storage/belt/champion/wrestling name = "Wrestling Belt" - var/datum/martial_art/wrestling/style = new + var/datum/martial_art/wrestling/style + +/obj/item/storage/belt/champion/wrestling/Initialize(mapload) + . = ..() + style = new() + style.allow_temp_override = FALSE + +/obj/item/storage/belt/champion/wrestling/Destroy() + QDEL_NULL(style) + return ..() /obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot) . = ..() if(slot & ITEM_SLOT_BELT) style.teach(user, TRUE) - return /obj/item/storage/belt/champion/wrestling/dropped(mob/user) . = ..() - if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) - style.remove(user) - return + style.fully_remove(user) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 396b902b73f..da5a15b8d31 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -29,6 +29,8 @@ Simple datum which is instanced once per type and is used for every object of sa var/list/categories = list() ///The type of sheet this material creates. This should be replaced as soon as possible by greyscale sheets var/sheet_type + /// What type of ore is this material associated with? Used for mining, and not every material has one. + var/obj/item/ore_type ///This is a modifier for force, and resembles the strength of the material var/strength_modifier = 1 ///This is a modifier for integrity, and resembles the strength of the material @@ -59,6 +61,10 @@ Simple datum which is instanced once per type and is used for every object of sa var/obj/item/shard_type ///What type of debris the tile will leave behind when shattered. var/obj/effect/decal/debris_type + /// How likely this mineral is to be found in a boulder during mining. + var/mineral_rarity = MATERIAL_RARITY_COMMON + /// How many points per units of ore does this grant? + var/points_per_unit = 1 /** Handles initializing the material. * diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index f79b9f7e422..3c5f6ab62d0 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -6,7 +6,10 @@ greyscale_colors = "#878687" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/iron + ore_type = /obj/item/stack/ore/iron value_per_unit = 5 / SHEET_MATERIAL_AMOUNT + mineral_rarity = MATERIAL_RARITY_COMMON + points_per_unit = 1 / SHEET_MATERIAL_AMOUNT minimum_value_override = 0 tradable = TRUE tradable_base_quantity = MATERIAL_QUANTITY_COMMON @@ -25,6 +28,7 @@ categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass + ore_type = /obj/item/stack/ore/glass shard_type = /obj/item/shard debris_type = /obj/effect/decal/cleanable/glass value_per_unit = 5 / SHEET_MATERIAL_AMOUNT @@ -33,6 +37,8 @@ tradable_base_quantity = MATERIAL_QUANTITY_COMMON beauty_modifier = 0.05 armor_modifiers = list(MELEE = 0.2, BULLET = 0.2, ENERGY = 1, BIO = 0.2, FIRE = 1, ACID = 0.2) + mineral_rarity = MATERIAL_RARITY_COMMON + points_per_unit = 1 / SHEET_MATERIAL_AMOUNT /datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch @@ -61,10 +67,13 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#e3f1f8" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver + ore_type = /obj/item/stack/ore/silver value_per_unit = 50 / SHEET_MATERIAL_AMOUNT tradable = TRUE tradable_base_quantity = MATERIAL_QUANTITY_UNCOMMON beauty_modifier = 0.075 + mineral_rarity = MATERIAL_RARITY_SEMIPRECIOUS + points_per_unit = 16 / SHEET_MATERIAL_AMOUNT /datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) @@ -79,11 +88,14 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.2 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold + ore_type = /obj/item/stack/ore/gold value_per_unit = 125 / SHEET_MATERIAL_AMOUNT tradable = TRUE tradable_base_quantity = MATERIAL_QUANTITY_RARE beauty_modifier = 0.15 armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, FIRE = 0.7, ACID = 1.1) + mineral_rarity = MATERIAL_RARITY_PRECIOUS + points_per_unit = 18 / SHEET_MATERIAL_AMOUNT /datum/material/gold/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5) @@ -97,6 +109,7 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#71c8f784" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond + ore_type = /obj/item/stack/ore/diamond alpha = 132 starlight_color = COLOR_BLUE_LIGHT value_per_unit = 500 / SHEET_MATERIAL_AMOUNT @@ -104,6 +117,8 @@ Unless you know what you're doing, only use the first three numbers. They're in tradable_base_quantity = MATERIAL_QUANTITY_EXOTIC beauty_modifier = 0.3 armor_modifiers = list(MELEE = 1.3, BULLET = 1.3, LASER = 0.6, ENERGY = 1, BOMB = 1.2, BIO = 1, FIRE = 1, ACID = 1) + mineral_rarity = MATERIAL_RARITY_RARE + points_per_unit = 50 / SHEET_MATERIAL_AMOUNT /datum/material/diamond/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) @@ -117,11 +132,14 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = rgb(48, 237, 26) categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium + ore_type = /obj/item/stack/ore/uranium value_per_unit = 100 / SHEET_MATERIAL_AMOUNT tradable = TRUE tradable_base_quantity = MATERIAL_QUANTITY_RARE beauty_modifier = 0.3 //It shines so beautiful armor_modifiers = list(MELEE = 1.5, BULLET = 1.4, LASER = 0.5, ENERGY = 0.5, FIRE = 1, ACID = 1) + mineral_rarity = MATERIAL_RARITY_SEMIPRECIOUS + points_per_unit = 30 / SHEET_MATERIAL_AMOUNT /datum/material/uranium/on_applied(atom/source, amount, material_flags) . = ..() @@ -154,9 +172,12 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#c162ec" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma + ore_type = /obj/item/stack/ore/plasma value_per_unit = 200 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.15 armor_modifiers = list(MELEE = 1.4, BULLET = 0.7, ENERGY = 1.2, BIO = 1.2, ACID = 0.5) + mineral_rarity = MATERIAL_RARITY_PRECIOUS + points_per_unit = 15 / SHEET_MATERIAL_AMOUNT /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() @@ -186,7 +207,10 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_ITEM_MATERIAL = TRUE) beauty_modifier = 0.5 sheet_type = /obj/item/stack/sheet/bluespace_crystal + ore_type = /obj/item/stack/ore/bluespace_crystal value_per_unit = 300 / SHEET_MATERIAL_AMOUNT + mineral_rarity = MATERIAL_RARITY_RARE + points_per_unit = 50 / SHEET_MATERIAL_AMOUNT tradable = TRUE tradable_base_quantity = MATERIAL_QUANTITY_EXOTIC @@ -203,9 +227,12 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#ffff00" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium + ore_type = /obj/item/stack/ore/bananium value_per_unit = 1000 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.5 armor_modifiers = list(BOMB = 100, FIRE = 10) //Clowns cant be blown away. + mineral_rarity = MATERIAL_RARITY_UNDISCOVERED + points_per_unit = 60 / SHEET_MATERIAL_AMOUNT /datum/material/bananium/on_applied(atom/source, amount, material_flags) . = ..() @@ -231,11 +258,13 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.3 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium + ore_type = /obj/item/stack/ore/titanium value_per_unit = 125 / SHEET_MATERIAL_AMOUNT tradable = TRUE tradable_base_quantity = MATERIAL_QUANTITY_UNCOMMON beauty_modifier = 0.05 armor_modifiers = list(MELEE = 1.35, BULLET = 1.3, LASER = 1.3, ENERGY = 1.25, BOMB = 1.25, BIO = 1, FIRE = 0.7, ACID = 1) + mineral_rarity = MATERIAL_RARITY_SEMIPRECIOUS /datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7) @@ -252,6 +281,8 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 600 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.5 armor_modifiers = list(MELEE = 1.35, BULLET = 2, LASER = 0.5, ENERGY = 1.25, BOMB = 1.25, BIO = 1, FIRE = 1.4, ACID = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. + mineral_rarity = MATERIAL_RARITY_UNDISCOVERED + points_per_unit = 100 / SHEET_MATERIAL_AMOUNT /datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) @@ -265,10 +296,13 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#caccd9" strength_modifier = 0.85 sheet_type = /obj/item/stack/sheet/plastic + ore_type = /obj/item/stack/ore/slag //No plastic or coal ore, so we use slag. categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) value_per_unit = 25 / SHEET_MATERIAL_AMOUNT beauty_modifier = -0.01 armor_modifiers = list(MELEE = 1.5, BULLET = 1.1, LASER = 0.3, ENERGY = 0.5, BOMB = 1, BIO = 1, FIRE = 1.1, ACID = 1) + mineral_rarity = MATERIAL_RARITY_UNDISCOVERED //Nobody's found oil on lavaland yet. + points_per_unit = 4 / SHEET_MATERIAL_AMOUNT /datum/material/plastic/on_accidental_mat_consumption(mob/living/carbon/eater, obj/item/food) eater.reagents.add_reagent(/datum/reagent/plastic_polymers, rand(6, 8)) @@ -328,6 +362,8 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 500 / SHEET_MATERIAL_AMOUNT beauty_modifier = 0.4 armor_modifiers = list(MELEE = 1.5, BULLET = 1.5, LASER = 1.3, ENERGY = 1.3, BOMB = 1, BIO = 1, FIRE = 2.5, ACID = 1) + mineral_rarity = MATERIAL_RARITY_UNDISCOVERED //Doesn't naturally spawn on lavaland. + points_per_unit = 100 / SHEET_MATERIAL_AMOUNT /datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10) @@ -345,6 +381,8 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.2 armor_modifiers = list(MELEE = 1.5, BULLET = 1.5, LASER = 1.5, ENERGY = 1.5, BOMB = 1.5, BIO = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.5 + mineral_rarity = MATERIAL_RARITY_UNDISCOVERED //Doesn't naturally spawn on lavaland. + points_per_unit = 100 / SHEET_MATERIAL_AMOUNT /datum/material/mythril/on_applied_obj(atom/source, amount, material_flags) . = ..() diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index deb55e92ecb..7b69f113f7c 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -53,7 +53,6 @@ /// Martial art on this mind var/datum/martial_art/martial_art - var/static/default_martial_art = new/datum/martial_art /// List of antag datums on this mind var/list/antag_datums /// this mind's ANTAG_HUD should have this icon_state @@ -107,7 +106,6 @@ /datum/mind/New(_key) key = _key - martial_art = default_martial_art init_known_skills() set_assigned_role(SSjob.GetJobType(/datum/job/unassigned)) // Unassigned by default. @@ -181,9 +179,9 @@ new_character.mind.set_current(null) var/mob/living/old_current = current - if(current) + if(old_current) //transfer anyone observing the old character to the new one - current.transfer_observers_to(new_character) + old_current.transfer_observers_to(new_character) // Offload all mind languages from the old holder to a temp one var/datum/language_holder/empty/temp_holder = new() @@ -205,7 +203,7 @@ if(iscarbon(new_character)) var/mob/living/carbon/carbon_character = new_character carbon_character.last_mind = src - transfer_martial_arts(new_character) + RegisterSignal(new_character, COMSIG_LIVING_DEATH, PROC_REF(set_death_time)) if(active || force_key_move) new_character.key = key //now transfer the key to link the client to our new body @@ -214,7 +212,9 @@ new_character.client.init_verbs() // re-initialize character specific verbs SEND_SIGNAL(src, COMSIG_MIND_TRANSFERRED, old_current) - SEND_SIGNAL(current, COMSIG_MOB_MIND_TRANSFERRED_INTO) + SEND_SIGNAL(current, COMSIG_MOB_MIND_TRANSFERRED_INTO, old_current) + if(!isnull(old_current)) + SEND_SIGNAL(old_current, COMSIG_MOB_MIND_TRANSFERRED_OUT_OF, current) //I cannot trust you fucks to do this properly /datum/mind/proc/set_original_character(new_original_character) @@ -517,19 +517,6 @@ usr = current traitor_panel() -/datum/mind/proc/transfer_martial_arts(mob/living/new_character) - if(!ishuman(new_character)) - return - if(martial_art) - if(martial_art.base) //Is the martial art temporary? - martial_art.remove(new_character) - else - martial_art.teach(new_character) - -/datum/mind/proc/has_martialart(string) - if(martial_art && martial_art.id == string) - return martial_art - return FALSE /datum/mind/proc/get_ghost(even_if_they_cant_reenter, ghosts_with_clients) for(var/mob/dead/observer/G in (ghosts_with_clients ? GLOB.player_list : GLOB.dead_mob_list)) diff --git a/code/datums/mood.dm b/code/datums/mood.dm index c500dbaaf45..d3594340a4f 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -139,9 +139,16 @@ * Arguments: * * category - (text) category of the mood event - see /datum/mood_event for category explanation * * type - (path) any /datum/mood_event - * * timeout_mod - (number) /datum/mood_event timeout modifier */ -/datum/mood/proc/add_mood_event(category, type, timeout_mod = 1, ...) +/datum/mood/proc/add_mood_event(category, type, ...) + // we may be passed an instantiated mood datum with a modified timeout + // it is to be used as a vehicle to copy data from and then cleaned up afterwards. + // why do it this way? because the params list may contain numbers, and we may not necessarily want those to be interpreted as a timeout modifier. + // this is only used by the food quality system currently + var/datum/mood_event/mood_to_copy_from + if (istype(type, /datum/mood_event)) + mood_to_copy_from = type + type = mood_to_copy_from.type if (!ispath(type, /datum/mood_event)) CRASH("A non path ([type]), was used to add a mood event. This shouldn't be happening.") if (!istext(category)) @@ -154,8 +161,10 @@ clear_mood_event(category) else if (the_event.timeout) - the_event.timeout = initial(the_event.timeout) * timeout_mod + if (!isnull(mood_to_copy_from)) + the_event.timeout = mood_to_copy_from.timeout addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE)) + qdel(mood_to_copy_from) return // Don't need to update the event. var/list/params = args.Copy(3) @@ -164,8 +173,10 @@ if (QDELETED(the_event)) // the mood event has been deleted for whatever reason (requires a job, etc) return - the_event.timeout *= timeout_mod the_event.category = category + if (!isnull(mood_to_copy_from)) + the_event.timeout = mood_to_copy_from.timeout + qdel(mood_to_copy_from) mood_events[category] = the_event update_mood() diff --git a/code/datums/mood_events/eldritch_painting_events.dm b/code/datums/mood_events/eldritch_painting_events.dm new file mode 100644 index 00000000000..7df89104263 --- /dev/null +++ b/code/datums/mood_events/eldritch_painting_events.dm @@ -0,0 +1,48 @@ +// These mood events are related to /obj/structure/sign/painting/eldritch +// Names are based on the subtype of painting they belong to + +// Mood applied for ripping the painting +/datum/mood_event/eldritch_painting + description = "YOU, I SHOULD NOT HAVE DONE THAT!!!" + mood_change = -6 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/weeping + description = "HE IS HERE, AND HE WEEPS!" + mood_change = -3 + timeout = 11 SECONDS + +/datum/mood_event/eldritch_painting/weeping_heretic + description = "Oh such arts! They truly inspire me!" + mood_change = 5 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/weeping_withdrawl + description = "My mind is clear from his influence." + mood_change = 1 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/desire_heretic + description = "A part gained, the manus takes and gives. What did it take from me?" + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/desire_examine + description = "A hunger kept at bay..." + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/heretic_vines + description = "Oh what a lovely flower!" + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/rust_examine + description = "The rusted climb can wait..." + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/rust_heretic_examine + description = "I must hurry the rusted climb!" + mood_change = 6 + timeout = 3 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index e5f199b47ac..cc3af071eef 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -440,6 +440,16 @@ description = "I've been here too long! I want to go out and explore space!" mood_change = -3 +/datum/mood_event/moon_insanity + description = "THE MOON JUDGES AND FINDS ME WANTING!!!" + mood_change = -3 + timeout = 5 MINUTES + +/datum/mood_event/amulette_insanity + description = "I sEe THe LiGHt, It mUsT BE stOPPed" + mood_change = -6 + timeout = 5 MINUTES + ///Wizard cheesy grand finale - what everyone but the wizard gets /datum/mood_event/madness_despair description = "UNWORTHY, UNWORTHY, UNWORTHY!!!" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 9126f0a090e..8c760e8c4f8 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -372,6 +372,11 @@ mood_change = 2 timeout = 5 MINUTES +/datum/mood_event/moon_smile + description = "THE MOON SHOWS ME THE TRUTH AND ITS SMILE IS FACED TOWARDS ME!!!" + mood_change = 10 + timeout = 2 MINUTES + ///Wizard cheesy grand finale - what the wizard gets /datum/mood_event/madness_elation description = "Madness truly is the greatest of blessings..." diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 6175dd157c4..b560a67aa6c 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -80,9 +80,7 @@ clean_user_client() bar_loc = null - - if(bar) - QDEL_NULL(bar) + bar = null return ..() diff --git a/code/datums/proximity_monitor/fields/projectile_dampener.dm b/code/datums/proximity_monitor/fields/projectile_dampener.dm index 7f625d64524..705ac6bface 100644 --- a/code/datums/proximity_monitor/fields/projectile_dampener.dm +++ b/code/datums/proximity_monitor/fields/projectile_dampener.dm @@ -35,7 +35,6 @@ for(var/obj/projectile/projectile in tracked) if(!(projectile in ranged) || !projectile.loc) release_projectile(projectile) - ..() /datum/proximity_monitor/advanced/projectile_dampener/setup_edge_turf(turf/target) . = ..() diff --git a/code/datums/quirks/negative_quirks/claustrophobia.dm b/code/datums/quirks/negative_quirks/claustrophobia.dm index 9445a312951..bafdcd656ff 100644 --- a/code/datums/quirks/negative_quirks/claustrophobia.dm +++ b/code/datums/quirks/negative_quirks/claustrophobia.dm @@ -1,6 +1,6 @@ /datum/quirk/claustrophobia name = "Claustrophobia" - desc = "You are terrified of small spaces and certain jolly figures. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." + desc = "You are terrified of small spaces. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." // SKYRAT EDIT CHANGE - ORIGINAL: desc = "You are terrified of small spaces and certain jolly figures. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." icon = FA_ICON_BOX_OPEN value = -4 medical_record_text = "Patient demonstrates a fear of tight spaces." @@ -20,14 +20,12 @@ var/nick_spotted = FALSE - /* BUBBERSTATION EDIT BEGIN - REMOVAL OF SANTA CLAUS FEAR - (Genuinely what the fuck this code is so fucking terrible) - +/* SKYRAT EDIT REMOVAL START for(var/mob/living/carbon/human/possible_claus in view(5, quirk_holder)) if(evaluate_jolly_levels(possible_claus)) nick_spotted = TRUE break - BUBBERSTATION EDIT END - REMOVAL OF SANTA CLAUS FEAR */ +SKYRAT EDIT REMOVAL END */ if(!nick_spotted && isturf(quirk_holder.loc)) quirk_holder.clear_mood_event("claustrophobia") diff --git a/code/datums/quirks/neutral_quirks/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm index 573b70cf21b..88923d463f6 100644 --- a/code/datums/quirks/neutral_quirks/transhumanist.dm +++ b/code/datums/quirks/neutral_quirks/transhumanist.dm @@ -39,7 +39,12 @@ calculate_bodypart_score() /datum/quirk/transhumanist/remove() - UnregisterSignal(quirk_holder, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_CARBON_ATTACH_LIMB)) + UnregisterSignal(quirk_holder, list( + COMSIG_CARBON_POST_ATTACH_LIMB, + COMSIG_CARBON_POST_REMOVE_LIMB, + COMSIG_CARBON_GAIN_ORGAN, + COMSIG_CARBON_LOSE_ORGAN, + )) /datum/quirk/transhumanist/proc/get_bodypart_score(mob/living/carbon/target, limbs_only = FALSE) var/organic_bodytypes = 0 diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm deleted file mode 100644 index 2149c5452ea..00000000000 --- a/code/datums/recipe.dm +++ /dev/null @@ -1,119 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * - * /datum/recipe by rastaf0 13 apr 2011 * - * * * * * * * * * * * * * * * * * * * * * * * * * * - * This is powerful and flexible recipe system. - * It exists not only for food. - * supports both reagents and objects as prerequisites. - * In order to use this system you have to define a deriative from /datum/recipe - * * reagents are reagents. Acid, milc, booze, etc. - * * items are objects. Fruits, tools, circuit boards. - * * result is type to create as new object - * * time is optional parameter, you shall use in in your machine, - * default /datum/recipe/ procs does not rely on this parameter. - * - * Functions you need: - * /datum/recipe/proc/make(obj/container as obj) - * Creates result inside container, - * deletes prerequisite reagents, - * transfers reagents from prerequisite objects, - * deletes all prerequisite objects (even not needed for recipe at the moment). - * - * /proc/select_recipe(list/datum/recipe/avaiable_recipes), obj/obj as obj, exact = 1) - * Wonderful function that select suitable recipe for you. - * obj is a machine (or magik hat) with prerequisites, - * exact = 0 forces algorithm to ignore superfluous stuff. - * - * - * Functions you do not need to call directly but could: - * /datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) - * //1=precisely, 0=insufficiently, -1=superfluous - * - * /datum/recipe/proc/check_items(obj/container as obj) - * //1=precisely, 0=insufficiently, -1=superfluous - * - * */ - -/datum/recipe - var/list/reagents_list // example: = list(/datum/reagent/consumable/berryjuice = 5) // do not list same reagent twice - var/list/items // example: =list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo - var/result //example: = /obj/item/food/donut/plain - var/time = 100 // 1/10 part of second - - -/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous - . = 1 - for (var/r_r in reagents_list) - var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r) - if (!(abs(aval_r_amnt - reagents_list[r_r])<0.5)) //if NOT equals - if (aval_r_amnt>reagents_list[r_r]) - . = -1 - else - return 0 - if ((reagents_list?(reagents_list.len):(0)) < avail_reagents.reagent_list.len) - return -1 - return . - -/datum/recipe/proc/check_items(obj/container) //1=precisely, 0=insufficiently, -1=superfluous - if (!items) - if (locate(/obj/) in container) - return -1 - else - return 1 - . = 1 - var/list/checklist = items.Copy() - for (var/obj/O in container) - var/found = 0 - for (var/type in checklist) - if (istype(O,type)) - checklist-=type - found = 1 - break - if (!found) - . = -1 - if (checklist.len) - return 0 - return . - -//general version -/datum/recipe/proc/make(obj/container) - var/obj/result_obj = new result(container) - for (var/obj/O in (container.contents-result_obj)) - O.reagents.trans_to(result_obj, O.reagents.total_volume) - qdel(O) - container.reagents.clear_reagents() - return result_obj - -// food-related -/datum/recipe/proc/make_food(obj/container) - var/obj/result_obj = new result(container) - for (var/obj/O in (container.contents-result_obj)) - if (O.reagents) - O.reagents.del_reagent(/datum/reagent/consumable/nutriment) - O.reagents.trans_to(result_obj, O.reagents.total_volume) - qdel(O) - container.reagents.clear_reagents() - return result_obj - -/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1 as num) - if (!exact) - exact = -1 - var/list/datum/recipe/possible_recipes = new - for (var/datum/recipe/recipe in avaiable_recipes) - if (recipe.check_reagents(obj.reagents) == exact && recipe.check_items(obj) == exact) - possible_recipes+=recipe - if (possible_recipes.len == 0) - return null - else if (possible_recipes.len == 1) - return possible_recipes[1] - else //okay, let's select the most complicated recipe - var/r_count = 0 - var/i_count = 0 - . = possible_recipes[1] - for (var/datum/recipe/recipe in possible_recipes) - var/N_i = (recipe.items)?(recipe.items.len):0 - var/N_r = (recipe.reagents_list)?(recipe.reagents_list.len):0 - if (N_i > i_count || (N_i == i_count && N_r > r_count )) - r_count = N_r - i_count = N_i - . = recipe - return . diff --git a/code/datums/ruins.dm b/code/datums/ruins.dm index 2a7b73d1f7e..703991f596e 100644 --- a/code/datums/ruins.dm +++ b/code/datums/ruins.dm @@ -6,17 +6,27 @@ How is there a wooden container filled with 18th century coinage in the middle of a lavawracked hellscape? \ It is clearly a mystery." - var/unpickable = FALSE //If TRUE these won't be placed automatically (can still be forced or loaded with another ruin) - var/always_place = FALSE //Will skip the whole weighting process and just plop this down, ideally you want the ruins of this kind to have no cost. - var/placement_weight = 1 //How often should this ruin appear - var/cost = 0 //Cost in ruin budget placement system + ///If TRUE these won't be placed automatically (can still be forced or loaded with another ruin) + var/unpickable = FALSE + ///Will skip the whole weighting process and just plop this down, ideally you want the ruins of this kind to have no cost. + var/always_place = FALSE + ///How often should this ruin appear + var/placement_weight = 1 + ///Cost in ruin budget placement system + var/cost = 0 + /// Cost in the ruin budget placement system associated with mineral spawning. We use a different budget for mineral sources like ore vents. For practical use see seedRuins + var/mineral_cost = 0 + /// If TRUE, this ruin can be placed multiple times in the same map var/allow_duplicates = TRUE - var/list/always_spawn_with = null //These ruin types will be spawned along with it (where dependent on the flag) eg list(/datum/map_template/ruin/space/teleporter_space = SPACERUIN_Z) - var/list/never_spawn_with = null //If this ruin is spawned these will not eg list(/datum/map_template/ruin/base_alternate) - + ///These ruin types will be spawned along with it (where dependent on the flag) eg list(/datum/map_template/ruin/space/teleporter_space = SPACERUIN_Z) + var/list/always_spawn_with = null + ///If this ruin is spawned these will not eg list(/datum/map_template/ruin/base_alternate) + var/list/never_spawn_with = null + ///Static part of the ruin path eg "_maps\RandomRuins\LavaRuins\" var/prefix = null + ///The dynamic part of the ruin path eg "lavaland_surface_ruinfile.dmm" var/suffix = null - + ///What flavor or ruin is this? eg ZTRAIT_SPACE_RUINS var/ruin_type = null /datum/map_template/ruin/New() diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index a903d9444f4..452d8bf3578 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -7,7 +7,7 @@ ruin_type = ZTRAIT_ICE_RUINS default_area = /area/icemoon/surface/outdoors/unexplored has_ceiling = TRUE - ceiling_turf = /turf/closed/mineral/random/snow/do_not_chasm + ceiling_turf = /turf/closed/mineral/snowmountain/do_not_chasm ceiling_baseturfs = list(/turf/open/misc/asteroid/snow/icemoon/do_not_chasm) // above ground only @@ -179,3 +179,23 @@ id = "hotsprings" description = "Just relax and take a dip, nothing will go wrong, I swear!" suffix = "icemoon_underground_hotsprings.dmm" + +/datum/map_template/ruin/icemoon/underground/vent + name = "Icemoon Ore Vent" + id = "ore_vent_i" + description = "A vent that spews out ore. Seems to be a natural phenomenon." //Make this a subtype that only spawns medium and large vents. Some smalls will go to the top level. + suffix = "icemoon_underground_ore_vent.dmm" + allow_duplicates = TRUE + cost = 0 + mineral_cost = 1 + always_place = TRUE + +/datum/map_template/ruin/icemoon/ruin/vent + name = "Surface Icemoon Ore Vent" + id = "ore_vent_i" + description = "A vent that spews out ore. Seems to be a natural phenomenon. Smaller than the underground ones." + suffix = "icemoon_surface_ore_vent.dmm" + allow_duplicates = TRUE + cost = 0 + mineral_cost = 1 + always_place = TRUE diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index b3bc5a4dc18..f66d06a4bba 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -287,6 +287,16 @@ allow_duplicates = TRUE cost = 3 +/datum/map_template/ruin/lavaland/vent + name = "Ore Vent" + id = "ore_vent" + description = "A vent that spews out ore. Seems to be a natural phenomenon." + suffix = "lavaland_surface_ore_vent.dmm" + allow_duplicates = TRUE + cost = 0 + mineral_cost = 1 + always_place = TRUE + /datum/map_template/ruin/lavaland/watcher_grave name = "Watchers' Grave" id = "watcher-grave" diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm index 5e8553c69ee..984c0b34ea9 100644 --- a/code/datums/shuttles/emergency.dm +++ b/code/datums/shuttles/emergency.dm @@ -38,7 +38,7 @@ var/path = pick_weight(events) events -= path mobile.event_list.Add(new path(mobile)) - + /datum/map_template/shuttle/emergency/backup prefix = "_maps/shuttles/" suffix = "backup" @@ -146,7 +146,7 @@ suffix = "medisim" name = "Medieval Reality Simulation Dome" description = "A state of the art simulation dome, loaded onto your shuttle! Watch and laugh at how petty humanity used to be before it reached the stars. Guaranteed to be at least 40% historically accurate." - prerequisites = "A special holodeck simulation might allow this shuttle to be loaded." + prerequisites = "A special holodeck simulation must be loaded before this shuttle can be purchased." admin_notes = "Ghosts can spawn in and fight as knights or archers. The CTF auto restarts, so no admin intervention necessary." credit_cost = 20000 occupancy_limit = "30" @@ -275,6 +275,7 @@ admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight. When bought, gives a good influx of money, but can only be bought if the budget is literally 0 credits." movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) occupancy_limit = "30" + prerequisites = "This shuttle is only offered for purchase when the station is low on funds." /datum/map_template/shuttle/emergency/scrapheap/prerequisites_met() return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] @@ -285,7 +286,7 @@ description = "Looks like this shuttle may have wandered into the darkness between the stars on route to the station. Let's not think too hard about where all the bodies came from." admin_notes = "Contains real cult ruins, mob eyeballs, and inactive constructs. Cult mobs will automatically be sentienced by fun balloon. \ Cloning pods in 'medbay' area are showcases and nonfunctional." - prerequisites = "Mysterious cult runes may need to be banished before this shuttle can be summoned." + prerequisites = "A mysterious cult rune will need to be banished before this shuttle can be summoned." credit_cost = 6667 ///The joke is the number so no defines occupancy_limit = "666" @@ -371,6 +372,7 @@ admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone." credit_cost = CARGO_CRATE_VALUE * 30 occupancy_limit = "30" + prerequisites = "This shuttle requires an act of magical polymorphism to occur before it can be purchased." /datum/map_template/shuttle/emergency/wabbajack/prerequisites_met() return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] @@ -485,7 +487,7 @@ name = "Tr%nPo2r& Z3TA" description = "A glitch appears on your monitor, flickering in and out of the options laid before you. \ It seems strange and alien..." - prerequisites = "You may need a special technology to access the signal." + prerequisites = "You will need to research special alien technology to access the signal." admin_notes = "Has alien surgery tools, and a void core that provides unlimited power." credit_cost = CARGO_CRATE_VALUE * 16 occupancy_limit = "xxx" diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index 54a711aaba6..d340a8503d5 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -11,6 +11,8 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) var/trait_processes = FALSE ///Chance relative to other traits of its type to be picked var/weight = 10 + ///The cost of the trait, which is removed from the budget. + var/cost = STATION_TRAIT_COST_FULL ///Whether this trait is always enabled; generally used for debugging var/force = FALSE ///Does this trait show in the centcom report? diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 4d6de5e6951..8ad478e6c83 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -140,7 +140,7 @@ if(is_type_in_list(get_area(coffeemaker), possible_coffeemaker_positions)) return var/list/tables = list() - for(var/turf/area_turf as anything in bridge.get_contained_turfs()) + for(var/turf/area_turf as anything in bridge.get_turfs_from_all_zlevels()) var/obj/structure/table/table = locate() in area_turf if(isnull(table)) continue diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index f73bd480f84..610b79a40f1 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -123,6 +123,7 @@ name = "Cleaned out maintenance" trait_type = STATION_TRAIT_NEGATIVE weight = 5 + cost = STATION_TRAIT_COST_LOW //Most of maints is literal trash anyway show_in_report = TRUE report_message = "Our workers cleaned out most of the junk in the maintenace areas." blacklist = list(/datum/station_trait/filled_maint) @@ -167,6 +168,7 @@ name = "Bot Language Matrix Malfunction" trait_type = STATION_TRAIT_NEGATIVE weight = 4 + cost = STATION_TRAIT_COST_LOW show_in_report = TRUE report_message = "Your station's friendly bots have had their language matrix fried due to an event, resulting in some strange and unfamiliar speech patterns." trait_to_give = STATION_TRAIT_BOTS_GLITCHED @@ -187,6 +189,7 @@ name = "Revenge of Pun Pun" trait_type = STATION_TRAIT_NEGATIVE weight = 2 + cost = STATION_TRAIT_COST_LOW // Way too much is done on atoms SS to be reverted, and it'd look // kinda clunky on round start. It's not impossible to make this work, @@ -319,6 +322,7 @@ report_message = "The space around your station is clouded by heavy pockets of space dust. Expect an increased likelyhood of space dust storms damaging the station hull." trait_type = STATION_TRAIT_NEGATIVE weight = 2 + cost = STATION_TRAIT_COST_LOW event_control_path = /datum/round_event_control/meteor_wave/dust_storm weight_multiplier = 2 max_occurrences_modifier = 3 @@ -378,69 +382,69 @@ /datum/station_trait/revolutionary_trashing/proc/trash_this_place() for(var/area/station/command/area_to_trash in GLOB.areas) + for (var/list/zlevel_turfs as anything in area_to_trash.get_zlevel_turf_lists()) + for (var/turf/current_turf as anything in zlevel_turfs) + if(isclosedturf(current_turf)) + continue + if(prob(25)) + var/obj/effect/decal/cleanable/crayon/created_art + created_art = new(current_turf, RANDOM_COLOUR, pick(trash_talk)) + created_art.pixel_x = rand(-10, 10) + created_art.pixel_y = rand(-10, 10) - for(var/turf/current_turf as anything in area_to_trash.get_contained_turfs()) - if(isclosedturf(current_turf)) - continue - if(prob(25)) - var/obj/effect/decal/cleanable/crayon/created_art - created_art = new(current_turf, RANDOM_COLOUR, pick(trash_talk)) - created_art.pixel_x = rand(-10, 10) - created_art.pixel_y = rand(-10, 10) - - if(prob(0.01)) - new /obj/effect/mob_spawn/corpse/human/assistant(current_turf) - continue - - for(var/atom/current_thing as anything in current_turf.contents) - if(istype(current_thing, /obj/machinery/light) && prob(40)) - var/obj/machinery/light/light_to_smash = current_thing - light_to_smash.break_light_tube(skip_sound_and_sparks = TRUE) + if(prob(0.01)) + new /obj/effect/mob_spawn/corpse/human/assistant(current_turf) continue - if(istype(current_thing, /obj/structure/window)) - if(prob(15)) - current_thing.take_damage(rand(30, 90)) - continue + for(var/atom/current_thing as anything in current_turf.contents) + if(istype(current_thing, /obj/machinery/light) && prob(40)) + var/obj/machinery/light/light_to_smash = current_thing + light_to_smash.break_light_tube(skip_sound_and_sparks = TRUE) + continue - if(istype(current_thing, /obj/structure/table) && prob(40)) - current_thing.take_damage(100) - continue + if(istype(current_thing, /obj/structure/window)) + if(prob(15)) + current_thing.take_damage(rand(30, 90)) + continue - if(istype(current_thing, /obj/structure/chair) && prob(60)) - current_thing.take_damage(150) - continue + if(istype(current_thing, /obj/structure/table) && prob(40)) + current_thing.take_damage(100) + continue - if(istype(current_thing, /obj/machinery/computer) && prob(30)) - if(istype(current_thing, /obj/machinery/computer/communications)) - continue //To prevent the shuttle from getting autocalled at the start of the round - current_thing.take_damage(160) - continue + if(istype(current_thing, /obj/structure/chair) && prob(60)) + current_thing.take_damage(150) + continue - if(istype(current_thing, /obj/machinery/vending) && prob(45)) - var/obj/machinery/vending/vendor_to_trash = current_thing - if(prob(50)) - vendor_to_trash.tilt(get_turf(vendor_to_trash), 0) // crit effects can do some real weird shit, lets disable it + if(istype(current_thing, /obj/machinery/computer) && prob(30)) + if(istype(current_thing, /obj/machinery/computer/communications)) + continue //To prevent the shuttle from getting autocalled at the start of the round + current_thing.take_damage(160) + continue - if(prob(50)) - vendor_to_trash.take_damage(150) - continue + if(istype(current_thing, /obj/machinery/vending) && prob(45)) + var/obj/machinery/vending/vendor_to_trash = current_thing + if(prob(50)) + vendor_to_trash.tilt(get_turf(vendor_to_trash), 0) // crit effects can do some real weird shit, lets disable it - if(istype(current_thing, /obj/structure/fireaxecabinet)) //A staple of revolutionary behavior - current_thing.take_damage(90) - continue + if(prob(50)) + vendor_to_trash.take_damage(150) + continue - if(istype(current_thing, /obj/item/bedsheet/captain)) - new /obj/item/bedsheet/rev(current_thing.loc) - qdel(current_thing) - continue + if(istype(current_thing, /obj/structure/fireaxecabinet)) //A staple of revolutionary behavior + current_thing.take_damage(90) + continue - if(istype(current_thing, /obj/item/bedsheet/captain/double)) - new /obj/item/bedsheet/rev/double(current_thing.loc) - qdel(current_thing) - continue + if(istype(current_thing, /obj/item/bedsheet/captain)) + new /obj/item/bedsheet/rev(current_thing.loc) + qdel(current_thing) + continue - CHECK_TICK + if(istype(current_thing, /obj/item/bedsheet/captain/double)) + new /obj/item/bedsheet/rev/double(current_thing.loc) + qdel(current_thing) + continue + + CHECK_TICK ///Station traits that influence the space background and apply some unique effects! /datum/station_trait/nebula diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 5d49155a3c1..f12f9bed855 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -1,7 +1,9 @@ +///This station traits gives 5 bananium sheets to the clown (and every dead clown out there in deep space or lavaland). /datum/station_trait/bananium_shipment name = "Bananium Shipment" trait_type = STATION_TRAIT_NEUTRAL weight = 5 + cost = STATION_TRAIT_COST_LOW report_message = "Rumors has it that the clown planet has been sending support packages to clowns in this system." trait_to_give = STATION_TRAIT_BANANIUM_SHIPMENTS @@ -9,6 +11,7 @@ name = "Unnatural atmospherical properties" trait_type = STATION_TRAIT_NEUTRAL weight = 5 + cost = STATION_TRAIT_COST_LOW show_in_report = TRUE report_message = "System's local planet has irregular atmospherical properties." trait_to_give = STATION_TRAIT_UNNATURAL_ATMOSPHERE @@ -42,6 +45,7 @@ trait_type = STATION_TRAIT_NEUTRAL weight = 5 show_in_report = FALSE + cost = STATION_TRAIT_COST_LOW report_message = "Ian has gone exploring somewhere in the station." /datum/station_trait/ian_adventure/on_round_start() @@ -99,8 +103,9 @@ /datum/station_trait/glitched_pdas name = "PDA glitch" trait_type = STATION_TRAIT_NEUTRAL - weight = 15 + weight = 10 show_in_report = TRUE + cost = STATION_TRAIT_COST_MINIMAL report_message = "Something seems to be wrong with the PDAs issued to you all this shift. Nothing too bad though." trait_to_give = STATION_TRAIT_PDA_GLITCHED @@ -133,7 +138,9 @@ trait_type = STATION_TRAIT_NEUTRAL weight = 10 show_in_report = TRUE + cost = STATION_TRAIT_COST_MINIMAL report_message = "Due to a shortage in standard issue jumpsuits, we have provided your assistants with one of our backup supplies." + blacklist = list(/datum/station_trait/assistant_gimmicks) /datum/station_trait/colored_assistants/New() . = ..() @@ -276,6 +283,7 @@ name = "Scarves" trait_type = STATION_TRAIT_NEUTRAL weight = 10 + cost = STATION_TRAIT_COST_MINIMAL show_in_report = TRUE var/list/scarves @@ -309,6 +317,7 @@ trait_type = STATION_TRAIT_NEUTRAL show_in_report = TRUE weight = 10 + cost = STATION_TRAIT_COST_MINIMAL report_message = "It has become temporarily fashionable to use a wallet, so everyone on the station has been issued one." /datum/station_trait/wallets/New() diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 4ed552fa393..4a21d25f884 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -54,6 +54,7 @@ name = "Bountiful bounties" trait_type = STATION_TRAIT_POSITIVE weight = 5 + cost = STATION_TRAIT_COST_LOW show_in_report = TRUE report_message = "It seems collectors in this system are extra keen to on bounties, and will pay more to see their completion." @@ -68,7 +69,6 @@ report_message = "Prices are low in this system, BUY BUY BUY!" blacklist = list(/datum/station_trait/distant_supply_lines) - /datum/station_trait/strong_supply_lines/on_round_start() SSeconomy.pack_price_modifier *= 0.8 @@ -76,6 +76,7 @@ name = "Filled up maintenance" trait_type = STATION_TRAIT_POSITIVE weight = 5 + cost = STATION_TRAIT_COST_LOW show_in_report = TRUE report_message = "Our workers accidentally forgot more of their personal belongings in the maintenace areas." blacklist = list(/datum/station_trait/empty_maint) @@ -176,14 +177,12 @@ report_message = "All members of the station have received an implant to notify each other if one of them dies. This should help improve job-safety!" var/datum/deathrattle_group/deathrattle_group - /datum/station_trait/deathrattle_all/New() . = ..() deathrattle_group = new("station group") blacklist = subtypesof(/datum/station_trait/deathrattle_department) RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) - /datum/station_trait/deathrattle_all/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client) SIGNAL_HANDLER @@ -280,6 +279,7 @@ name = "Advanced Medbots" trait_type = STATION_TRAIT_POSITIVE weight = 5 + cost = STATION_TRAIT_COST_LOW show_in_report = TRUE report_message = "Your station's medibots have received a hardware upgrade, enabling expanded healing capabilities." trait_to_give = STATION_TRAIT_MEDBOT_MANIA @@ -316,6 +316,7 @@ report_message = "A repair technician left their wallet in a locker somewhere. They would greatly appreciate if you could locate and return it to them when the shift has ended." trait_type = STATION_TRAIT_POSITIVE weight = 5 + cost = STATION_TRAIT_COST_LOW show_in_report = TRUE /datum/station_trait/missing_wallet/on_round_start() @@ -350,5 +351,15 @@ trim_state = "trim_stationengineer" department_color = COLOR_ASSISTANT_GRAY +/// Spawns assistants with some gear, either gimmicky or functional. Maybe, one day, it will inspire an assistant to do something productive or fun +/datum/station_trait/assistant_gimmicks + name = "Geared Assistants Pilot" + report_message = "The Nanotrassen Assistant Affairs division is performing a pilot to see if different assistant equipments help improve productivity!" + trait_type = STATION_TRAIT_POSITIVE + weight = 3 + trait_to_give = STATION_TRAIT_ASSISTANT_GIMMICKS + show_in_report = TRUE + blacklist = list(/datum/station_trait/colored_assistants) + #undef PARTY_COOLDOWN_LENGTH_MIN #undef PARTY_COOLDOWN_LENGTH_MAX diff --git a/code/datums/status_effects/debuffs/hooked.dm b/code/datums/status_effects/debuffs/hooked.dm new file mode 100644 index 00000000000..9280303209a --- /dev/null +++ b/code/datums/status_effects/debuffs/hooked.dm @@ -0,0 +1,63 @@ +///Status effect applied when casting a fishing rod at someone, provided the attached fishing hook allows it. +/datum/status_effect/grouped/hooked + id = "hooked" + duration = -1 + tick_interval = -1 + status_type = STATUS_EFFECT_MULTIPLE + alert_type = /atom/movable/screen/alert/status_effect/hooked + +/datum/status_effect/grouped/hooked/proc/try_unhook() + return do_after(owner, 2 SECONDS, timed_action_flags = IGNORE_USER_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(still_exists)), interaction_key = DOAFTER_SOURCE_REMOVING_HOOK) + +/datum/status_effect/grouped/hooked/proc/still_exists() + return !QDELETED(src) + +/datum/status_effect/grouped/hooked/on_creation(mob/living/new_owner, datum/beam/fishing_line/source) + . = ..() + if(!.) //merged with an existing effect + return + RegisterSignal(source, COMSIG_QDELETING, PROC_REF(on_fishing_line_deleted)) + +/datum/status_effect/grouped/hooked/merge_with_existing(datum/status_effect/grouped/hooked/existing, datum/beam/fishing_line/source) + existing.RegisterSignal(source, COMSIG_QDELETING, PROC_REF(on_fishing_line_deleted)) + +/datum/status_effect/grouped/hooked/proc/on_fishing_line_deleted(datum/source) + SIGNAL_HANDLER + owner.remove_status_effect(type, source) + +/atom/movable/screen/alert/status_effect/hooked + name = "Snagged By Hook" + desc = "You're being caught like a fish by some asshat! Click to safely remove the hook or move away far enough to snap it off." + icon_state = "hooked" + +/atom/movable/screen/alert/status_effect/hooked/Click() + if(!owner.can_resist()) + return + owner.balloon_alert(owner, "removing hook...") + var/datum/status_effect/grouped/hooked/effect = owner.has_status_effect(attached_effect.type) + if(!effect.try_unhook()) + return + owner.balloon_alert(owner, "hook removed") + var/datum/beam/fishing_line/rand_source = pick(effect.sources) + qdel(rand_source) + +///Version used by the jawed fishing hook, which also applies slowdown +/datum/status_effect/grouped/hooked/jaws + id = "hooked_jaws" + alert_type = /atom/movable/screen/alert/status_effect/hooked/jaws + +/datum/status_effect/grouped/hooked/jaws/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/hook_jawed) + +/datum/status_effect/grouped/hooked/jaws/on_remove() + . = ..() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/hook_jawed) + +/datum/status_effect/grouped/hooked/jaws/try_unhook() + return do_after(owner, 10 SECONDS, extra_checks = CALLBACK(src, PROC_REF(still_exists)), interaction_key = DOAFTER_SOURCE_REMOVING_HOOK) + +/atom/movable/screen/alert/status_effect/hooked/jaws + name = "Snagged By Jaws" + desc = "You've been snagged by some sort of beartrap-slash-fishing-hook-gizmo! Click to safely remove the hook or move away far enough to snap it off." + icon_state = "hooked_jaws" diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm index 0ffde66b1f1..89cf4943c19 100644 --- a/code/datums/status_effects/debuffs/staggered.dm +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -10,7 +10,7 @@ /datum/status_effect/staggered/on_apply() //you can't stagger the dead. - if(owner.stat == DEAD) + if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_NO_STAGGER)) return FALSE RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_staggered)) @@ -31,10 +31,12 @@ /datum/status_effect/staggered/tick(seconds_between_ticks) //you can't stagger the dead - in case somehow you die mid-stagger - if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_FAKEDEATH)) + if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_NO_STAGGER)) + qdel(src) return - else - owner.do_stagger_animation() + if(HAS_TRAIT(owner, TRAIT_FAKEDEATH)) + return + owner.do_stagger_animation() /// Helper proc that causes the mob to do a stagger animation. /// Doesn't change significantly, just meant to represent swaying back and forth diff --git a/code/datums/status_effects/grouped_effect.dm b/code/datums/status_effects/grouped_effect.dm index ade0a187e0d..601945b83aa 100644 --- a/code/datums/status_effects/grouped_effect.dm +++ b/code/datums/status_effects/grouped_effect.dm @@ -9,12 +9,16 @@ var/datum/status_effect/grouped/existing = new_owner.has_status_effect(type) if(existing) existing.sources |= source + merge_with_existing(existing, source) qdel(src) return FALSE sources |= source return ..() +/datum/status_effect/grouped/proc/merge_with_existing(datum/status_effect/grouped/existing, source) + return + /datum/status_effect/grouped/before_remove(source) sources -= source return !length(sources) diff --git a/code/datums/stock_market_events.dm b/code/datums/stock_market_events.dm new file mode 100644 index 00000000000..81142d23002 --- /dev/null +++ b/code/datums/stock_market_events.dm @@ -0,0 +1,115 @@ +/datum/stock_market_event + /// The name of the event, used to describe it in the news. + var/name = "Stock Market Event!" + /// A list of company names to use for the event and the circumstance. + var/static/list/company_name = list( + "Nakamura Engineering", + "Robust Industries, LLC", + "MODular Solutions", + "SolGov", + "Australicus Industrial Mining", + "Vey-Medical", + "Aussec Armory", + "Dreamland Robotics" + ) + /// A list of strings selected from the event that's used to describe the event in the news. + var/list/circumstance = list() + /// What material is affected by the event? + var/datum/material/mat + /// Constant to multiply the original material value by to get the new minimum value, unless the material has a minimum override. + var/price_minimum = SHEET_MATERIAL_AMOUNT * 0.5 + /// Constant to multiply the original material value by to get the new maximum value. + var/price_maximum = SHEET_MATERIAL_AMOUNT * 3 + + /// When this event is ongoing, what direction will the price trend in? + var/trend_value + /// When this event is triggered, for how long will it's effects last? + var/trend_duration + +/** + * When a new stock_market_event is created, this proc is called to set up the event if there's anything that needs to happen upon it starting. + * @param _mat The material that this event will affect. + */ +/datum/stock_market_event/proc/start_event(datum/material/mat) + if(istype(mat, /datum/material)) + return FALSE + src.mat = mat + if(!isnull(trend_value)) + SSstock_market.materials_trends[mat] = trend_value + if(!isnull(trend_duration)) + SSstock_market.materials_trend_life[mat] = trend_duration + return TRUE + +/** + * This proc is called every tick while the event is ongoing by SSstock_market. + */ +/datum/stock_market_event/proc/handle() + trend_duration-- + if(trend_duration <= 0) + end_event() + return + +/** + * When a stock_market_event is ended, this proc is called to apply any final effects and clean up anything that needs to be cleaned up. + */ +/datum/stock_market_event/proc/end_event() + SSstock_market.active_events -= src + qdel(src) + +/** + * This proc is called to create a news string for the event, which is passed along to SSstock_market to be appended to the automatic newscaster messages. + */ +/datum/stock_market_event/proc/create_news() + var/temp_company = pick(company_name) + var/temp_circumstance = pick(circumstance) + SSstock_market.news_string += "[name] [temp_company] [temp_circumstance][mat.name].
" + + +/datum/stock_market_event/market_reset + name = "Market Reset!" + trend_value = MARKET_TREND_STABLE + trend_duration = 1 + circumstance = list( + "was purchased by a private investment firm, resetting the price of ", + "restructured, resetting the price of ", + "has been rolled into a larger company, resetting the price of ", + ) + +/datum/stock_market_event/market_reset/start_event() + . = ..() + SSstock_market.materials_prices[mat] = (initial(mat.value_per_unit)) * SHEET_MATERIAL_AMOUNT + create_news() + +/datum/stock_market_event/large_boost + name = "Large Boost!" + trend_value = MARKET_TREND_UPWARD + trend_duration = 3 + circumstance = list( + "has just released a new product that raised the price of ", + "discovered a new valuable use for ", + "has produced a report that raised the price of ", + ) + +/datum/stock_market_event/large_boost/start_event() + . = ..() + var/price_units = SSstock_market.materials_prices[mat] + SSstock_market.materials_prices[mat] += round(gaussian(price_units * 0.5, price_units * 0.1)) + SSstock_market.materials_prices[mat] = clamp(SSstock_market.materials_prices[mat], price_minimum * mat.value_per_unit, price_maximum * mat.value_per_unit) + create_news() + +/datum/stock_market_event/large_drop + name = "Large Drop!" + trend_value = MARKET_TREND_DOWNWARD + trend_duration = 5 + circumstance = list( + "'s latest product has seen major controversy, and resulted in a price drop for ", + "has been hit with a major lawsuit, resulting in a price drop for ", + "has produced a report that lowered the price of ", + ) + +/datum/stock_market_event/large_drop/start_event() + . = ..() + var/price_units = SSstock_market.materials_prices[mat] + SSstock_market.materials_prices[mat] -= round(gaussian(price_units * 1.5, price_units * 0.1)) + SSstock_market.materials_prices[mat] = clamp(SSstock_market.materials_prices[mat], price_minimum * mat.value_per_unit, price_maximum * mat.value_per_unit) + create_news() diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm index 1be31c33d2a..052af9d060b 100644 --- a/code/datums/voice_of_god_command.dm +++ b/code/datums/voice_of_god_command.dm @@ -295,8 +295,13 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) /datum/voice_of_god_command/say_my_name/execute(list/listeners, mob/living/user, power_multiplier = 1, message) var/iteration = 1 + var/regex/smartass_regex = regex(@"^say my name[.!]*$") for(var/mob/living/target as anything in listeners) - addtimer(CALLBACK(target, TYPE_PROC_REF(/atom/movable, say), user.name), 0.5 SECONDS * iteration) + var/to_say = user.name + // 0.1% chance to be a smartass + if(findtext(lowertext(message), smartass_regex) && prob(0.1)) + to_say = "My name" + addtimer(CALLBACK(target, TYPE_PROC_REF(/atom/movable, say), to_say), 0.5 SECONDS * iteration) iteration++ /// This command forces the listeners to say "Who's there?". diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 08c88cd65f1..aa8ee4d090a 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -87,7 +87,7 @@ /// Used by the radioactive nebula when the station doesnt have enough shielding /datum/weather/rad_storm/nebula - protected_areas = list(/area/shuttle) + protected_areas = list(/area/shuttle, /area/station/maintenance/radshelter) weather_overlay = "nebula_radstorm" weather_duration_lower = 100 HOURS diff --git a/code/datums/wires/brm.dm b/code/datums/wires/brm.dm new file mode 100644 index 00000000000..c00d7875035 --- /dev/null +++ b/code/datums/wires/brm.dm @@ -0,0 +1,14 @@ +/datum/wires/brm + holder_type = /obj/machinery/bouldertech/brm + proper_name = "Boulder Retrieval Matrix" + +/datum/wires/brm/New(atom/holder) + add_duds(1) + return ..() + +/datum/wires/brm/on_pulse(wire) + var/obj/machinery/bouldertech/brm/brm_holder = holder + if(brm_holder.panel_open) + return + brm_holder.toggle_auto_on() + diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 2e655018517..18d710ca0d3 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -129,8 +129,7 @@ if(0) to_chat(victim, span_deadsay("The last of the nerve endings in your [limb.plaintext_zone] wither away, as the infection completely paralyzes your joint connector.")) threshold_penalty = 120 // piss easy to destroy - var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone) - victim.gain_trauma(sepsis) + set_disabling(TRUE) /datum/wound/burn/flesh/get_wound_description(mob/user) if(strikes_to_lose_limb <= 0) diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm new file mode 100644 index 00000000000..f73f263ff50 --- /dev/null +++ b/code/datums/wounds/cranial_fissure.dm @@ -0,0 +1,129 @@ +/datum/wound_pregen_data/cranial_fissure + wound_path_to_generate = /datum/wound/cranial_fissure + required_limb_biostate = BIO_BONE + + required_wounding_types = list(WOUND_ALL) + + wound_series = WOUND_SERIES_CRANIAL_FISSURE + + threshold_minimum = 150 + weight = 10 + + viable_zones = list(BODY_ZONE_HEAD) + +/datum/wound_pregen_data/cranial_fissure/get_weight(obj/item/bodypart/limb, woundtype, damage, attack_direction, damage_source) + if (limb.owner?.stat < HARD_CRIT) + return 0 + + return ..() + +/// A wound applied when receiving significant enough damage to the head. +/// Will allow other players to take your eyes out of your head, and slipping +/// will cause your brain to fall out of your head. +/datum/wound/cranial_fissure + name = "Cranial Fissure" + desc = "Patient's crown is agape, revealing severe damage to the skull." + treat_text = "Immediate surgical reconstruction of the skull." + examine_desc = "is split open" + occur_text = "is split into two separated chunks" + + simple_desc = "Patient's skull is split open." + threshold_penalty = 40 + + severity = WOUND_SEVERITY_CRITICAL + sound_effect = 'sound/effects/dismember.ogg' + +#define CRANIAL_FISSURE_FILTER_DISPLACEMENT "cranial_fissure_displacement" + +/datum/wound/cranial_fissure/wound_injury(datum/wound/old_wound = null, attack_direction = null) + ADD_TRAIT(limb, TRAIT_IMMUNE_TO_CRANIAL_FISSURE, type) + ADD_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type) + + victim.add_filter(CRANIAL_FISSURE_FILTER_DISPLACEMENT, 2, displacement_map_filter(icon('icons/effects/cranial_fissure.dmi', "displacement"), size = 3)) + + RegisterSignal(victim, COMSIG_MOB_SLIPPED, PROC_REF(on_owner_slipped)) + +/datum/wound/cranial_fissure/remove_wound(ignore_limb, replaced) + REMOVE_TRAIT(limb, TRAIT_IMMUNE_TO_CRANIAL_FISSURE, type) + REMOVE_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type) + + victim.remove_filter(CRANIAL_FISSURE_FILTER_DISPLACEMENT) + + UnregisterSignal(victim, COMSIG_MOB_SLIPPED) + + return ..() + +/datum/wound/cranial_fissure/proc/on_owner_slipped(mob/source) + SIGNAL_HANDLER + + if (source.stat == DEAD) + return + + var/obj/item/organ/internal/brain/brain = source.get_organ_by_type(/obj/item/organ/internal/brain) + if (isnull(brain)) + return + + brain.Remove(source) + + var/turf/source_turf = get_turf(source) + brain.forceMove(source_turf) + brain.throw_at(get_step(source_turf, source.dir), 1, 1) + + source.visible_message( + span_boldwarning("[source]'s brain spills right out of [source.p_their()] head!"), + span_userdanger("Your brain spills right out of your head!"), + ) + +/datum/wound/cranial_fissure/try_handling(mob/living/carbon/human/user) + if (user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES) + return FALSE + + if (victim.body_position != LYING_DOWN) + return FALSE + + var/obj/item/organ/internal/eyes/eyes = victim.get_organ_by_type(/obj/item/organ/internal/eyes) + if (isnull(eyes)) + victim.balloon_alert(user, "no eyes to take!") + return TRUE + + playsound(victim, 'sound/surgery/organ2.ogg', 50, TRUE) + victim.balloon_alert(user, "pulling out eyes...") + user.visible_message( + span_boldwarning("[user] reaches inside [victim]'s skull..."), + ignored_mobs = user + ) + victim.show_message( + span_userdanger("[victim] starts to pull out your eyes!"), + MSG_VISUAL, + span_userdanger("An arm reaches inside your brain, and starts pulling on your eyes!"), + ) + + if (!do_after(user, 10 SECONDS, victim, extra_checks = CALLBACK(src, PROC_REF(still_has_eyes), eyes))) + return TRUE + + eyes.Remove(victim) + user.put_in_hands(eyes) + + log_combat(user, victim, "pulled out the eyes of") + + playsound(victim, 'sound/surgery/organ1.ogg', 75, TRUE) + user.visible_message( + span_boldwarning("[user] rips out [victim]'s eyes!"), + span_boldwarning("You rip out [victim]'s eyes!"), + ignored_mobs = victim, + ) + + victim.show_message( + span_userdanger("[user] rips out your eyes!"), + MSG_VISUAL, + span_userdanger("You feel an arm yank from inside your head, as you feel something very important is missing!"), + ) + + return TRUE + +/datum/wound/cranial_fissure/proc/still_has_eyes(obj/item/organ/internal/eyes/eyes) + PRIVATE_PROC(TRUE) + + return victim?.get_organ_by_type(/obj/item/organ/internal/eyes) == eyes + +#undef CRANIAL_FISSURE_FILTER_DISPLACEMENT diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index e6002412339..c5ea5ff66e2 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -13,14 +13,16 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING - /// List of all turfs currently inside this area. Acts as a filtered bersion of area.contents - /// For faster lookup (area.contents is actually a filtered loop over world) + /// List of all turfs currently inside this area as nested lists indexed by zlevel. + /// Acts as a filtered version of area.contents For faster lookup + /// (area.contents is actually a filtered loop over world) /// Semi fragile, but it prevents stupid so I think it's worth it - var/list/turf/contained_turfs = list() - /// Contained turfs is a MASSIVE list, so rather then adding/removing from it each time we have a problem turf + var/list/list/turf/turfs_by_zlevel = list() + /// turfs_by_z_level can hold MASSIVE lists, so rather then adding/removing from it each time we have a problem turf /// We should instead store a list of turfs to REMOVE from it, then hook into a getter for it /// There is a risk of this and contained_turfs leaking, so a subsystem will run it down to 0 incrementally if it gets too large - var/list/turf/turfs_to_uncontain = list() + /// This uses the same nested list format as turfs_by_zlevel + var/list/list/turf/turfs_to_uncontain_by_zlevel = list() var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED @@ -224,24 +226,94 @@ GLOBAL_LIST_EMPTY(teleportlocs) turfs += T map_generator.generate_terrain(turfs, src) -/area/proc/get_contained_turfs() - if(length(turfs_to_uncontain)) +/// Returns the highest zlevel that this area contains turfs for +/area/proc/get_highest_zlevel() + for (var/area_zlevel in length(turfs_by_zlevel) to 1 step -1) + if (length(turfs_to_uncontain_by_zlevel) >= area_zlevel) + if (length(turfs_by_zlevel[area_zlevel]) - length(turfs_to_uncontain_by_zlevel[area_zlevel]) > 0) + return area_zlevel + else + if (length(turfs_by_zlevel[area_zlevel])) + return area_zlevel + return 0 + +/// Returns a nested list of lists with all turfs split by zlevel. +/// only zlevels with turfs are returned. The order of the list is not guaranteed. +/area/proc/get_zlevel_turf_lists() + if(length(turfs_to_uncontain_by_zlevel)) cannonize_contained_turfs() - return contained_turfs + + var/list/zlevel_turf_lists = list() + + for (var/list/zlevel_turfs as anything in turfs_by_zlevel) + if (length(zlevel_turfs)) + zlevel_turf_lists += list(zlevel_turfs) + + return zlevel_turf_lists + +/// Returns a list with all turfs in this zlevel. +/area/proc/get_turfs_by_zlevel(zlevel) + if (length(turfs_to_uncontain_by_zlevel) >= zlevel && length(turfs_to_uncontain_by_zlevel[zlevel])) + cannonize_contained_turfs_by_zlevel(zlevel) + + if (length(turfs_by_zlevel) < zlevel) + return list() + + return turfs_by_zlevel[zlevel] + + +/// Merges a list containing all of the turfs zlevel lists from get_zlevel_turf_lists inside one list. Use get_zlevel_turf_lists() or get_turfs_by_zlevel() unless you need all the turfs in one list to avoid generating large lists +/area/proc/get_turfs_from_all_zlevels() + . = list() + for (var/list/zlevel_turfs as anything in get_zlevel_turf_lists()) + . += zlevel_turfs /// Ensures that the contained_turfs list properly represents the turfs actually inside us -/area/proc/cannonize_contained_turfs() +/area/proc/cannonize_contained_turfs_by_zlevel(zlevel_to_clean, _autoclean = TRUE) // This is massively suboptimal for LARGE removal lists // Try and keep the mass removal as low as you can. We'll do this by ensuring // We only actually add to contained turfs after large changes (Also the management subsystem) // Do your damndest to keep turfs out of /area/space as a stepping stone - // That sucker gets HUGE and will make this take actual tens of seconds if you stuff turfs_to_uncontain - contained_turfs -= turfs_to_uncontain - turfs_to_uncontain = list() + // That sucker gets HUGE and will make this take actual seconds + if (zlevel_to_clean <= length(turfs_by_zlevel) && zlevel_to_clean <= length(turfs_to_uncontain_by_zlevel)) + turfs_by_zlevel[zlevel_to_clean] -= turfs_to_uncontain_by_zlevel[zlevel_to_clean] + + if (!_autoclean) // Removes empty lists from the end of this list + turfs_to_uncontain_by_zlevel[zlevel_to_clean] = list() + return + + var/new_length = length(turfs_to_uncontain_by_zlevel) + // Walk backwards thru the list + for (var/i in length(turfs_to_uncontain_by_zlevel) to 0 step -1) + if (i && length(turfs_to_uncontain_by_zlevel[i])) + break // Stop the moment we find a useful list + new_length = i + + if (new_length < length(turfs_to_uncontain_by_zlevel)) + turfs_to_uncontain_by_zlevel.len = new_length + + if (new_length >= zlevel_to_clean) + turfs_to_uncontain_by_zlevel[zlevel_to_clean] = list() + + +/// Ensures that the contained_turfs list properly represents the turfs actually inside us +/area/proc/cannonize_contained_turfs() + for (var/area_zlevel in 1 to length(turfs_to_uncontain_by_zlevel)) + cannonize_contained_turfs_by_zlevel(area_zlevel, _autoclean = FALSE) + + turfs_to_uncontain_by_zlevel = list() + /// Returns TRUE if we have contained turfs, FALSE otherwise /area/proc/has_contained_turfs() - return length(contained_turfs) - length(turfs_to_uncontain) > 0 + for (var/area_zlevel in 1 to length(turfs_by_zlevel)) + if (length(turfs_to_uncontain_by_zlevel) >= area_zlevel) + if (length(turfs_by_zlevel[area_zlevel]) - length(turfs_to_uncontain_by_zlevel[area_zlevel]) > 0) + return TRUE + else + if (length(turfs_by_zlevel[area_zlevel])) + return TRUE + return FALSE /** * Register this area as belonging to a z level @@ -286,8 +358,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) air_vents = null air_scrubbers = null //turf cleanup - contained_turfs = null - turfs_to_uncontain = null + turfs_by_zlevel = null + turfs_to_uncontain_by_zlevel = null //parent cleanup return ..() @@ -464,8 +536,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) ///Tries to play looping ambience to the mobs. /mob/proc/refresh_looping_ambience() - SIGNAL_HANDLER - var/area/my_area = get_area(src) if(!(client?.prefs.read_preference(/datum/preference/toggle/sound_ship_ambience)) || !my_area.ambient_buzz) @@ -521,8 +591,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(outdoors) return FALSE areasize = 0 - for(var/turf/open/T in get_contained_turfs()) - areasize++ + for(var/list/zlevel_turfs as anything in get_zlevel_turf_lists()) + for(var/turf/open/thisvarisunused in zlevel_turfs) + areasize++ /** * Causes a runtime error diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index e6c4224c820..8aa6adc738c 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -34,6 +34,7 @@ static_lighting = FALSE base_lighting_alpha = 255 has_gravity = STANDARD_GRAVITY + ambient_buzz = null /area/misc/testroom requires_power = FALSE diff --git a/code/game/area/areas/station/cargo.dm b/code/game/area/areas/station/cargo.dm index faa9f2f6299..323a564c495 100644 --- a/code/game/area/areas/station/cargo.dm +++ b/code/game/area/areas/station/cargo.dm @@ -53,3 +53,7 @@ /area/station/cargo/miningoffice name = "\improper Mining Office" icon_state = "mining" + +/area/station/cargo/miningfoundry + name = "\improper Mining Foundry" + icon_state = "mining_foundry" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 0c0b4ba36a1..96c0846578f 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -296,7 +296,7 @@ if(mobile_docking_port.launch_status != check_for_launch_status) continue for(var/area/shuttle/shuttle_area as anything in mobile_docking_port.shuttle_areas) - if(current_turf in shuttle_area.get_contained_turfs()) + if(shuttle_area == current_turf.loc) return TRUE return FALSE diff --git a/code/game/atom/atom_defense.dm b/code/game/atom/atom_defense.dm index 409b5a9e40b..d2280fd2b59 100644 --- a/code/game/atom/atom_defense.dm +++ b/code/game/atom/atom_defense.dm @@ -126,7 +126,7 @@ /atom/proc/hulk_damage() return 150 //the damage hulks do on punches to this atom, is affected by melee armor -/atom/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime +/atom/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal if(!uses_integrity) CRASH("unimplemented /atom/proc/attack_generic()!") user.do_attack_animation(src) diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index a00f485391d..131aa6c8e9c 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -43,7 +43,7 @@ if(reagents.flags & TRANSPARENT) if(reagents.total_volume) . += "It contains [reagents.total_volume] units of various reagents[user_sees_reagents ? ":" : "."]" - if(user_sees_reagents) //Show each individual reagent for detailed examination + if(user_sees_reagents || (reagent_sigreturn & ALLOW_GENERIC_REAGENT_EXAMINE)) //Show each individual reagent for detailed examination for(var/datum/reagent/current_reagent as anything in reagents.reagent_list) . += "• [round(current_reagent.volume, CHEMICAL_VOLUME_ROUNDING)] units of [current_reagent.name]" if(reagents.is_reacting) @@ -108,3 +108,7 @@ ///Used to insert text after the name but before the description in examine() /atom/proc/get_name_chaser(mob/user, list/name_chaser = list()) return name_chaser + +/// Used by mobs to determine the name for someone wearing a mask, or with a disfigured or missing face. By default just returns the atom's name. add_id_name will control whether or not we append "(as [id_name])". +/atom/proc/get_visible_name(add_id_name) + return name diff --git a/code/game/atom/atom_materials.dm b/code/game/atom/atom_materials.dm index 803a79110a1..345a8486dd6 100644 --- a/code/game/atom/atom_materials.dm +++ b/code/game/atom/atom_materials.dm @@ -12,7 +12,7 @@ if(custom_materials && material_flags & MATERIAL_EFFECTS) //Only runs if custom materials existed at first and affected src. for(var/current_material in custom_materials) var/datum/material/custom_material = GET_MATERIAL_REF(current_material) - custom_material.on_removed(src, custom_materials[current_material] * material_modifier, material_flags) //Remove the current materials + custom_material.on_removed(src, OPTIMAL_COST(custom_materials[current_material] * material_modifier), material_flags) //Remove the current materials if(!length(materials)) custom_materials = null @@ -21,7 +21,7 @@ if(material_flags & MATERIAL_EFFECTS) for(var/current_material in materials) var/datum/material/custom_material = GET_MATERIAL_REF(current_material) - custom_material.on_applied(src, materials[current_material] * multiplier * material_modifier, material_flags) + custom_material.on_applied(src, OPTIMAL_COST(materials[current_material] * multiplier * material_modifier), material_flags) custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 27cd0ff3cce..f70a9f6669b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -21,6 +21,7 @@ /// The list of factions this atom belongs to var/list/faction + /// Use get_default_say_verb() in say.dm instead of reading verb_say. var/verb_say = "says" var/verb_ask = "asks" var/verb_exclaim = "exclaims" @@ -68,7 +69,7 @@ var/movement_type = GROUND var/atom/movable/pulling - var/grab_state = 0 + var/grab_state = GRAB_PASSIVE /// The strongest grab we can acomplish var/max_grab = GRAB_KILL var/throwforce = 0 @@ -1260,9 +1261,11 @@ return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush) /atom/movable/hitby(atom/movable/hitting_atom, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) + if(HAS_TRAIT(src, TRAIT_NO_THROW_HITPUSH)) + hitpush = FALSE if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) step(src, hitting_atom.dir) - ..() + return ..() /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) if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 0a01b325149..1636613ad50 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -145,88 +145,156 @@ get_asset_datum(/datum/asset/spritesheet/research_designs), ) -/obj/machinery/autolathe/ui_act(action, list/params) +/obj/machinery/autolathe/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) return - if(action == "make") - if(disabled) - say("The autolathe wires are disabled.") - return - if(busy) - say("The autolathe is busy. Please wait for completion of previous operation.") + if(action != "make") + stack_trace("unknown autolathe ui_act: [action]") + return + + if(disabled) + say("Unable to print, voltage mismatch in internal wiring.") + return + + if(busy) + balloon_alert(ui.user, "busy!") + return + + var/turf/target_location = get_step(src, drop_direction) + if(isclosedturf(target_location)) + say("Output path is obstructed by a large object.") + return + + var/design_id = params["id"] + + var/valid_design = stored_research.researched_designs[design_id] + valid_design ||= stored_research.hacked_designs[design_id] + valid_design ||= imported_designs[design_id] + if(!valid_design) + return + + var/datum/design/design = SSresearch.techweb_design_by_id(design_id) + if(isnull(design)) + stack_trace("got passed an invalid design id: [design_id] and somehow made it past all checks") + return + + if(!(design.build_type & AUTOLATHE)) + return + + var/build_count = text2num(params["multiplier"]) + if(!build_count) + return + build_count = clamp(build_count, 1, 50) + + var/list/materials_needed = list() + for(var/datum/material/material as anything in design.materials) + var/amount_needed = design.materials[material] + if(istext(material)) // category + var/list/choices = list() + for(var/datum/material/valid_candidate as anything in SSmaterials.materials_by_category[material]) + if(materials.get_material_amount(valid_candidate) < amount_needed) + continue + choices[valid_candidate.name] = valid_candidate + if(!length(choices)) + say("No valid materials with applicable amounts detected for design.") + return + var/chosen = tgui_input_list( + ui.user, + "Select the material to use", + "Material Selection", + sort_list(choices), + ) + if(isnull(chosen)) + return // user cancelled + material = choices[chosen] + + if(isnull(material)) + stack_trace("got passed an invalid material id: [material]") return + materials_needed[material] = amount_needed - if(isclosedturf(get_step(src, drop_direction))) - say("Output is obstructed.") - return + var/material_cost_coefficient = ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency + if(!materials.has_materials(materials_needed, material_cost_coefficient, build_count)) + say("Not enough materials to begin production.") + return - var/design_id = params["id"] - if(!istext(design_id)) - return - if(!stored_research.researched_designs.Find(design_id) && !stored_research.hacked_designs.Find(design_id) && !imported_designs.Find(design_id)) - return - var/datum/design/design = SSresearch.techweb_design_by_id(design_id) - if(!(design.build_type & AUTOLATHE) || design.id != design_id) - return + //use power + var/total_charge = 0 + for(var/material in design.materials) + total_charge += round(design.materials[material] * material_cost_coefficient * build_count) + var/charge_per_item = total_charge / build_count - being_built = design - var/is_stack = ispath(being_built.build_path, /obj/item/stack) - var/coeff = (is_stack ? 1 : creation_efficiency) // Stacks are unaffected by production coefficient + var/total_time = (design.construction_time * design.lathe_time_factor * build_count) ** 0.8 + var/time_per_item = total_time / build_count + start_making(design, build_count, time_per_item, material_cost_coefficient, charge_per_item) + return TRUE - var/multiplier = round(text2num(params["multiplier"])) - if(!multiplier || !IS_FINITE(multiplier)) - return - multiplier = clamp(multiplier, 1, 50) +/// Begins the act of making the given design the given number of items +/// Does not check or use materials/power/etc +/obj/machinery/autolathe/proc/start_making(datum/design/design, build_count, build_time_per_item, material_cost_coefficient, charge_per_item) + PROTECTED_PROC(TRUE) - //check for materials - var/list/materials_used = list() - var/list/custom_materials = list() // These will apply their material effect, should usually only be one. - for(var/mat in being_built.materials) - var/datum/material/used_material = mat + busy = TRUE + icon_state = "autolathe_n" + update_static_data_for_all_viewers() - var/amount_needed = being_built.materials[mat] - if(istext(used_material)) // This means its a category - var/list/list_to_show = list() - //list all materials in said category - for(var/i in SSmaterials.materials_by_category[used_material]) - if(materials.materials[i] > 0) - list_to_show += i - //ask user to pick specific material from list - used_material = tgui_input_list( - usr, - "Choose [used_material]", - "Custom Material", - sort_list(list_to_show, GLOBAL_PROC_REF(cmp_typepaths_asc)) - ) - if(isnull(used_material)) - return - //the item composition will be made of these materials - custom_materials[used_material] += amount_needed - materials_used[used_material] = amount_needed + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, material_cost_coefficient, build_time_per_item, charge_per_item, build_count), build_time_per_item) - if(!materials.has_materials(materials_used, coeff, multiplier)) - say("Not enough materials for this operation!.") - return +/// Callback for start_making, actually makes the item +/// Called using timers started by start_making +/obj/machinery/autolathe/proc/do_make_item(datum/design/design, material_cost_coefficient, time_per_item, charge_per_item, items_remaining) + PROTECTED_PROC(TRUE) - //use power - var/total_amount = 0 - for(var/material in being_built.materials) - total_amount += being_built.materials[material] - use_power(max(active_power_usage, (total_amount) * multiplier / 5)) + if(!items_remaining) // how + finalize_build() + return - //use materials - materials.use_materials(materials_used, coeff, multiplier) - to_chat(usr, span_notice("You print [multiplier] item(s) from the [src]")) - update_static_data_for_all_viewers() + if(!directly_use_power(charge_per_item)) + say("Unable to continue production, power failure.") + finalize_build() + return - //print item - icon_state = "autolathe_n" - var/time_per_item = is_stack ? 32 : ((32 * coeff * multiplier) ** 0.8) / multiplier - make_items(custom_materials, multiplier, is_stack, usr, time_per_item) + var/list/design_materials = design.materials + var/is_stack = ispath(design.build_path, /obj/item/stack) + if(!materials.has_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1)) + say("Unable to continue production, missing materials.") + return + materials.use_materials(design_materials, material_cost_coefficient, is_stack ? items_remaining : 1) - return TRUE + var/turf/target = get_step(src, drop_direction) + if(isclosedturf(target)) + target = get_turf(src) + + var/atom/movable/created + if(is_stack) + created = new design.build_path(target, items_remaining) + else + created = new design.build_path(target) + split_materials_uniformly(design_materials, material_cost_coefficient, created) + + created.pixel_x = created.base_pixel_x + rand(-6, 6) + created.pixel_y = created.base_pixel_y + rand(-6, 6) + created.forceMove(target) + + if(is_stack) + items_remaining = 0 + else + items_remaining -= 1 + + if(!items_remaining) + finalize_build() + return + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, material_cost_coefficient, time_per_item, items_remaining), time_per_item) + +/// Resets the icon state and busy flag +/// Called at the end of do_make_item's timer loop +/obj/machinery/autolathe/proc/finalize_build() + PROTECTED_PROC(TRUE) + icon_state = initial(icon_state) + busy = FALSE + update_static_data_for_all_viewers() /obj/machinery/autolathe/crowbar_act(mob/living/user, obj/item/tool) if(default_deconstruction_crowbar(tool)) @@ -263,7 +331,7 @@ if(!blueprint) continue if(blueprint.build_type & AUTOLATHE) - imported_designs += blueprint.id + imported_designs[blueprint.id] = TRUE else LAZYADD(not_imported, blueprint.name) if(not_imported) @@ -283,7 +351,7 @@ flick("autolathe_[item_inserted.has_material_type(/datum/material/glass) ? "r" : "o"]", src) - use_power(min(active_power_usage * 0.25, amount_inserted / 100)) + use_power(min(active_power_usage * 0.25, amount_inserted / SHEET_MATERIAL_AMOUNT)) update_static_data_for_all_viewers() @@ -297,41 +365,6 @@ drop_direction = direction balloon_alert(usr, "dropping [dir2text(drop_direction)]") -/obj/machinery/autolathe/proc/make_items(list/picked_materials, multiplier, is_stack, mob/user, time_per_item) - var/atom/our_loc = drop_location() - var/atom/drop_loc = get_step(src, drop_direction) - - busy = TRUE - SStgui.update_uis(src) //so ui immediatly knows its busy - while(multiplier > 0) - if(!busy) - break - stoplag(time_per_item) - var/obj/item/new_item - if(is_stack) - new_item = new being_built.build_path(our_loc, multiplier) - else - new_item = new being_built.build_path(our_loc) - - //custom materials for toolboxes - if(length(picked_materials)) - new_item.set_custom_materials(picked_materials) //Ensure we get the non multiplied amount - for(var/datum/material/mat in picked_materials) - if(!istype(mat, /datum/material/glass) && !istype(mat, /datum/material/iron)) - user.client.give_award(/datum/award/achievement/misc/getting_an_upgrade, user) - - //no need to call if ontop of us - if(drop_direction) - new_item.Move(drop_loc) - //multiplier already applied in stack initialization. work done - if(is_stack) - break - - multiplier-- - - icon_state = "autolathe" - busy = FALSE - /obj/machinery/autolathe/RefreshParts() . = ..() var/mat_capacity = 0 @@ -380,10 +413,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(5, 1, src) s.start() - if (electrocute_mob(user, get_area(src), src, 0.7, TRUE)) - return TRUE - else - return FALSE + return electrocute_mob(user, get_area(src), src, 0.7, TRUE) /obj/machinery/autolathe/proc/adjust_hacked(state) hacked = state diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index f3008ca4ebc..213c43b5a11 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -115,6 +115,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/proc/create_prox_monitor() if(!proximity_monitor) proximity_monitor = new(src, 1) + RegisterSignal(proximity_monitor, COMSIG_QDELETING, PROC_REF(proximity_deleted)) + +/obj/machinery/camera/proc/proximity_deleted() + SIGNAL_HANDLER + proximity_monitor = null /obj/machinery/camera/proc/set_area_motion(area/A) area_motion = A diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index f73a786865c..ec01c2365f8 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -8,8 +8,7 @@ /obj/machinery/camera/process() // motion camera event loop if(!isMotion()) - . = PROCESS_KILL - return + return PROCESS_KILL if(machine_stat & EMPED) return if (detectTime > 0) diff --git a/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm b/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm index b219062932a..de2f3d82275 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_consumables.dm @@ -3,20 +3,20 @@ /datum/orderable_item/consumables/survival_pen item_path = /obj/item/reagent_containers/hypospray/medipen/survival - cost_per_order = 500 + cost_per_order = 250 /datum/orderable_item/consumables/luxury_pen item_path = /obj/item/reagent_containers/hypospray/medipen/survival/luxury - cost_per_order = 1000 + cost_per_order = 750 /datum/orderable_item/consumables/medkit item_path = /obj/item/storage/medkit/brute - cost_per_order = 600 + cost_per_order = 400 /datum/orderable_item/consumables/medkit_fire item_path = /obj/item/storage/medkit/fire desc = "For emergency magmatic burn relief." - cost_per_order = 700 + cost_per_order = 500 /datum/orderable_item/consumables/whiskey item_path = /obj/item/reagent_containers/cup/glass/bottle/whiskey diff --git a/code/game/machinery/computer/orders/order_items/mining/order_golem.dm b/code/game/machinery/computer/orders/order_items/mining/order_golem.dm index 891c6b9f358..cbd037230f2 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_golem.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_golem.dm @@ -3,33 +3,33 @@ /datum/orderable_item/golem/mining_id item_path = /obj/item/card/id/advanced/mining - cost_per_order = 250 + cost_per_order = 200 /datum/orderable_item/golem/science_goggles item_path = /obj/item/clothing/glasses/science - cost_per_order = 250 + cost_per_order = 200 /datum/orderable_item/golem/monkeycubes item_path = /obj/item/food/monkeycube - cost_per_order = 300 + cost_per_order = 250 /datum/orderable_item/golem/belt item_path = /obj/item/storage/belt/utility - cost_per_order = 350 + cost_per_order = 300 /datum/orderable_item/golem/royal_cape item_path = /obj/item/bedsheet/rd/royal_cape - cost_per_order = 500 + cost_per_order = 400 /datum/orderable_item/golem/grey_extract item_path = /obj/item/slime_extract/grey - cost_per_order = 1000 + cost_per_order = 800 /datum/orderable_item/golem/trigger_guard item_path = /obj/item/borg/upgrade/modkit/trigger_guard - cost_per_order = 1700 + cost_per_order = 750 /datum/orderable_item/golem/rnd_boards item_path = /obj/item/storage/box/rndboards - cost_per_order = 2000 + cost_per_order = 1000 diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index 09bbeed2bed..686f8312671 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -3,52 +3,52 @@ /datum/orderable_item/mining/marker_beacon item_path = /obj/item/stack/marker_beacon/ten - cost_per_order = 100 + cost_per_order = 80 /datum/orderable_item/mining/skeleton_key item_path = /obj/item/skeleton_key - cost_per_order = 777 + cost_per_order = 675 /datum/orderable_item/mining/mining_stabilizer item_path = /obj/item/mining_stabilizer - cost_per_order = 400 + cost_per_order = 320 /datum/orderable_item/mining/fulton_core item_path = /obj/item/fulton_core - cost_per_order = 400 + cost_per_order = 320 /datum/orderable_item/mining/mining_modsuit item_path = /obj/item/mod/control/pre_equipped/mining desc = "A mining-themed MODsuit that works best when in a mining environment." - cost_per_order = 3000 + cost_per_order = 2500 /datum/orderable_item/mining/mining_belt item_path = /obj/item/storage/belt/mining - cost_per_order = 500 + cost_per_order = 450 /datum/orderable_item/mining/jaunter item_path = /obj/item/wormhole_jaunter - cost_per_order = 750 + cost_per_order = 650 /datum/orderable_item/mining/crusher item_path = /obj/item/kinetic_crusher - cost_per_order = 750 + cost_per_order = 650 /datum/orderable_item/mining/resonator item_path = /obj/item/resonator - cost_per_order = 800 + cost_per_order = 710 /datum/orderable_item/mining/resonator_advanced item_path = /obj/item/resonator/upgraded - cost_per_order = 2500 + cost_per_order = 2000 /datum/orderable_item/mining/mining_scanner item_path = /obj/item/t_scanner/adv_mining_scanner - cost_per_order = 800 + cost_per_order = 675 /datum/orderable_item/mining/fulton item_path = /obj/item/extraction_pack - cost_per_order = 1000 + cost_per_order = 800 /datum/orderable_item/mining/lazarus item_path = /obj/item/lazarus_injector @@ -69,40 +69,45 @@ /datum/orderable_item/mining/conscription_kit item_path = /obj/item/storage/backpack/duffelbag/mining_conscript desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." - cost_per_order = 1500 + cost_per_order = 1200 /datum/orderable_item/mining/capsule item_path = /obj/item/survivalcapsule - cost_per_order = 400 + cost_per_order = 350 /datum/orderable_item/mining/capsule/bathroom item_path = /obj/item/survivalcapsule/bathroom - cost_per_order = 375 + cost_per_order = 300 /datum/orderable_item/mining/capsule_luxury item_path = /obj/item/survivalcapsule/luxury - cost_per_order = 3000 + cost_per_order = 2300 /datum/orderable_item/mining/capsule_luxuryelite item_path = /obj/item/survivalcapsule/luxuryelite - cost_per_order = 10000 + cost_per_order = 7000 /datum/orderable_item/mining/kheiralcuffs item_path = /obj/item/kheiral_cuffs - cost_per_order = 750 + cost_per_order = 675 /datum/orderable_item/mining/bhop item_path = /obj/item/clothing/shoes/bhop - cost_per_order = 2500 + cost_per_order = 2000 /datum/orderable_item/mining/hiking_boots item_path = /obj/item/clothing/shoes/winterboots/ice_boots - cost_per_order = 2500 + cost_per_order = 2000 /datum/orderable_item/mining/style_meter item_path = /obj/item/style_meter - cost_per_order = 1500 + cost_per_order = 1200 /datum/orderable_item/mining/weather_radio item_path = /obj/item/radio/weather_monitor - cost_per_order = 400 + cost_per_order = 320 + +/datum/orderable_item/mining/boulder_processing + item_path = /obj/item/boulder_beacon + desc = "A Bouldertech brand all-in-one boulder processing beacon. Each use will teleport in a component of a full boulder processing assembly line. Good for when you need to process additional boulders." + cost_per_order = 875 diff --git a/code/game/machinery/computer/orders/order_items/mining/order_pka.dm b/code/game/machinery/computer/orders/order_items/mining/order_pka.dm index 7ba37721e36..251343e6f8e 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_pka.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_pka.dm @@ -3,19 +3,19 @@ /datum/orderable_item/accelerator/gun item_path = /obj/item/gun/energy/recharge/kinetic_accelerator - cost_per_order = 750 + cost_per_order = 600 /datum/orderable_item/accelerator/range item_path = /obj/item/borg/upgrade/modkit/range - cost_per_order = 1000 + cost_per_order = 675 /datum/orderable_item/accelerator/damage item_path = /obj/item/borg/upgrade/modkit/damage - cost_per_order = 1000 + cost_per_order = 675 /datum/orderable_item/accelerator/cooldown item_path = /obj/item/borg/upgrade/modkit/cooldown - cost_per_order = 1000 + cost_per_order = 675 /datum/orderable_item/accelerator/chasis item_path = /obj/item/borg/upgrade/modkit/chassis_mod @@ -35,8 +35,8 @@ /datum/orderable_item/accelerator/aoe_mobs item_path = /obj/item/borg/upgrade/modkit/aoe/mobs - cost_per_order = 2000 + cost_per_order = 1500 /datum/orderable_item/accelerator/minebot_passthrough item_path = /obj/item/borg/upgrade/modkit/minebot_passthrough - cost_per_order = 1000 + cost_per_order = 800 diff --git a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm index cd1dbf5c674..5ce92f7b84f 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm @@ -3,29 +3,29 @@ /datum/orderable_item/toys_drones/soap item_path = /obj/item/soap/nanotrasen - cost_per_order = 200 + cost_per_order = 180 /datum/orderable_item/toys_drones/laser_pointer item_path = /obj/item/laser_pointer - cost_per_order = 300 + cost_per_order = 275 /datum/orderable_item/toys_drones/facehugger item_path = /obj/item/clothing/mask/facehugger/toy - cost_per_order = 300 + cost_per_order = 275 /datum/orderable_item/toys_drones/mining_drone item_path = /mob/living/basic/mining_drone - cost_per_order = 800 + cost_per_order = 675 /datum/orderable_item/toys_drones/drone_health item_path = /obj/item/mine_bot_upgrade/health - cost_per_order = 400 + cost_per_order = 350 /datum/orderable_item/toys_drones/drone_pka item_path = /obj/item/borg/upgrade/modkit/cooldown/minebot - cost_per_order = 600 + cost_per_order = 525 /datum/orderable_item/toys_drones/drone_sentience item_path = /obj/item/slimepotion/slime/sentience/mining - cost_per_order = 1000 + cost_per_order = 850 diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 16369302c66..5785734a437 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -1,5 +1,5 @@ /obj/machinery/computer/prisoner - interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_SET_MACHINE|INTERACT_MACHINE_REQUIRES_LITERACY + interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_REQUIRES_LITERACY /// ID card currently inserted into the computer. VAR_FINAL/obj/item/card/id/advanced/prisoner/contained_id diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index de60d84dafd..87fc1ca4ff2 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -41,7 +41,7 @@ req_access = null anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /datum/track var/song_name = "generic" @@ -264,8 +264,6 @@ S.pixel_y = 7 S.forceMove(get_turf(src)) sleep(0.7 SECONDS) - if(selection.song_name == "Engineering's Ultimate High-Energy Hustle") - sleep(28 SECONDS) for(var/s in sparkles) var/obj/effect/overlay/sparkles/reveal = s reveal.alpha = 255 @@ -343,128 +341,69 @@ #undef DISCO_INFENO_RANGE -/obj/machinery/jukebox/disco/proc/dance(mob/living/M) //Show your moves - set waitfor = FALSE - switch(rand(0,9)) - if(0 to 1) - dance2(M) - if(2 to 3) - dance3(M) - if(4 to 6) - dance4(M) - if(7 to 9) - dance5(M) - -/obj/machinery/jukebox/disco/proc/dance2(mob/living/M) - for(var/i in 0 to 9) - dance_rotate(M, CALLBACK(M, TYPE_PROC_REF(/mob, dance_flip))) - sleep(2 SECONDS) +/obj/machinery/jukebox/disco/proc/dance(mob/living/dancer, dance_num) //Show your moves + ADD_TRAIT(dancer, TRAIT_DISCO_DANCER, REF(src)) + switch(dance_num) + if(1) + dance1(dancer) + if(2) + dance2(dancer) + if(3) + start_dance3(dancer) + if(4) + dance4(dancer) /mob/proc/dance_flip() if(dir == WEST) emote("flip") -/obj/machinery/jukebox/disco/proc/dance3(mob/living/M) - var/matrix/initial_matrix = matrix(M.transform) - for (var/i in 1 to 75) - if (!M) - return - switch(i) - if (1 to 15) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,1) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (16 to 30) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(1,-1) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (31 to 45) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(-1,-1) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (46 to 60) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(-1,1) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (61 to 75) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(1,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - M.setDir(turn(M.dir, 90)) - switch (M.dir) - if (NORTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (SOUTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (EAST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (WEST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(-3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - sleep(0.1 SECONDS) - M.lying_fix() +/obj/machinery/jukebox/disco/proc/dance1(mob/living/dancer) + addtimer(TRAIT_CALLBACK_REMOVE(dancer, TRAIT_DISCO_DANCER, REF(src)), 6.5 SECONDS, TIMER_CLIENT_TIME) + for(var/i in 0 to (6 SECONDS) step (1.5 SECONDS)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(dance_rotate), dancer, CALLBACK(dancer, TYPE_PROC_REF(/mob, dance_flip))), i, TIMER_CLIENT_TIME) -/obj/machinery/jukebox/disco/proc/dance4(mob/living/lead_dancer) - var/speed = rand(1,3) - set waitfor = 0 - var/time = 30 - while(time) - sleep(speed) - for(var/i in 1 to speed) - lead_dancer.setDir(pick(GLOB.cardinals)) - // makes people dance with us nearby - for(var/datum/weakref/weak_dancer as anything in rangers) - var/mob/living/carbon/dancer = weak_dancer.resolve() - if(!istype(dancer)) - continue - dancer.set_resting(!dancer.resting, silent = TRUE, instant = TRUE) - time-- +/obj/machinery/jukebox/disco/proc/dance2(mob/living/dancer, dance_length = 2.5 SECONDS) + var/matrix/initial_matrix = matrix(dancer.transform) + var/list/transforms = list( + "[NORTH]" = matrix(dancer.transform).Translate(0, 3), + "[EAST]" = matrix(dancer.transform).Translate(3, 0), + "[SOUTH]" = matrix(dancer.transform).Translate(0, -3), + "[WEST]" = matrix(dancer.transform).Translate(-1, -1), + ) + addtimer(VARSET_CALLBACK(dancer, transform, initial_matrix), dance_length + 0.5 SECONDS, TIMER_CLIENT_TIME) + addtimer(TRAIT_CALLBACK_REMOVE(dancer, TRAIT_DISCO_DANCER, REF(src)), dance_length + 0.5 SECONDS) + for (var/i in 1 to dance_length) + addtimer(CALLBACK(src, PROC_REF(animate_dance2), dancer, transforms, initial_matrix), i, TIMER_CLIENT_TIME) -/obj/machinery/jukebox/disco/proc/dance5(mob/living/M) - animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) - var/matrix/initial_matrix = matrix(M.transform) - for (var/i in 1 to 60) - if (!M) - return - if (i<31) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,1) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (i>30) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-1) - animate(M, transform = initial_matrix, time = 1, loop = 0) - M.setDir(turn(M.dir, 90)) - switch (M.dir) - if (NORTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (SOUTH) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(0,-3) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (EAST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - if (WEST) - initial_matrix = matrix(M.transform) - initial_matrix.Translate(-3,0) - animate(M, transform = initial_matrix, time = 1, loop = 0) - sleep(1 SECONDS) - M.lying_fix() +/obj/machinery/jukebox/disco/proc/animate_dance2(mob/living/dancer, list/transforms, matrix/initial_matrix) + dancer.setDir(turn(dancer.dir, 90)) + animate(dancer, transform = transforms[num2text(dancer.dir)], time = 1, loop = 0) + animate(transform = initial_matrix, time = 2, loop = 0) -/mob/living/proc/lying_fix() - animate(src, transform = null, time = 1, loop = 0) - lying_prev = 0 +/obj/machinery/jukebox/disco/proc/start_dance3(mob/living/dancer, dance_length = 3 SECONDS) + var/initially_resting = dancer.resting + var/direction_index = 1 //this should allow everyone to dance in the same direction + addtimer(TRAIT_CALLBACK_REMOVE(dancer, TRAIT_DISCO_DANCER, REF(src)), dance_length + 0.2 SECONDS) + addtimer(CALLBACK(dancer, TYPE_PROC_REF(/mob/living, set_resting), initially_resting, TRUE, TRUE), dance_length + 0.2 SECONDS, TIMER_CLIENT_TIME) + for (var/i in 1 to dance_length step 2) // 1 = 0.1 seconds + addtimer(CALLBACK(src, PROC_REF(dance3), dancer, GLOB.cardinals[direction_index]), i, TIMER_CLIENT_TIME) + direction_index++ + if(direction_index > GLOB.cardinals.len) + direction_index = 1 + +/obj/machinery/jukebox/disco/proc/dance3(mob/living/dancer, dir) + dancer.setDir(dir) + dancer.set_resting(!dancer.resting, silent = TRUE, instant = TRUE) + +/obj/machinery/jukebox/disco/proc/dance4(mob/living/dancer, dance_length = 1.5 SECONDS) + var/matrix/initial_matrix = matrix(dancer.transform) + animate(dancer, transform = matrix(dancer.transform).Turn(180), time = 2, loop = 0) + dancer.emote("spin") + addtimer(CALLBACK(src, PROC_REF(dance4_revert), dancer, initial_matrix), dance_length, TIMER_CLIENT_TIME) + +/obj/machinery/jukebox/disco/proc/dance4_revert(mob/living/dancer, matrix/starting_matrix) + animate(dancer, transform = starting_matrix, time = 5, loop = 0) + REMOVE_TRAIT(dancer, TRAIT_DISCO_DANCER, REF(src)) /obj/machinery/jukebox/proc/dance_over() for(var/datum/weakref/weak_to_hide_from as anything in rangers) @@ -515,12 +454,13 @@ if(!active) return + var/dance_num = rand(1,4) //all will do the same dance for(var/datum/weakref/weak_dancer as anything in rangers) var/mob/living/to_dance = weak_dancer.resolve() if(!istype(to_dance) || !(to_dance.mobility_flags & MOBILITY_MOVE)) continue - if(prob(5 + (allowed(to_dance) * 4))) - dance(to_dance) + if(!HAS_TRAIT(to_dance, TRAIT_DISCO_DANCER)) + dance(to_dance, dance_num) #undef HAS_JUKEBOX_PREF */ //SKYRAT EDIT REMOVAL END diff --git a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm index 2a5c776709c..70dd58f9f27 100644 --- a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm @@ -79,15 +79,12 @@ Fluoride Stare: After someone says 5 words, blah blah blah... icon_state = "liver" greyscale_config = /datum/greyscale_config/mutant_organ greyscale_colors = GONDOLA_COLORS - /// instance of the martial art granted on insertion - var/datum/martial_art/hugs_of_the_gondola/pax_hugs /obj/item/organ/internal/liver/gondola/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola) AddElement(/datum/element/noticable_organ, "left arm has small needles breaching the skin all over it.", BODY_ZONE_L_ARM) AddElement(/datum/element/noticable_organ, "right arm has small needles breaching the skin all over it.", BODY_ZONE_R_ARM) - pax_hugs = new /obj/item/organ/internal/liver/gondola/Insert(mob/living/carbon/liver_owner, special, movement_flags) . = ..() @@ -100,14 +97,13 @@ Fluoride Stare: After someone says 5 words, blah blah blah... else to_chat(liver_owner, span_warning("You feel like something would be happening to your arms right now... if you still had them.")) to_chat(liver_owner, span_notice("Hugging a target will pacify them, but you won't be able to carry much of anything anymore.")) - pax_hugs.teach(liver_owner) RegisterSignal(liver_owner, COMSIG_HUMAN_EQUIPPING_ITEM, PROC_REF(on_owner_equipping_item)) RegisterSignal(liver_owner, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull)) + RegisterSignal(liver_owner, COMSIG_CARBON_HELPED, PROC_REF(on_hug)) /obj/item/organ/internal/liver/gondola/Remove(mob/living/carbon/liver_owner, special, movement_flags) . = ..() - pax_hugs.remove(liver_owner) - UnregisterSignal(liver_owner, list(COMSIG_HUMAN_EQUIPPING_ITEM, COMSIG_LIVING_TRY_PULL)) + UnregisterSignal(liver_owner, list(COMSIG_HUMAN_EQUIPPING_ITEM, COMSIG_LIVING_TRY_PULL, COMSIG_CARBON_HELPED)) /// signal sent when prompting if an item can be equipped /obj/item/organ/internal/liver/gondola/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/equip_target, slot) @@ -130,6 +126,18 @@ Fluoride Stare: After someone says 5 words, blah blah blah... item_target.balloon_alert(owner, "too weak to pull this!") return COMSIG_LIVING_CANCEL_PULL +/obj/item/organ/internal/liver/gondola/proc/on_hug(mob/living/carbon/human/source, mob/living/carbon/hugged) + SIGNAL_HANDLER + + var/list/covered_body_zones = source.get_covered_body_zones() + var/pax_injected = 4 + if(BODY_ZONE_L_ARM in covered_body_zones) + pax_injected -= 2 + if(BODY_ZONE_R_ARM in covered_body_zones) + pax_injected -= 2 + if(pax_injected > 0 && hugged.reagents?.add_reagent(/datum/reagent/pax, pax_injected)) + to_chat(hugged, span_warning("You feel a tiny prick!")) + #undef GONDOLA_ORGAN_COLOR #undef GONDOLA_SCLERA_COLOR #undef GONDOLA_PUPIL_COLOR diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 509e3347f84..bf67684f0e1 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -308,9 +308,6 @@ for(var/obj/machinery/door/airlock/otherlock as anything in close_others) otherlock.close_others -= src close_others.Cut() - if(id_tag) - for(var/obj/machinery/door_buttons/D as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door_buttons)) - D.removeMe(src) QDEL_NULL(note) QDEL_NULL(seal) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) @@ -2041,7 +2038,6 @@ if(prob(50)) radiate() last_event = world.time - ..() /obj/machinery/door/airlock/uranium/proc/radiate() radiation_pulse( diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 802608e47a5..1d428e7547e 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -152,7 +152,6 @@ . += span_warning("[recharging_text]") /obj/machinery/drone_dispenser/process() - ..() if((machine_stat & (NOPOWER|BROKEN)) || !anchored) return diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index 1e2287a0492..98d0ac1a02f 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -1,9 +1,3 @@ -#define CLOSING 1 -#define OPENING 2 -#define CYCLE 3 -#define CYCLE_EXTERIOR 4 -#define CYCLE_INTERIOR 5 - /obj/machinery/door_buttons power_channel = AREA_USAGE_ENVIRON use_power = IDLE_POWER_USE @@ -15,7 +9,7 @@ /obj/machinery/door_buttons/attackby(obj/O, mob/user) return attack_hand(user) -/obj/machinery/door_buttons/proc/findObjsByTag() +/obj/machinery/door_buttons/proc/find_objects_by_tag() return /obj/machinery/door_buttons/Initialize(mapload) @@ -23,7 +17,7 @@ return INITIALIZE_HINT_LATELOAD /obj/machinery/door_buttons/LateInitialize() - findObjsByTag() + find_objects_by_tag() /obj/machinery/door_buttons/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) @@ -35,9 +29,6 @@ balloon_alert(user, "access controller shorted") return TRUE -/obj/machinery/door_buttons/proc/removeMe() - - /obj/machinery/door_buttons/access_button icon = 'icons/obj/machines/wallmounts.dmi' // SKYRAT EDIT CHANGE - ICON OVERRIDEN BY AESTHETICS - SEE MODULE icon_state = "access_button_standby" @@ -49,14 +40,16 @@ var/obj/machinery/door_buttons/airlock_controller/controller var/busy -/obj/machinery/door_buttons/access_button/findObjsByTag() +/obj/machinery/door_buttons/access_button/find_objects_by_tag() for(var/obj/machinery/door_buttons/airlock_controller/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door_buttons/airlock_controller)) if(A.idSelf == idSelf) controller = A + RegisterSignal(controller, COMSIG_PREQDELETED, PROC_REF(remove_object)) break for(var/obj/machinery/door/airlock/I as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock)) if(I.id_tag == idDoor) door = I + RegisterSignal(door, COMSIG_PREQDELETED, PROC_REF(remove_object)) break /obj/machinery/door_buttons/access_button/interact(mob/user) @@ -71,15 +64,15 @@ busy = TRUE update_appearance() if(door.density) - if(!controller.exteriorAirlock || !controller.interiorAirlock) - controller.onlyOpen(door) + if(!controller.exterior_airlock || !controller.interior_airlock) + controller.only_open(door) else - if(controller.exteriorAirlock.density && controller.interiorAirlock.density) - controller.onlyOpen(door) + if(controller.exterior_airlock.density && controller.interior_airlock.density) + controller.only_open(door) else - controller.cycleClose(door) + controller.cycle_close(door) else - controller.onlyClose(door) + controller.only_close(door) use_power(active_power_usage) addtimer(CALLBACK(src, PROC_REF(not_busy)), 2 SECONDS) @@ -94,218 +87,185 @@ icon_state = "[base_icon_state]_[busy ? "cycle" : "standby"]" return ..() -/obj/machinery/door_buttons/access_button/removeMe(obj/O) - if(O == door) +/obj/machinery/door_buttons/access_button/proc/remove_object(datum/source) + SIGNAL_HANDLER + + if(source == door) door = null + return + if(source == controller) + controller = null - +/obj/machinery/door_buttons/access_button/Destroy() + door = null + controller = null + return ..() /obj/machinery/door_buttons/airlock_controller + name = "access console" + desc = "A small console that can cycle opening between two airlocks." icon = 'icons/obj/machines/wallmounts.dmi' icon_state = "access_control_standby" base_icon_state = "access_control" - name = "access console" - desc = "A small console that can cycle opening between two airlocks." - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE - var/obj/machinery/door/airlock/interiorAirlock - var/obj/machinery/door/airlock/exteriorAirlock + interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON + ///the id of the interior airlock var/idInterior + ///the id of the exterior airlock var/idExterior + ///are we currently in use? var/busy - var/lostPower + ///our interior airlock + var/obj/machinery/door/airlock/interior_airlock + ///our exterior airlock + var/obj/machinery/door/airlock/exterior_airlock -/obj/machinery/door_buttons/airlock_controller/removeMe(obj/O) - if(O == interiorAirlock) - interiorAirlock = null - else if(O == exteriorAirlock) - exteriorAirlock = null +///set our doors to null upon deletion +/obj/machinery/door_buttons/airlock_controller/proc/remove_door(datum/source) + SIGNAL_HANDLER -/obj/machinery/door_buttons/airlock_controller/Destroy() - for(var/obj/machinery/door_buttons/access_button/A as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door_buttons/access_button)) - if(A.controller == src) - A.controller = null - return ..() - -/obj/machinery/door_buttons/airlock_controller/Topic(href, href_list) - if(..()) + if(source == interior_airlock) + interior_airlock = null return - if(busy) + + if(source == exterior_airlock) + exterior_airlock = null + +///proc called when we want to open doors without any cycling involved +/obj/machinery/door_buttons/airlock_controller/proc/only_open(obj/machinery/door/airlock/target_door) + if(isnull(target_door)) return - if(!allowed(usr)) - to_chat(usr, span_warning("Access denied.")) + busy = TRUE + update_appearance() + open_door(target_door) + +///proc called when we want to close doors without any cycling involved +/obj/machinery/door_buttons/airlock_controller/proc/only_close(obj/machinery/door/airlock/target_door) + if(isnull(target_door)) return - switch(href_list["command"]) - if("close_exterior") - onlyClose(exteriorAirlock) - if("close_interior") - onlyClose(interiorAirlock) - if("cycle_exterior") - cycleClose(exteriorAirlock) - if("cycle_interior") - cycleClose(interiorAirlock) - if("open_exterior") - onlyOpen(exteriorAirlock) - if("open_interior") - onlyOpen(interiorAirlock) + busy = TRUE + close_door(target_door) -/obj/machinery/door_buttons/airlock_controller/proc/onlyOpen(obj/machinery/door/airlock/A) - if(A) - busy = CLOSING - update_appearance() - openDoor(A) - -/obj/machinery/door_buttons/airlock_controller/proc/onlyClose(obj/machinery/door/airlock/A) - if(A) - busy = CLOSING - closeDoor(A) - -/obj/machinery/door_buttons/airlock_controller/proc/closeDoor(obj/machinery/door/airlock/A) - if(A.density) - goIdle() +///proc that handles closing doors +/obj/machinery/door_buttons/airlock_controller/proc/close_door(obj/machinery/door/airlock/target_door, turn_idle_on_terminate = TRUE) + busy = TRUE + if(isnull(target_door) || target_door.density) + go_idle() return FALSE update_appearance() - A.safe = FALSE //Door crushies, manual door after all. Set every time in case someone changed it, safe doors can end up waiting forever. - A.unbolt() - if(A.close()) - if(machine_stat & NOPOWER || lostPower || !A || QDELETED(A)) - goIdle(TRUE) - return FALSE - A.bolt() - goIdle(TRUE) - return TRUE - goIdle(TRUE) - return FALSE + target_door.safe = FALSE //Door crushies, manual door after all. Set every time in case someone changed it, safe doors can end up waiting forever. + target_door.unbolt() + if(!target_door.close() || (machine_stat & NOPOWER)) + go_idle() + return FALSE + target_door?.bolt() -/obj/machinery/door_buttons/airlock_controller/proc/cycleClose(obj/machinery/door/airlock/A) - if(!A || !exteriorAirlock || !interiorAirlock) + if(turn_idle_on_terminate) + go_idle() + + return TRUE + +///proc called when we want to close doors with cycling +/obj/machinery/door_buttons/airlock_controller/proc/cycle_close(obj/machinery/door/airlock/target_door) + if(isnull(exterior_airlock) || isnull(interior_airlock)) return - if(exteriorAirlock.density == interiorAirlock.density || !A.density) + if(exterior_airlock.density == interior_airlock.density || !target_door.density) return - busy = CYCLE + busy = TRUE update_appearance() - if(A == interiorAirlock) - if(closeDoor(exteriorAirlock)) - busy = CYCLE_INTERIOR - else - if(closeDoor(interiorAirlock)) - busy = CYCLE_EXTERIOR + var/obj/machinery/door/airlock/opposite_airlock = (target_door == exterior_airlock ? interior_airlock : exterior_airlock) -/obj/machinery/door_buttons/airlock_controller/proc/cycleOpen(obj/machinery/door/airlock/A) - if(!A) - goIdle(TRUE) - if(A == exteriorAirlock) - if(interiorAirlock) - if(!interiorAirlock.density || !interiorAirlock.locked) - return - else - if(exteriorAirlock) - if(!exteriorAirlock.density || !exteriorAirlock.locked) - return - if(busy != OPENING) - busy = OPENING - openDoor(A) + if(!close_door(opposite_airlock, turn_idle_on_terminate = FALSE)) + return go_idle() -/obj/machinery/door_buttons/airlock_controller/proc/openDoor(obj/machinery/door/airlock/A) - if(exteriorAirlock && interiorAirlock && (!exteriorAirlock.density || !interiorAirlock.density)) - goIdle(TRUE) - return - A.unbolt() - INVOKE_ASYNC(src, PROC_REF(do_openDoor), A) + addtimer(CALLBACK(src, PROC_REF(cycle_open), target_door), 2 SECONDS) -/obj/machinery/door_buttons/airlock_controller/proc/do_openDoor(obj/machinery/door/airlock/A) - if(A?.open()) - if(machine_stat | (NOPOWER) && !lostPower && A && !QDELETED(A)) - A.bolt() - goIdle(TRUE) +///proc called when we want to open doors with cycling +/obj/machinery/door_buttons/airlock_controller/proc/cycle_open(obj/machinery/door/airlock/target_door) + if(isnull(target_door)) + return go_idle() + var/obj/machinery/door/airlock/opposite_airlock = (target_door == exterior_airlock ? interior_airlock : exterior_airlock) + if(isnull(opposite_airlock) || !opposite_airlock.density || !opposite_airlock.locked) + return go_idle() + busy = TRUE + open_door(target_door) -/obj/machinery/door_buttons/airlock_controller/proc/goIdle(update) - lostPower = FALSE +///proc that handles opening and unbolting the door +/obj/machinery/door_buttons/airlock_controller/proc/open_door(obj/machinery/door/airlock/target_door) + if(!target_door.density) + return go_idle() + + target_door.unbolt() + if(!target_door.open() || (machine_stat & NOPOWER)) + return go_idle() + + target_door?.bolt() + return go_idle() + + +///unsets our busy state and update our appearance +/obj/machinery/door_buttons/airlock_controller/proc/go_idle() busy = FALSE - if(update) - update_appearance() - updateUsrDialog() + update_appearance() -/obj/machinery/door_buttons/airlock_controller/process() - if(machine_stat & NOPOWER) - return - if(busy == CYCLE_EXTERIOR) - cycleOpen(exteriorAirlock) - else if(busy == CYCLE_INTERIOR) - cycleOpen(interiorAirlock) - -/obj/machinery/door_buttons/airlock_controller/power_change() - . = ..() - if(machine_stat & NOPOWER) - lostPower = TRUE - else - if(!busy) - lostPower = FALSE - -/obj/machinery/door_buttons/airlock_controller/findObjsByTag() +/obj/machinery/door_buttons/airlock_controller/find_objects_by_tag() for(var/obj/machinery/door/door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door)) + if(isnull(idInterior) || isnull(idExterior)) + break if(door.id_tag == idInterior) - interiorAirlock = door - else if(door.id_tag == idExterior) - exteriorAirlock = door + interior_airlock = door + RegisterSignal(interior_airlock, COMSIG_PREQDELETED, PROC_REF(remove_door)) + if(door.id_tag == idExterior) + exterior_airlock = door + RegisterSignal(exterior_airlock, COMSIG_PREQDELETED, PROC_REF(remove_door)) /obj/machinery/door_buttons/airlock_controller/update_icon_state() if(machine_stat & NOPOWER) - icon_state = "access_control_off" + icon_state = "[base_icon_state]_off" return ..() - icon_state = "[base_icon_state]_[(busy || lostPower) ? "process" : "standby"]" + icon_state = "[base_icon_state]_[(busy) ? "process" : "standby"]" return ..() -/obj/machinery/door_buttons/airlock_controller/ui_interact(mob/user) - var/datum/browser/popup = new(user, "computer", name) - popup.set_content(returnText()) - popup.open() +/obj/machinery/door_buttons/airlock_controller/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AirlockButtonController", name) + ui.open() -/obj/machinery/door_buttons/airlock_controller/proc/returnText() - var/output - if(!exteriorAirlock && !interiorAirlock) - return "ERROR ERROR ERROR ERROR" - if(lostPower) - output = "Initializing..." +/obj/machinery/door_buttons/airlock_controller/ui_data(mob/user) + var/list/data = list() + data["interior_door"] = interior_airlock ? REF(interior_airlock) : null + data["exterior_door"] = exterior_airlock ? REF(exterior_airlock) : null + data["busy"] = busy + data["interior_door_closed"] = interior_airlock?.density + data["exterior_door_closed"] = exterior_airlock?.density + return data + +/obj/machinery/door_buttons/airlock_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(. || busy) + return TRUE + + if(isnull(params["requested_door"])) + return TRUE + + var/atom/requested_door + var/atom/opposite_door + + if(REF(interior_airlock) == params["requested_door"]) + requested_door = interior_airlock + opposite_door = exterior_airlock else - if(!exteriorAirlock || !interiorAirlock) - if(!exteriorAirlock) - if(interiorAirlock.density) - output = "Open Interior Airlock
" - else - output = "Close Interior Airlock
" + requested_door = exterior_airlock + opposite_door = interior_airlock + + switch(action) + if("open") + if(opposite_door && !opposite_door.density) + cycle_close(requested_door) else - if(exteriorAirlock.density) - output = "Open Exterior Airlock
" - else - output = "Close Exterior Airlock
" - else - if(exteriorAirlock.density) - if(interiorAirlock.density) - output = {"Open Exterior Airlock
- Open Interior Airlock
"} - else - output = {"Cycle to Exterior Airlock
- Close Interior Airlock
"} - else - if(interiorAirlock.density) - output = {"Close Exterior Airlock
- Cycle to Interior Airlock
"} - else - output = {"Close Exterior Airlock
- Close Interior Airlock
"} + only_open(requested_door) + if("close") + only_close(requested_door) - - output = {"Access Control Console
- [output]
"} - if(exteriorAirlock) - output += "Exterior Door: [exteriorAirlock.density ? "closed" : "open"]
" - if(interiorAirlock) - output += "Interior Door: [interiorAirlock.density ? "closed" : "open"]
" - - return output - -#undef CLOSING -#undef OPENING -#undef CYCLE -#undef CYCLE_EXTERIOR -#undef CYCLE_INTERIOR + return TRUE diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 9c649b2c8ee..e1c2c8c73d6 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -30,6 +30,7 @@ I.forceMove(get_turf(src)) if(linked_teleporter) linked_teleporter.linked_reclaimer = null + linked_teleporter = null return ..() /obj/machinery/gulag_item_reclaimer/emag_act(mob/user, obj/item/card/emag/emag_card) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index ce46a5d2fce..2fffb98d56c 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -43,6 +43,7 @@ The console is located at computer/gulag_teleporter.dm /obj/machinery/gulag_teleporter/Destroy() if(linked_reclaimer) linked_reclaimer.linked_teleporter = null + linked_reclaimer = null return ..() /obj/machinery/gulag_teleporter/interact(mob/user) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index bc0d480af64..d17e99bf24a 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -123,7 +123,7 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/tutorial resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION on_network = FALSE ///Proximity monitor associated with this atom, needed for proximity checks. var/datum/proximity_monitor/proximity_monitor diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 238f0db3f19..34f6d617b6a 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -87,7 +87,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) area.lightswitch = status area.update_appearance() - for(var/obj/machinery/light_switch/light_switch in area) + for(var/obj/machinery/light_switch/light_switch as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light_switch)) + if(light_switch.area != area) + continue light_switch.update_appearance() SEND_SIGNAL(light_switch, COMSIG_LIGHT_SWITCH_SET, status) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 38d88b013d1..0e81f839838 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -283,7 +283,7 @@ /obj/machinery/limbgrower/fullupgrade //Inherently cheaper organ production. This is to NEVER be inherently emagged, no valids. desc = "It grows new limbs using Synthflesh. This alien model seems more efficient." - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION circuit = /obj/item/circuitboard/machine/limbgrower/fullupgrade /obj/machinery/limbgrower/fullupgrade/Initialize(mapload) diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 99ea0d31620..e667fe5b96f 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -176,14 +176,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) data["crime_description"] = crime_description var/list/wanted_info = list() if(GLOB.news_network.wanted_issue) - if(GLOB.news_network.wanted_issue.img) + var/has_wanted_issue = !isnull(GLOB.news_network.wanted_issue.img) + if(has_wanted_issue) user << browse_rsc(GLOB.news_network.wanted_issue.img, "wanted_photo.png") wanted_info = list(list( "active" = GLOB.news_network.wanted_issue.active, "criminal" = GLOB.news_network.wanted_issue.criminal, "crime" = GLOB.news_network.wanted_issue.body, "author" = GLOB.news_network.wanted_issue.scanned_user, - "image" = "wanted_photo.png" + "image" = (has_wanted_issue ? "wanted_photo.png" : null) )) //Code breaking down the channels that have been made on-station thus far. ha @@ -431,7 +432,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) return TRUE if("printNewspaper") - print_paper() + print_paper(usr) return TRUE if("createBounty") @@ -600,22 +601,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) * This takes all current feed stories and messages, and prints them onto a newspaper, after checking that the newscaster has been loaded with paper. * The newscaster then prints the paper to the floor. */ -/obj/machinery/newscaster/proc/print_paper() +/obj/machinery/newscaster/proc/print_paper(mob/user) if(paper_remaining <= 0) balloon_alert_to_viewers("out of paper!") return TRUE SSblackbox.record_feedback("amount", "newspapers_printed", 1) - var/obj/item/newspaper/new_newspaper = new /obj/item/newspaper - for(var/datum/feed_channel/iterated_feed_channel in GLOB.news_network.network_channels) - new_newspaper.news_content += iterated_feed_channel - if(GLOB.news_network.wanted_issue.active) - new_newspaper.wantedAuthor = GLOB.news_network.wanted_issue.scanned_user - new_newspaper.wantedCriminal = GLOB.news_network.wanted_issue.criminal - new_newspaper.wantedBody = GLOB.news_network.wanted_issue.body - if(GLOB.news_network.wanted_issue.img) - new_newspaper.wantedPhoto = GLOB.news_network.wanted_issue.img - new_newspaper.forceMove(drop_location()) - new_newspaper.creation_time = GLOB.news_network.last_action + var/obj/item/newspaper/new_newspaper = new(loc) + playsound(loc, SFX_PAGE_TURN, 50, TRUE) + try_put_in_hand(new_newspaper, user) paper_remaining-- /** @@ -677,6 +670,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) new_feed_comment.author = newscaster_username new_feed_comment.body = comment_text new_feed_comment.time_stamp = station_time_timestamp() + GLOB.news_network.last_action ++ current_message.comments += new_feed_comment usr.log_message("(as [newscaster_username]) commented on message [current_message.return_body(-1)] -- [current_message.body]", LOG_COMMENT) creating_comment = FALSE diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm index d605d6257c3..e67910974a6 100644 --- a/code/game/machinery/newscaster/newspaper.dm +++ b/code/game/machinery/newscaster/newspaper.dm @@ -1,3 +1,8 @@ +/** + * Newspapers + * A static version of the newscaster, that won't update as new stories are added. + * Can be scribbed upon to add extra text for future readers. + */ /obj/item/newspaper name = "newspaper" desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." @@ -10,167 +15,171 @@ attack_verb_continuous = list("baps") attack_verb_simple = list("bap") resistance_flags = FLAMMABLE - var/screen = 0 - var/pages = 0 - var/curr_page = 0 + + ///List of news feeed channels the newspaper can see. var/list/datum/feed_channel/news_content = list() - var/scribble="" - var/scribble_page = null - var/wantedAuthor - var/wantedCriminal - var/wantedBody - var/wantedPhoto + ///The time the newspaper was made in terms of newscaster's last action, used to tell the newspaper whether a story should be in it. var/creation_time + ///The page in the newspaper currently being read. 0 is the title screen while the last is the security screen. + var/current_page = 0 + ///The currently scribbled text written in scribble_page + var/scribble_text + ///The page with something scribbled on it, can only have one at a time. + var/scribble_page + + ///Stored information of the wanted criminal's name, if one existed at the time of creation. + var/saved_wanted_criminal + ///Stored information of the wanted criminal's description, if one existed at the time of creation. + var/saved_wanted_body + ///Stored icon of the wanted criminal, if one existed at the time of creation. + var/icon/saved_wanted_icon + +/obj/item/newspaper/Initialize(mapload) + . = ..() + register_context() + creation_time = GLOB.news_network.last_action + for(var/datum/feed_channel/iterated_feed_channel in GLOB.news_network.network_channels) + news_content += iterated_feed_channel + + if(!GLOB.news_network.wanted_issue.active) + return + saved_wanted_criminal = GLOB.news_network.wanted_issue.criminal + saved_wanted_body = GLOB.news_network.wanted_issue.body + if(GLOB.news_network.wanted_issue.img) + saved_wanted_icon = GLOB.news_network.wanted_issue.img + +/obj/item/newspaper/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item) + if(istype(held_item, /obj/item/pen)) + context[SCREENTIP_CONTEXT_LMB] = "Scribble" + return CONTEXTUAL_SCREENTIP_SET + if(held_item.get_temperature()) + context[SCREENTIP_CONTEXT_LMB] = "Burn" + return CONTEXTUAL_SCREENTIP_SET /obj/item/newspaper/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... until [user.p_their()] eyes light up with realization!")) - user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced="newspaper suicide") - var/mob/living/carbon/human/H = user - var/obj/W = new /obj/item/reagent_containers/cup/glass/bottle/whiskey(H.loc) - playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), TRUE) - W.reagents.trans_to(H, W.reagents.total_volume, transferred_by = user) - user.visible_message(span_suicide("[user] downs the contents of [W.name] in one gulp! Shoulda stuck to sudoku!")) + user.visible_message(span_suicide(\ + "[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... \ + until [user.p_their()] eyes light up with realization!"\ + )) + user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced = "newspaper suicide") + var/obj/item/reagent_containers/cup/glass/bottle/whiskey/last_drink = new(user.loc) + playsound(user, 'sound/items/drink.ogg', vol = rand(10, 50), vary = TRUE) + last_drink.reagents.trans_to(user, last_drink.reagents.total_volume, transferred_by = user) + user.visible_message(span_suicide("[user] downs the contents of [last_drink.name] in one gulp! Shoulda stuck to sudoku!")) return TOXLOSS -/obj/item/newspaper/attack_self(mob/user) - if(!istype(user) || !user.can_read(src)) +/obj/item/newspaper/attackby(obj/item/attacking_item, mob/user, params) + if(burn_paper_product_attackby_check(attacking_item, user)) + SStgui.close_uis(src) return - var/dat - pages = 0 - switch(screen) - if(0) //Cover - dat+="
The Griffon
" - dat+="
Nanotrasen-standard newspaper, for use on Nanotrasen? Space Facilities

" - if(!length(news_content)) - if(wantedAuthor) - dat+="Contents:
" - else - dat+="Other than the title, the rest of the newspaper is unprinted..." - else - dat+="Contents:
" - if(scribble_page == curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Next Page
Done reading
" - if(1) // X channel pages inbetween. - for(var/datum/feed_channel/NP in news_content) - pages++ - var/datum/feed_channel/C = news_content[curr_page] - dat += "[C.channel_name] \[created by: [C.return_author(notContent(C.author_censor_time))]\]

" - if(notContent(C.D_class_censor_time)) - dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." - else - if(!length(C.messages)) - dat+="No Feed stories stem from this channel..." - else - var/i = 0 - for(var/datum/feed_message/MESSAGE in C.messages) - if(MESSAGE.creation_time > creation_time) - if(i == 0) - dat+="No Feed stories stem from this channel..." - break - if(i == 0) - dat+="" - if(scribble_page == curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "

Previous Page
Next Page
" - if(2) //Last page - for(var/datum/feed_channel/NP in news_content) - pages++ - if(wantedAuthor != null) - dat+="
Wanted Issue:


" - dat+="Criminal name: [wantedCriminal]
" - dat+="Description: [wantedBody]
" - dat+="Photo:: " - if(wantedPhoto) - user << browse_rsc(wantedPhoto, "tmp_photow.png") - dat+="
" - else - dat+="None" - else - dat+="Apart from some uninteresting classified ads, there's nothing on this page..." - if(scribble_page == curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Previous Page
" - dat+="

[curr_page+1]
" - user << browse(dat, "window=newspaper_main;size=300x400") - onclose(user, "newspaper_main") -/obj/item/newspaper/proc/notContent(list/L) - if(!L.len) + if(!user.can_write(attacking_item)) + return ..() + if(scribble_page == current_page) + user.balloon_alert(user, "already scribbled!") + return + var/new_scribble_text = tgui_input_text(user, "What do you want to scribble?", "Write something") + if(isnull(new_scribble_text)) + return + add_fingerprint(user) + user.balloon_alert(user, "scribbling...") + if(!do_after(user, 2 SECONDS, src)) + return + user.balloon_alert(user, "scribbled!") + scribble_page = current_page + scribble_text = new_scribble_text + +///Checks the creation time of the newspaper and compares it to list to see if the list is meant to be censored at the time of printing. +/obj/item/newspaper/proc/censored_check(list/times_censored) + if(!times_censored.len) return FALSE - for(var/i=L.len;i>0;i--) - var/num = abs(L[i]) + for(var/i = times_censored.len; i > 0; i--) + var/num = abs(times_censored[i]) if(creation_time <= num) continue else - if(L[i] > 0) + if(times_censored[i] > 0) return TRUE else return FALSE return FALSE -/obj/item/newspaper/Topic(href, href_list) - var/mob/living/U = usr - ..() - if((src in U.contents) || (isturf(loc) && in_range(src, U))) - U.set_machine(src) - if(href_list["next_page"]) - if(curr_page == pages+1) - return //Don't need that at all, but anyway. - if(curr_page == pages) //We're at the middle, get to the end - screen = 2 - else - if(curr_page == 0) //We're at the start, get to the middle - screen=1 - curr_page++ - playsound(loc, SFX_PAGE_TURN, 50, TRUE) - else if(href_list["prev_page"]) - if(curr_page == 0) - return - if(curr_page == 1) - screen = 0 - else - if(curr_page == pages+1) //we're at the end, let's go back to the middle. - screen = 1 - curr_page-- - playsound(loc, SFX_PAGE_TURN, 50, TRUE) - if(ismob(loc)) - attack_self(loc) +/obj/item/newspaper/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Newspaper", name) + ui.open() -/obj/item/newspaper/attackby(obj/item/W, mob/living/user, params) - if(burn_paper_product_attackby_check(W, user)) +/obj/item/newspaper/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) return - if(istype(W, /obj/item/pen)) - if(!user.can_write(W)) - return - if(scribble_page == curr_page) - to_chat(user, span_warning("There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")) + switch(action) + if("next_page") + //We're at the very end, nowhere else to go. + if(current_page == news_content.len + 1) + return TRUE + current_page++ + if("prev_page") + //We haven't started yet, nowhere else to go. + if(!current_page) + return TRUE + current_page-- else - var/s = tgui_input_text(user, "Write something", "Newspaper") - if (!s) - return - if(!user.can_perform_action(src)) - return - scribble_page = curr_page - scribble = s - attack_self(user) - add_fingerprint(user) - else - return ..() + return TRUE + SStgui.update_uis(src) + playsound(src, SFX_PAGE_TURN, 50, TRUE) + return TRUE + +/obj/item/newspaper/ui_static_data(mob/user) + var/list/data = list() + data["channels"] = list() + for(var/datum/feed_channel/news_channels as anything in news_content) + data["channels"] += list(list( + "name" = news_channels.channel_name, + "page_number" = news_content.Find(news_channels), + )) + return data + +/obj/item/newspaper/ui_data(mob/user) + var/list/data = list() + data["current_page"] = current_page + data["scribble_message"] = (scribble_page == current_page) ? scribble_text : null + if(saved_wanted_icon) + user << browse_rsc(saved_wanted_icon, "wanted_photo.png") + data["wanted_criminal"] = saved_wanted_criminal + data["wanted_body"] = saved_wanted_body + data["wanted_photo"] = (saved_wanted_icon ? "wanted_photo.png" : null) + + var/list/channel_data = list() + if(!current_page || (current_page == news_content.len + 1)) + channel_data["channel_name"] = null + channel_data["author_name"] = null + channel_data["is_censored"] = null + channel_data["channel_messages"] = list() + data["channel_data"] = list(channel_data) + return data + var/datum/feed_channel/current_channel = news_content[current_page] + if(istype(current_channel)) + channel_data["channel_name"] = current_channel.channel_name + channel_data["author_name"] = current_channel.return_author(censored_check(current_channel.author_censor_time)) + channel_data["is_censored"] = censored_check(current_channel.D_class_censor_time) + channel_data["channel_messages"] = list() + for(var/datum/feed_message/feed_messages as anything in current_channel.messages) + if(feed_messages.creation_time > creation_time) + data["channel_has_messages"] = FALSE + break + data["channel_has_messages"] = TRUE + var/has_image = FALSE + if(feed_messages.img) + has_image = TRUE + user << browse_rsc(feed_messages.img, "tmp_photo[feed_messages.message_ID].png") + channel_data["channel_messages"] += list(list( + "message" = "-[feed_messages.return_body(censored_check(feed_messages.body_censor_time))]", + "photo" = (has_image ? "tmp_photo[feed_messages.message_ID].png" : null), + "author" = feed_messages.return_author(censored_check(feed_messages.author_censor_time)), + )) + data["channel_data"] = list(channel_data) + return data diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index a4deb63ae21..0f6002c9725 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -155,7 +155,7 @@ continue var/obj/item/bodypart/head/as_head = thing var/obj/item/mmi/as_mmi = thing - if(istype(thing, /obj/item/organ/internal/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(thing, /obj/item/dullahan_relay)) + if(istype(thing, /obj/item/organ/internal/brain) || (istype(as_head) && locate(/obj/item/organ/internal/brain) in as_head) || (istype(as_mmi) && as_mmi.brain) || istype(thing, /obj/item/dullahan_relay)) living_detected = TRUE if(isitem(as_object)) var/obj/item/as_item = as_object diff --git a/code/game/machinery/sleepers.dm b/code/game/machinery/sleepers.dm index 42a6c0d1948..daa474029f6 100644 --- a/code/game/machinery/sleepers.dm +++ b/code/game/machinery/sleepers.dm @@ -178,7 +178,6 @@ . += span_notice("Alt-click [src] to [state_open ? "close" : "open"] it.") /obj/machinery/sleeper/process() - ..() use_power(idle_power_usage) /obj/machinery/sleeper/nap_violation(mob/violator) diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index 400d827f618..6cf18323105 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -1,127 +1,157 @@ -/* - Telecomms monitor tracks the overall trafficing of a telecommunications network - and displays a heirarchy of linked machines. -*/ - #define MAIN_VIEW 0 #define MACHINE_VIEW 1 #define MAX_NETWORK_ID_LENGTH 15 /obj/machinery/computer/telecomms/monitor name = "telecommunications monitoring console" - icon_screen = "comm_monitor" desc = "Monitors the details of the telecommunications network it's synced with." - /// Current screen the user is viewing - var/screen = MAIN_VIEW - /// Weakrefs of the machines located by the computer - var/list/machine_list = list() + circuit = /obj/item/circuitboard/computer/comm_monitor + + icon_screen = "comm_monitor" + /// Weakref of the currently selected tcomms machine - var/datum/weakref/selected_machine_ref + var/datum/weakref/selected_machine_ref = null + /// Weakrefs of the machines located by the computer + var/list/datum/weakref/machine_refs + + /// Currently displayed "tab" + var/screen = MAIN_VIEW /// The network to probe var/network = "NULL" /// Error message to show - var/error_message = "" - circuit = /obj/item/circuitboard/computer/comm_monitor + var/status_message = null -/obj/machinery/computer/telecomms/monitor/ui_data(mob/user) - var/list/data = list( - "screen" = screen, - "network" = network, - "error_message" = error_message, +/obj/machinery/computer/telecomms/monitor/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + LAZYINITLIST(machine_refs) + +/obj/machinery/computer/telecomms/monitor/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/telecomms), ) +/obj/machinery/computer/telecomms/monitor/ui_interact(mob/user, datum/tgui/ui) + . = ..() + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "TelecommsMonitor") + ui.open() + +/obj/machinery/computer/telecomms/monitor/ui_data(mob/user) + var/list/data = list() + + data["screen"] = screen + data["statusMessage"] = status_message + switch(screen) - // --- Main Menu --- if(MAIN_VIEW) - var/list/found_machinery = list() - for(var/datum/weakref/tcomms_ref in machine_list) - var/obj/machinery/telecomms/telecomms = tcomms_ref.resolve() - if(!telecomms) - machine_list -= tcomms_ref + data["network"] = network + + data["machines"] = list() + for(var/datum/weakref/machine_ref in machine_refs) + var/obj/machinery/telecomms/machine = machine_ref.resolve() + if(isnull(machine)) + machine_refs -= machine_ref continue - found_machinery += list(list("ref" = REF(telecomms), "name" = telecomms.name, "id" = telecomms.id)) - data["machinery"] = found_machinery - // --- Viewing Machine --- + + data["machines"] += list(list( + "id" = machine.id, + "name" = machine.name, + "icon" = initial(machine.icon_state), + )) + if(MACHINE_VIEW) - // Send selected machinery data - var/list/machine_out = list() - var/obj/machinery/telecomms/selected = selected_machine_ref.resolve() - if(selected) - machine_out["name"] = selected.name - // Get the linked machinery - var/list/linked_machinery = list() - for(var/obj/machinery/telecomms/T in selected.links) - linked_machinery += list(list("ref" = REF(T.id), "name" = T.name, "id" = T.id)) - machine_out["linked_machinery"] = linked_machinery - data["machine"] = machine_out + var/obj/machinery/telecomms/selected = selected_machine_ref?.resolve() + if(!isnull(selected)) + var/list/linked_machines = list() + for(var/obj/machinery/telecomms/machine as anything in selected.links) + linked_machines += list(list( + "id" = machine.id, + "name" = machine.name, + "icon" = initial(machine.icon_state), + )) + + data["machine"] = list( + "id" = selected.id, + "name" = selected.name, + "network" = selected.network, + "linkedMachines" = linked_machines, + ) + return data /obj/machinery/computer/telecomms/monitor/ui_act(action, params) . = ..() if(.) - return . + return - error_message = "" + status_message = null switch(action) - // Scan for a network - if("probe_network") - var/new_network = params["network_id"] - - if(length(new_network) > MAX_NETWORK_ID_LENGTH) - error_message = "OPERATION FAILED: NETWORK ID TOO LONG." - return TRUE - - list_clear_empty_weakrefs(machine_list) - - if(machine_list.len > 0) - error_message = "OPERATION FAILED: CANNOT PROBE WHEN BUFFER FULL." - return TRUE - - network = new_network - - for(var/obj/machinery/telecomms/T in urange(25, src)) - if(T.network == network) - machine_list += WEAKREF(T) - if(machine_list.len == 0) - error_message = "OPERATION FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN [network]." - return TRUE - error_message = "[machine_list.len] ENTITIES LOCATED & BUFFERED"; - return TRUE - if("flush_buffer") - machine_list = list() + if("flush") + machine_refs = list() network = "" return TRUE - if("view_machine") - for(var/datum/weakref/tcomms_ref in machine_list) - var/obj/machinery/telecomms/tcomms = tcomms_ref.resolve() - if(!tcomms) - machine_list -= tcomms_ref - continue - if(tcomms.id == params["id"]) - selected_machine_ref = tcomms_ref - if(!selected_machine_ref) - error_message = "OPERATION FAILED: UNABLE TO LOCATE MACHINERY." - screen = MACHINE_VIEW - return TRUE - if("return_home") + + if("home") selected_machine_ref = null screen = MAIN_VIEW return TRUE + + if("view") + var/machine_id = params["id"] + if(isnull(machine_id)) + return + + for(var/datum/weakref/machine_ref as anything in machine_refs) + var/obj/machinery/telecomms/machine = machine_ref.resolve() + if(isnull(machine)) + machine_refs -= machine_ref + continue + + if(machine.id != machine_id) + continue + + selected_machine_ref = machine_ref + screen = MACHINE_VIEW + + if(isnull(selected_machine_ref)) + status_message = "OPERATION FAILED: UNABLE TO LOCATE MACHINERY." + + return TRUE + + if("probe") + var/network_id = params["id"] + if(length(network_id) > MAX_NETWORK_ID_LENGTH) + status_message = "OPERATION FAILED: NETWORK ID TOO LONG." + return TRUE + + list_clear_empty_weakrefs(machine_refs) + + if(length(machine_refs) > 0) + status_message = "OPERATION FAILED: CANNOT PROBE WHEN BUFFER FULL." + return TRUE + + network = network_id + + var/list/telecomms_machines = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/telecomms) + for(var/obj/machinery/telecomms/machine as anything in telecomms_machines) + if(machine.network != network) + continue + + machine_refs += WEAKREF(machine) + + if(length(machine_refs) == 0) + status_message = "OPERATION FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN [network]." + return TRUE + + status_message = "[length(machine_refs)] ENTITIES LOCATED & BUFFERED" + return TRUE + return TRUE -/obj/machinery/computer/telecomms/monitor/attackby() - . = ..() - updateUsrDialog() - -/obj/machinery/computer/telecomms/monitor/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if (!ui) - ui = new(user, src, "TelecommsMonitor", name) - ui.open() - #undef MAIN_VIEW #undef MACHINE_VIEW #undef MAX_NETWORK_ID_LENGTH diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 931979f6b0a..f8a6b66c049 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -20,7 +20,7 @@ /obj/machinery/telecomms/allinone/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /obj/machinery/telecomms/allinone/receive_signal(datum/signal/subspace/signal) if(!istype(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE) // receives on subspace only diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional.dm b/code/game/objects/effects/anomalies/anomalies_dimensional.dm index 2d9b8ec71b4..9aea9dfea6a 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional.dm @@ -8,7 +8,7 @@ /// Range of effect, if left alone anomaly will convert a 2(range)+1 squared area. var/range = 3 /// List of turfs this anomaly will try to transform before relocating - var/list/turf/target_turfs = new() + var/list/turf/target_turfs = list() /// Current anomaly 'theme', dictates what tiles to create. var/datum/dimension_theme/theme /// Effect displaying on the anomaly to represent the theme. @@ -38,7 +38,7 @@ var/turf/affected_turf = target_turfs[1] new /obj/effect/temp_visual/transmute_tile_flash(affected_turf) theme.apply_theme(affected_turf) - target_turfs.Remove(affected_turf) + target_turfs -= affected_turf /** * Prepare a new area for transformation into a new theme. @@ -50,11 +50,10 @@ theme = new new_theme_path() apply_theme_icon() - target_turfs = new() - var/list/turfs = spiral_range_turfs(range, src) - for (var/turf/turf in turfs) + target_turfs = list() + for (var/turf/turf as anything in spiral_range_turfs(range, src)) if (theme.can_convert(turf)) - target_turfs.Add(turf) + target_turfs += turf /** * Applies an overlay icon based on the current theme. diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index d1500e8bd89..16408ea9ce6 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -3,6 +3,8 @@ * Datum which describes a theme and replaces turfs and objects in specified locations to match that theme */ /datum/dimension_theme + /// Human readable name of the theme + var/name = "Unnamed Theme" /// An icon to display to represent the theme var/icon/icon /// Icon state to use to represent the theme @@ -16,11 +18,16 @@ /// Typepath of turf to replace walls with. var/turf/replace_walls = /turf/closed/wall/material /// List of weighted lists for object replacement. Key is an original typepath, value is a weighted list of typepaths to replace it with. - var/list/replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/greyscale = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/material = 1, /obj/machinery/door/airlock/material/glass = 1), \ - /obj/structure/table = list(/obj/structure/table/greyscale = 1), \ - /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1),) + var/list/replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/greyscale = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/material = 1, /obj/machinery/door/airlock/material/glass = 1), + /obj/structure/table = list(/obj/structure/table/greyscale = 1), + /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), + ) + /// List of random spawns to place in completely open turfs + var/list/random_spawns + /// Prob of placing a random spawn in a completely open turf + var/random_spawn_chance = 0 /// Typepath of full-size windows which will replace existing ones /// These need to be separate from replace_objs because we don't want to replace dir windows with full ones and they share typepath var/obj/structure/window/replace_window @@ -38,15 +45,33 @@ * Arguments * * affected_turf - Turf to transform. */ -/datum/dimension_theme/proc/apply_theme(turf/affected_turf) +/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE) if (!replace_turf(affected_turf)) return - playsound(affected_turf, sound, 100, TRUE) + if (!skip_sound) + playsound(affected_turf, sound, 100, TRUE) for (var/obj/object in affected_turf) replace_object(object) + if (length(random_spawns) && prob(random_spawn_chance) && !affected_turf.is_blocked_turf(exclude_mobs = TRUE)) + var/random_spawn_picked = pick(random_spawns) + new random_spawn_picked(affected_turf) if (material) apply_materials(affected_turf) +/** + * Applies the transformation to a list of turfs, ensuring a sound is only played every few turfs to reduce noice spam + * + * Arguments + * * list/turf/all_turfs - List of turfs to transform. + */ +/datum/dimension_theme/proc/apply_theme_to_list_of_turfs(list/turf/all_turfs) + var/every_nth_turf = 0 + for (var/turf/turf as anything in all_turfs) + if(can_convert(turf)) + apply_theme(turf, skip_sound = (every_nth_turf % 7 != 0)) + every_nth_turf++ + CHECK_TICK + /** * Returns true if you actually can transform the provided turf. * @@ -75,6 +100,8 @@ * * affected_turf - Turf to transform. */ /datum/dimension_theme/proc/replace_turf(turf/affected_turf) + PROTECTED_PROC(TRUE) + if (isfloorturf(affected_turf)) if (isindestructiblefloor(affected_turf)) return FALSE @@ -96,6 +123,8 @@ * * affected_floor - Floor turf to transform. */ /datum/dimension_theme/proc/transform_floor(turf/open/floor/affected_floor) + PROTECTED_PROC(TRUE) + if (replace_floors.len == 0) return FALSE affected_floor.replace_floor(pick_weight(replace_floors), flags = CHANGETURF_INHERIT_AIR) @@ -108,6 +137,8 @@ * * object - Object to replace. */ /datum/dimension_theme/proc/replace_object(obj/object) + PROTECTED_PROC(TRUE) + if (istype(object, /obj/structure/window)) transform_window(object) return @@ -128,10 +159,11 @@ * * object - Object to transform. */ /datum/dimension_theme/proc/get_replacement_object_typepath(obj/object) + PROTECTED_PROC(TRUE) + for (var/type in replace_objs) if (istype(object, type)) return pick_weight(replace_objs[type]) - return /** * Replaces a window with a different window and recolours it. @@ -141,6 +173,8 @@ * * object - Object to transform. */ /datum/dimension_theme/proc/transform_window(obj/structure/window/window) + PROTECTED_PROC(TRUE) + if (!window.fulltile) return if (!replace_window) @@ -166,10 +200,10 @@ * * object - Object to transform. */ /datum/dimension_theme/proc/permit_replace_material(obj/object) - for (var/type in PERMITTED_MATERIAL_REPLACE_TYPES) - if (istype(object, type)) - return TRUE - return FALSE + PROTECTED_PROC(TRUE) + + return is_type_in_list(object, PERMITTED_MATERIAL_REPLACE_TYPES) + /** * Applies a new custom material to the contents of a provided turf. @@ -178,6 +212,8 @@ * * affected_turf - Turf to transform. */ /datum/dimension_theme/proc/apply_materials(turf/affected_turf) + PROTECTED_PROC(TRUE) + var/list/custom_materials = list(GET_MATERIAL_REF(material) = SHEET_MATERIAL_AMOUNT) if (istype(affected_turf, /turf/open/floor/material) || istype(affected_turf, /turf/closed/wall/material)) @@ -193,79 +229,110 @@ ///////////////////// /datum/dimension_theme/gold + name = "Gold" icon = 'icons/obj/stack_objects.dmi' icon_state = "sheet-gold_2" material = /datum/material/gold /datum/dimension_theme/plasma + name = "Plasma" icon = 'icons/obj/clothing/masks.dmi' icon_state = "gas_alt" material = /datum/material/plasma /datum/dimension_theme/clown + name = "Clown" icon = 'icons/obj/clothing/masks.dmi' icon_state = "clown" material = /datum/material/bananium sound = 'sound/items/bikehorn.ogg' /datum/dimension_theme/radioactive + name = "Radioactive" icon = 'icons/obj/ore.dmi' icon_state = "Uranium ore" material = /datum/material/uranium sound = 'sound/items/welder.ogg' /datum/dimension_theme/meat + name = "Meat" icon = 'icons/obj/food/meat.dmi' icon_state = "meat" material = /datum/material/meat sound = 'sound/items/eatfood.ogg' /datum/dimension_theme/pizza + name = "Pizza" icon = 'icons/obj/food/pizza.dmi' icon_state = "pizzamargherita" material = /datum/material/pizza sound = 'sound/items/eatfood.ogg' /datum/dimension_theme/natural + name = "Natural" icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "map_flower" window_colour = "#00f7ff" replace_floors = list(/turf/open/floor/grass = 1) replace_walls = /turf/closed/wall/mineral/wood/nonmetal - replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/wood = 3, /obj/structure/chair/wood/wings = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), \ - /obj/structure/table = list(/obj/structure/table/wood = 5, /obj/structure/table/wood/fancy = 1),) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/wood = 3, /obj/structure/chair/wood/wings = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + /obj/structure/table = list(/obj/structure/table/wood = 5, /obj/structure/table/wood/fancy = 1), + ) /datum/dimension_theme/bamboo + name = "Bamboo" icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "bamboo" replace_floors = list(/turf/open/floor/bamboo = 1) replace_walls = /turf/closed/wall/mineral/bamboo replace_window = /obj/structure/window/paperframe - replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/stool/bamboo = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), \ - /obj/structure/table = list(/obj/structure/table/wood = 1),) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/stool/bamboo = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + /obj/structure/table = list(/obj/structure/table/wood = 1), + ) /datum/dimension_theme/icebox - icon = 'icons/obj/clothing/shoes.dmi' - icon_state = "iceboots" + name = "Winter" + icon = 'icons/obj/clothing/head/costume.dmi' + icon_state = "snowman_h" window_colour = "#00f7ff" material = /datum/material/snow replace_floors = list(/turf/open/floor/fake_snow = 10, /turf/open/floor/fakeice/slippery = 1) replace_walls = /turf/closed/wall/mineral/snow + random_spawns = list( + /obj/structure/flora/grass/both/style_random, + /obj/structure/flora/grass/brown/style_random, + /obj/structure/flora/grass/green/style_random, + ) + random_spawn_chance = 8 + +/datum/dimension_theme/icebox/winter_cabin + name = "Winter Cabin" + icon = 'icons/obj/clothing/shoes.dmi' + icon_state = "iceboots" + replace_walls = /turf/closed/wall/mineral/wood + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/wood = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1), + /obj/structure/table = list(/obj/structure/table/wood = 1), + ) /datum/dimension_theme/lavaland + name = "Lavaland" icon = 'icons/obj/stack_objects.dmi' icon_state = "goliath_hide" window_colour = "#860000" replace_floors = list(/turf/open/floor/fakebasalt = 5, /turf/open/floor/fakepit = 1) replace_walls = /turf/closed/wall/mineral/cult - replace_objs = list(\ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) + replace_objs = list(/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) + random_spawns = list(/mob/living/basic/mining/goldgrub) + random_spawn_chance = 1 /datum/dimension_theme/space + name = "Space" icon = 'icons/effects/effects.dmi' icon_state = "blessed" window_colour = "#000000" @@ -275,6 +342,7 @@ replace_objs = list(/obj/machinery/door/airlock = list(/obj/machinery/door/airlock/external/glass/ruin = 1)) /datum/dimension_theme/glass + name = "Glass" icon = 'icons/obj/debris.dmi' icon_state = "small" material = /datum/material/glass @@ -282,6 +350,7 @@ sound = SFX_SHATTER /datum/dimension_theme/fancy + name = "Fancy" icon = 'icons/obj/clothing/head/costume.dmi' icon_state = "fancycrown" replace_walls = /turf/closed/wall/mineral/wood/nonmetal @@ -301,15 +370,18 @@ /turf/open/floor/carpet/royalblue,) /datum/dimension_theme/fancy/New() + . = ..() replace_floors = list(pick(FANCY_CARPETS) = 1) - replace_objs = list(\ - /obj/structure/chair = list(/obj/structure/chair/comfy = 1), \ - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), \ - /obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1),) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/comfy = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + /obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1), + ) #undef FANCY_CARPETS /datum/dimension_theme/disco + name = "Disco" icon = 'icons/obj/lighting.dmi' icon_state = "lbulb" material = /datum/material/glass @@ -322,3 +394,40 @@ var/turf/open/floor/light/disco_floor = affected_floor disco_floor.currentcolor = pick(disco_floor.coloredlights) disco_floor.update_appearance() + +/datum/dimension_theme/jungle + name = "Jungle" + icon = 'icons/obj/tiles.dmi' + icon_state = "tile_grass" + sound = SFX_CRUNCHY_BUSH_WHACK + replace_floors = list(/turf/open/floor/grass = 1) + replace_walls = /turf/closed/wall/mineral/wood + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/wood = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1), + /obj/structure/table = list(/obj/structure/table/wood = 1), + ) + random_spawns = list( + /mob/living/carbon/human/species/monkey, + /obj/structure/flora/bush/ferny/style_random, + /obj/structure/flora/bush/grassy/style_random, + /obj/structure/flora/bush/leavy/style_random, + /obj/structure/flora/tree/palm/style_random, + /obj/structure/flora/bush/sparsegrass/style_random, + /obj/structure/flora/bush/sunny/style_random, + ) + random_spawn_chance = 20 + +/datum/dimension_theme/ayylmao + name = "Alien" + icon = 'icons/obj/antags/abductor.dmi' + icon_state = "sheet-abductor" + material = /datum/material/alloy/alien + replace_walls = /turf/closed/wall/mineral/abductor + replace_floors = list(/turf/open/floor/mineral/abductor = 1) + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/greyscale = 9, /obj/structure/bed/abductor = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/material = 1, /obj/machinery/door/airlock/material/glass = 2), + /obj/structure/table = list(/obj/structure/table/greyscale = 9, /obj/structure/table/abductor = 1), + /obj/structure/toilet = list(/obj/structure/toilet/greyscale = 1), + ) diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index 3e6d84d809a..7a04aaf2435 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -62,9 +62,7 @@ if(effect_power >= 10) //Performs something akin to a revenant defile spell. var/effect_range = ghosts_orbiting + 3 - var/effect_area = range(effect_range, src) - - for(var/impacted_thing in effect_area) + for(var/impacted_thing in range(effect_range, src)) if(isfloorturf(impacted_thing)) if(prob(5)) new /obj/effect/decal/cleanable/blood(get_turf(impacted_thing)) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 8a80692f1a9..c93b105767a 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -484,3 +484,17 @@ if(item.ignition_effect(src, user)) ignite() return ..() + +/obj/effect/decal/cleanable/rubble + name = "rubble" + desc = "A pile of rubble." + icon = 'icons/obj/debris.dmi' + icon_state = "rubble" + mergeable_decal = FALSE + beauty = -10 + +/obj/effect/decal/cleanable/rubble/Initialize(mapload) + . = ..() + flick("rubble_bounce", src) + icon_state = "rubble" + update_appearance(UPDATE_ICON_STATE) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4a8ad3f4cad..ee77a474139 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1092,7 +1092,7 @@ skill_modifier = user.mind.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER) if(user.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_JOURNEYMAN && prob(user.mind.get_skill_modifier(/datum/skill/mining, SKILL_PROBS_MODIFIER))) // we check if the skill level is greater than Journeyman and then we check for the probality for that specific level. - mineral_scan_pulse(get_turf(user), SKILL_LEVEL_JOURNEYMAN - 2) //SKILL_LEVEL_JOURNEYMAN = 3 So to get range of 1+ we have to subtract 2 from it,. + mineral_scan_pulse(get_turf(user), SKILL_LEVEL_JOURNEYMAN - 2, scanner = src) //SKILL_LEVEL_JOURNEYMAN = 3 So to get range of 1+ we have to subtract 2 from it,. delay *= toolspeed * skill_modifier @@ -1734,3 +1734,6 @@ if (!isnull(tool_behaviour)) return list(tool_behaviour) return null + +/obj/item/animate_atom_living(mob/living/owner) + new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm index 47b36843d01..5557d457d4a 100644 --- a/code/game/objects/items/binoculars.dm +++ b/code/game/objects/items/binoculars.dm @@ -9,46 +9,21 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' slot_flags = ITEM_SLOT_NECK | ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL - var/mob/listeningTo - var/zoom_out_amt = 5.5 - var/zoom_amt = 10 /obj/item/binoculars/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12, wield_callback = CALLBACK(src, PROC_REF(on_wield)), unwield_callback = CALLBACK(src, PROC_REF(on_unwield))) - -/obj/item/binoculars/Destroy() - listeningTo = null - return ..() + AddComponent(/datum/component/scope, range_modifier = 4, zoom_method = ZOOM_METHOD_WIELD) /obj/item/binoculars/proc/on_wield(obj/item/source, mob/user) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_walk)) - RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate)) - listeningTo = user user.visible_message(span_notice("[user] holds [src] up to [user.p_their()] eyes."), span_notice("You hold [src] up to your eyes.")) inhand_icon_state = "binoculars_wielded" user.regenerate_icons() - user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, user.dir) - -/obj/item/binoculars/proc/rotate(atom/thing, old_dir, new_dir) - SIGNAL_HANDLER - - if(ismob(thing)) - var/mob/lad = thing - lad.regenerate_icons() - lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) - -/obj/item/binoculars/proc/on_walk() - SIGNAL_HANDLER - - attack_self(listeningTo) //Yes I have sinned, why do you ask? + //Have you ever tried running with binocs on? It takes some willpower not to stop as things appear way too close than they're. + user.add_movespeed_modifier(/datum/movespeed_modifier/binocs_wielded) /obj/item/binoculars/proc/on_unwield(obj/item/source, mob/user) - if(listeningTo) - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) - listeningTo = null user.visible_message(span_notice("[user] lowers [src]."), span_notice("You lower [src].")) inhand_icon_state = "binoculars" user.regenerate_icons() - user.client.view_size.zoomIn() + user.remove_movespeed_modifier(/datum/movespeed_modifier/binocs_wielded) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index b8419235aae..82fc3437f20 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -238,7 +238,7 @@ return //stuff tied to the area to rename - var/list/to_rename = list( + var/static/list/to_rename = typecacheof(list( /obj/machinery/airalarm, /obj/machinery/atmospherics/components/unary/vent_scrubber, /obj/machinery/atmospherics/components/unary/vent_pump, @@ -246,9 +246,9 @@ /obj/machinery/firealarm, /obj/machinery/light_switch, /obj/machinery/power/apc, - ) - - for(var/obj/machine as anything in area) - if(is_type_in_list(machine, to_rename)) - machine.name = replacetext(machine.name, oldtitle, title) + )) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for (var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machine as anything in typecache_filter_list(area_turf.contents, to_rename)) + machine.name = replacetext(machine.name, oldtitle, title) //TODO: much much more. Unnamed airlocks, cameras, etc. diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index b1780d24513..9c9341ac368 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -356,7 +356,8 @@ var/list/wildcard_access = list() var/list/normal_access = list() - build_access_lists(new_access_list, normal_access, wildcard_access) + if(length(new_access_list)) + build_access_lists(new_access_list, normal_access, wildcard_access) // Check if we can add the wildcards. if(mode == ERROR_ON_FAIL) @@ -441,14 +442,11 @@ /obj/item/card/id/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - if(held_item != src) - return - context[SCREENTIP_CONTEXT_LMB] = "Show ID" context[SCREENTIP_CONTEXT_RMB] = "Project pay stand" if(isnull(registered_account) || registered_account.replaceable) //Same check we use when we check if we can assign an account - context[SCREENTIP_CONTEXT_ALT_LMB] = "Assign account" - else + context[SCREENTIP_CONTEXT_ALT_RMB] = "Assign account" + if(!registered_account.replaceable || registered_account.account_balance > 0) context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw credits" return CONTEXTUAL_SCREENTIP_SET @@ -676,9 +674,6 @@ /obj/item/card/id/AltClick(mob/living/user) if(!alt_click_can_use_id(user)) return - if(!registered_account || registered_account.replaceable) - set_new_account(user) - return 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) @@ -692,6 +687,13 @@ if(loc != user) to_chat(user, span_warning("You must be holding the ID to continue!")) return + if(registered_account.replaceable && !registered_account.account_balance) + var/choice = tgui_alert(user, "This card's account is unassigned. Would you like to link a bank account?", "Bank Account", list("Link Account", "Leave Unassigned")) + if(!choice || QDELETED(user) || QDELETED(src) || !alt_click_can_use_id(user) || loc != user) + return + if(choice == "Link Account") + set_new_account(user) + return var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] cr)", "Withdraw Funds", max_value = registered_account.account_balance) if(!amount_to_remove || QDELETED(user) || QDELETED(src) || issilicon(user) || loc != user) return @@ -708,6 +710,14 @@ 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) +/obj/item/card/id/alt_click_secondary(mob/user) + . = ..() + if(!alt_click_can_use_id(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!registered_account || registered_account.replaceable) + set_new_account(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + /obj/item/card/id/proc/pay_debt(user) var/amount_to_pay = tgui_input_number(user, "How much do you want to pay? (Max: [registered_account.account_balance] cr)", "Debt Payment", max_value = min(registered_account.account_balance, registered_account.account_debt)) if(!amount_to_pay || QDELETED(src) || loc != user || !alt_click_can_use_id(user)) @@ -725,11 +735,13 @@ if(!user.can_read(src)) return - if(registered_account) + if(registered_account && !isnull(registered_account.account_id)) . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." if(ACCESS_COMMAND in access) var/datum/bank_account/linked_dept = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) . += "The [linked_dept.account_holder] linked to the ID reports a balance of [linked_dept.account_balance] cr." + else + . += span_notice("Alt-Right-Click the ID to set the linked bank account.") 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.") @@ -776,6 +788,8 @@ . += "The [D.account_holder] reports a balance of [D.account_balance] cr." . += span_info("Alt-Click the ID to pull money from the linked account in the form of holochips.") . += span_info("You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.") + if(registered_account.replaceable) + . += span_info("Alt-Right-Click the ID to change the linked bank account.") if(registered_account.civilian_bounty) . += "There is an active civilian bounty." . += span_info("[registered_account.bounty_text()]") diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 0805f6b5233..68501057ebf 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -99,6 +99,28 @@ armour_penetration = 100 force_on = 30 +/obj/item/chainsaw/doomslayer/attack(mob/living/target_mob, mob/living/user, params) + if (target_mob.stat != DEAD) + return ..() + + if (user.zone_selected != BODY_ZONE_HEAD) + return ..() + + var/obj/item/bodypart/head = target_mob.get_bodypart(BODY_ZONE_HEAD) + if (isnull(head)) + return ..() + + playsound(user, 'sound/weapons/slice.ogg', vol = 80, vary = TRUE) + + target_mob.balloon_alert(user, "cutting off head...") + if (!do_after(user, 2 SECONDS, target_mob, extra_checks = CALLBACK(src, PROC_REF(has_same_head), target_mob, head))) + return TRUE + + head.dismember(silent = FALSE) + user.put_in_hands(head) + + return TRUE + /obj/item/chainsaw/doomslayer/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(attack_type == PROJECTILE_ATTACK) owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!")) @@ -106,6 +128,9 @@ return TRUE return FALSE +/obj/item/chainsaw/doomslayer/proc/has_same_head(mob/living/target_mob, obj/item/bodypart/head) + return target_mob.get_bodypart(BODY_ZONE_HEAD) == head + /obj/item/chainsaw/mounted_chainsaw name = "mounted chainsaw" desc = "A chainsaw that has replaced your arm." diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 0645ad04165..3cf352d04bc 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -243,10 +243,10 @@ /datum/stock_part/servo = 1) needs_anchored = FALSE -/obj/item/circuitboard/machine/generator +/obj/item/circuitboard/machine/thermoelectric_generator name = "Thermo-Electric Generator" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/generator + build_path = /obj/machinery/power/thermoelectric_generator req_components = list() /obj/item/circuitboard/machine/ntnet_relay @@ -283,7 +283,7 @@ /obj/item/circuitboard/machine/turbine_compressor name = "Turbine - Inlet Compressor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/inlet_compressor/constructed + build_path = /obj/machinery/power/turbine/inlet_compressor req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -291,7 +291,7 @@ /obj/item/circuitboard/machine/turbine_rotor name = "Turbine - Core Rotor" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/core_rotor/constructed + build_path = /obj/machinery/power/turbine/core_rotor req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -299,7 +299,7 @@ /obj/item/circuitboard/machine/turbine_stator name = "Turbine - Turbine Outlet" greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/power/turbine/turbine_outlet/constructed + build_path = /obj/machinery/power/turbine/turbine_outlet req_components = list( /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/iron = 5) @@ -616,57 +616,60 @@ req_components = list(/obj/item/vending_refill/custom = 1) var/static/list/vending_names_paths = list( - /obj/machinery/vending/boozeomat = "Booze-O-Mat", - /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", - /obj/machinery/vending/snack = "Getmore Chocolate Corp", - /obj/machinery/vending/cola = "Robust Softdrinks", - /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", - /obj/machinery/vending/games = "\improper Good Clean Fun", - /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", - /obj/machinery/vending/wardrobe/det_wardrobe = "DetDrobe", - /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", - /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", - /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", - /obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe", - /obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe", - /obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe", - /obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe", - /obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe", - /obj/machinery/vending/wardrobe/coroner_wardrobe = "MortiDrobe", - /obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe", - /obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe", - /obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe", - /obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe", - /obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe", - /obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe", - /obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe", - /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", - /obj/machinery/vending/clothing = "ClothesMate", - /obj/machinery/vending/medical = "NanoMed Plus", - /obj/machinery/vending/drugs = "NanoDrug Plus", - /obj/machinery/vending/wallmed = "NanoMed", /obj/machinery/vending/assist = "Part-Mart", + /obj/machinery/vending/autodrobe = "AutoDrobe", + /obj/machinery/vending/boozeomat = "Booze-O-Mat", + /obj/machinery/vending/cart = "PTech", + /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", + /obj/machinery/vending/clothing = "ClothesMate", + /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", + /obj/machinery/vending/cola = "Robust Softdrinks", + /obj/machinery/vending/custom = "Custom Vendor", + /obj/machinery/vending/dinnerware = "Plasteel Chef's Dinnerware Vendor", + /obj/machinery/vending/drugs = "NanoDrug Plus", + /obj/machinery/vending/engineering = "Robco Tool Maker", /obj/machinery/vending/engivend = "Engi-Vend", + /obj/machinery/vending/games = "\improper Good Clean Fun", /obj/machinery/vending/hydronutrients = "NutriMax", /obj/machinery/vending/hydroseeds = "MegaSeed Servitor", - /obj/machinery/vending/sustenance = "Sustenance Vendor", - /obj/machinery/vending/dinnerware = "Plasteel Chef's Dinnerware Vendor", - /obj/machinery/vending/cart = "PTech", - /obj/machinery/vending/robotics = "Robotech Deluxe", - /obj/machinery/vending/engineering = "Robco Tool Maker", - /obj/machinery/vending/sovietsoda = "BODA", - /obj/machinery/vending/security = "Armadyne Peacekeeper Equipment Vendor", //SKYRAT EDIT CHANGE - SEC_HUAL - ORIGINAL: /obj/machinery/vending/security = "SecTech", + /obj/machinery/vending/medical = "NanoMed Plus", /obj/machinery/vending/modularpc = "Deluxe Silicate Selections", + /obj/machinery/vending/robotics = "Robotech Deluxe", + /obj/machinery/vending/security = "SecTech", + /obj/machinery/vending/snack = "Getmore Chocolate Corp", + /obj/machinery/vending/sovietsoda = "BODA", + /obj/machinery/vending/sustenance = "Sustenance Vendor", /obj/machinery/vending/tool = "YouTool", - /obj/machinery/vending/custom = "Custom Vendor", - /obj/machinery/vending/dorms = "LustWish", //SKYRAT EDIT CHANGE - ERP UPDATE - ORIGINAL: /obj/machinery/vending/dorms = "KinkVend" + /obj/machinery/vending/wallmed = "NanoMed", + /obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe", + /obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe", + /obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe", + /obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe", + /obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe", + /obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe", + /obj/machinery/vending/wardrobe/coroner_wardrobe = "MortiDrobe", + /obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe", + /obj/machinery/vending/wardrobe/det_wardrobe = "DetDrobe", + /obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe", + /obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe", + /obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe", + /obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe", + /obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe", + /obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe", + /obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe", + /obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe", + /obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe", + /obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe", + // SKYRAT STUFF AT THE BOTTOM I SUPPOSE FOR SIMPLICITY'S SAKE /obj/machinery/vending/access/command = "Command Outfitting Station", //SKYRAT EDIT ADDITION /obj/machinery/vending/barbervend = "Fab-O-Vend", //SKYRAT EDIT ADDITION + /obj/machinery/vending/dorms = "LustWish", //SKYRAT EDIT CHANGE - ERP UPDATE - ORIGINAL: /obj/machinery/vending/dorms = "KinkVend" /obj/machinery/vending/imported = "NT Sustenance Supplier", //SKYRAT EDIT ADDITION - /obj/machinery/vending/imported/yangyu = "Fudobenda", //SKYRAT EDIT ADDITION /obj/machinery/vending/imported/mothic = "Nomad Fleet Ration Chit Exchange", //SKYRAT EDIT ADDITION - /obj/machinery/vending/imported/tiziran = "Tiziran Imported Delicacies",) //SKYRAT EDIT ADDITION + /obj/machinery/vending/imported/tiziran = "Tiziran Imported Delicacies", //SKYRAT EDIT ADDITION + /obj/machinery/vending/imported/yangyu = "Fudobenda", //SKYRAT EDIT ADDITION + /obj/machinery/vending/security = "Armadyne Peacekeeper Equipment Vendor", //SKYRAT EDIT CHANGE - SEC_HUAL - ORIGINAL: /obj/machinery/vending/security = "SecTech", + ) /obj/item/circuitboard/machine/vendor/screwdriver_act(mob/living/user, obj/item/tool) var/static/list/display_vending_names_paths @@ -1564,6 +1567,37 @@ /obj/item/stack/sheet/plasteel = 2, ) +/obj/item/circuitboard/machine/brm + name = "Boulder Retrieval Matrix" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/bouldertech/brm + req_components = list( + /datum/stock_part/capacitor = 1, + /datum/stock_part/scanning_module = 1, + /datum/stock_part/micro_laser = 1, + ) + +/obj/item/circuitboard/machine/refinery + name = "Boulder Refinery" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/bouldertech/refinery + req_components = list( + /obj/item/reagent_containers/cup/beaker = 1, + /obj/item/assembly/igniter/condenser = 1, + /datum/stock_part/servo = 2, + /datum/stock_part/matter_bin = 1, + ) + +/obj/item/circuitboard/machine/smelter + name = "Boulder Smelter" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/bouldertech/refinery/smelter + req_components = list( + /obj/item/assembly/igniter = 1, + /datum/stock_part/servo = 2, + /datum/stock_part/matter_bin = 2, + ) + /obj/item/circuitboard/machine/shieldwallgen name = "Shield Wall Generator" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 3128229df44..1fef4a38438 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -73,8 +73,10 @@ if (airlock.locked) airlock.unbolt() + log_combat(user, airlock, "unbolted", src) else airlock.bolt() + log_combat(user, airlock, "bolted", src) if (WAND_EMERGENCY) if (!istype(airlock)) target.balloon_alert(user, "only airlocks!") diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 75623ed57e8..e5507473fae 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -140,9 +140,6 @@ /obj/effect/dummy/chameleon/attack_animal(mob/user, list/modifiers) master.disrupt() -/obj/effect/dummy/chameleon/attack_slime(mob/user, list/modifiers) - master.disrupt() - /obj/effect/dummy/chameleon/attack_alien(mob/user, list/modifiers) master.disrupt() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 3375a4d16d1..cab15222112 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -285,6 +285,12 @@ if(use_command) spans |= SPAN_COMMAND + var/radio_message = message + if(LAZYACCESS(message_mods, WHISPER_MODE)) + // Radios don't pick up whispers very well + radio_message = stars(radio_message) + spans |= SPAN_ITALICS + flick_overlay_view(overlay_mic_active, 5 SECONDS) /* @@ -317,7 +323,7 @@ var/atom/movable/virtualspeaker/speaker = new(null, talking_movable, src) // Construct the signal - var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, message, spans, message_mods) + var/datum/signal/subspace/vocal/signal = new(src, freq, speaker, language, radio_message, spans, message_mods) // Independent radios, on the CentCom frequency, reach all independent radios if (independent && (freq == FREQ_CENTCOM || freq == FREQ_CTF_RED || freq == FREQ_CTF_BLUE || freq == FREQ_CTF_GREEN || freq == FREQ_CTF_YELLOW || freq == FREQ_FACTION || freq == FREQ_CYBERSUN || freq == FREQ_INTERDYNE || freq == FREQ_GUILD || freq == FREQ_TARKON || freq == FREQ_SOLFED)) //SKYRAT EDIT CHANGE - FACTION, MAPPING, SOLFED @@ -354,6 +360,13 @@ if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range) return var/filtered_mods = list() + + if (message_mods[MODE_SING]) + filtered_mods[MODE_SING] = message_mods[MODE_SING] + if (message_mods[WHISPER_MODE]) + filtered_mods[WHISPER_MODE] = message_mods[WHISPER_MODE] + if (message_mods[SAY_MOD_VERB]) + filtered_mods[SAY_MOD_VERB] = message_mods[SAY_MOD_VERB] if (message_mods[MODE_CUSTOM_SAY_EMOTE]) filtered_mods[MODE_CUSTOM_SAY_EMOTE] = message_mods[MODE_CUSTOM_SAY_EMOTE] filtered_mods[MODE_CUSTOM_SAY_ERASE_INPUT] = message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index fb4a37e6075..72383cabc8a 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -21,6 +21,7 @@ var/cooldown_time = 250 var/barometer_accuracy // 0 is the best accuracy. var/list/last_gasmix_data + var/ranged_scan_distance = 1 /obj/item/analyzer/Initialize(mapload) . = ..() @@ -142,6 +143,13 @@ ui_interact(user) +/obj/item/analyzer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!can_see(user, target, ranged_scan_distance)) + return + . |= AFTERATTACK_PROCESSED_ITEM + atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target))) + /// Called when our analyzer is used on something /obj/item/analyzer/proc/on_analyze(datum/source, atom/target) SIGNAL_HANDLER @@ -217,10 +225,4 @@ w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2, /datum/material/gold = SMALL_MATERIAL_AMOUNT*3, /datum/material/bluespace=SMALL_MATERIAL_AMOUNT*2) grind_results = list(/datum/reagent/mercury = 5, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) - -/obj/item/analyzer/ranged/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!can_see(user, target, 15)) - return - . |= AFTERATTACK_PROCESSED_ITEM - atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target))) + ranged_scan_distance = 15 diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 0e9438e37d8..893d9e4ab85 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -2,10 +2,6 @@ #define SCANMODE_HEALTH 0 #define SCANMODE_WOUND 1 #define SCANMODE_COUNT 2 // Update this to be the number of scan modes if you add more -#define SCANNER_CONDENSED 0 -#define SCANNER_VERBOSE 1 -// Not updating above count because you're not meant to switch to this mode. -#define SCANNER_NO_MODE -1 /obj/item/healthanalyzer name = "health analyzer" @@ -712,9 +708,6 @@ #undef SCANMODE_HEALTH #undef SCANMODE_WOUND #undef SCANMODE_COUNT -#undef SCANNER_CONDENSED -#undef SCANNER_VERBOSE -#undef SCANNER_NO_MODE #undef AID_EMOTION_NEUTRAL #undef AID_EMOTION_HAPPY diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm index ab360c6fc0d..90da09e16e9 100644 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ b/code/game/objects/items/devices/scanners/slime_scanner.dm @@ -27,12 +27,12 @@ /proc/slime_scan(mob/living/simple_animal/slime/scanned_slime, mob/living/user) var/to_render = "Slime scan results:\ - \n[span_notice("[scanned_slime.slime_type.colour] [scanned_slime.is_adult ? "adult" : "baby"] slime")]\ - \nNutrition: [scanned_slime.nutrition]/[scanned_slime.get_max_nutrition()]" + \n[span_notice("[scanned_slime.slime_type.colour] [scanned_slime.life_stage] slime")]\ + \nNutrition: [scanned_slime.nutrition]/[scanned_slime.max_nutrition]" - if (scanned_slime.nutrition < scanned_slime.get_starve_nutrition()) + if (scanned_slime.nutrition < scanned_slime.starve_nutrition) to_render += "\n[span_warning("Warning: slime is starving!")]" - else if (scanned_slime.nutrition < scanned_slime.get_hunger_nutrition()) + else if (scanned_slime.nutrition < scanned_slime.hunger_nutrition) to_render += "\n[span_warning("Warning: slime is hungry")]" to_render += "\nElectric charge strength: [scanned_slime.powerlevel]\nHealth: [round(scanned_slime.health/scanned_slime.maxHealth,0.01)*100]%" diff --git a/code/game/objects/items/devices/scanners/t_scanner.dm b/code/game/objects/items/devices/scanners/t_scanner.dm index b034c954811..c9f1ae0fd9d 100644 --- a/code/game/objects/items/devices/scanners/t_scanner.dm +++ b/code/game/objects/items/devices/scanners/t_scanner.dm @@ -35,8 +35,7 @@ /obj/item/t_scanner/process() if(!on) - STOP_PROCESSING(SSobj, src) - return null + return PROCESS_KILL scan() /obj/item/t_scanner/proc/scan() diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 4e63fc00c43..8fe83e2e380 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -107,6 +107,12 @@ icon_state = "de6" microwave_riggable = FALSE // You can't melt wood in the microwave +/obj/item/dice/d6/bone + name = "bone die" + desc = "A die carved from a creature's bone. Dried blood marks the indented pits." + icon_state = "db6" + microwave_riggable = FALSE // You can't melt bone in the microwave + /obj/item/dice/d6/space name = "space cube" desc = "A die with six sides. 6 TIMES 255 TIMES 255 TILE TOTAL EXISTENCE, SQUARE YOUR MIND OF EDUCATED STUPID: 2 DOES NOT EXIST." diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index e2603e8bfd0..6aaeb042edb 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -173,7 +173,7 @@ set_light_color(pick(COLOR_SOFT_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)) open_flame() else - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL /obj/item/dualsaber/IsReflect() if(HAS_TRAIT(src, TRAIT_WIELDED) && prob(block_chance)) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 35f76ab89a1..b7896c64381 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -52,8 +52,7 @@ /obj/item/flamethrower/process() if(!lit || !igniter) - STOP_PROCESSING(SSobj, src) - return null + return PROCESS_KILL var/turf/location = loc if(ismob(location)) var/mob/M = location diff --git a/code/game/objects/items/food/frozen.dm b/code/game/objects/items/food/frozen.dm index 8951165aa80..0bd0cd3a606 100644 --- a/code/game/objects/items/food/frozen.dm +++ b/code/game/objects/items/food/frozen.dm @@ -434,3 +434,16 @@ foodtypes = DAIRY | SUGAR venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/popsicle/meatsicle + name = "Meatsicle" + desc = "A horrific abomination of raw meat, glazed with sugar on a stick, then frozen." + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/fat = 2, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/sugar = 4, + ) + overlay_state = "meatsicle" + foodtypes = RAW | MEAT | SUGAR + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index 2954b52a9fd..5f7092c64db 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -839,3 +839,109 @@ tastes = list("peanut butter" = 1, "banana" = 1, "rootbread" = 2) foodtypes = FRUIT | NUTS crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/burger/plain/korta + name = "plain rootburger" + desc = "A simple patty in a rootdough bun." + icon_state = "kortaburger" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + foodtypes = NUTS | MEAT + crafting_complexity = FOOD_COMPLEXITY_3 //Gotta make the dough, +1 + +/obj/item/food/burger/rat/korta + name = "rat rootburger" + desc = "Pretty much what you'd expect... Just in a rootdough bun." + icon_state = "ratburger" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("dead rat" = 4, "bun" = 2) + foodtypes = NUTS | MEAT | GORE + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/burger/rootguffin + name = "root-guffin" + desc = "A cheap and greasy lizard-friendly imitation of an eggs benedict." + icon_state = "rootguffin" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/eggyolk = 3, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("muffin" = 2, "bacon" = 3) + foodtypes = NUTS | MEAT | BREAKFAST + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/burger/rootrib + name = "rootrib" + desc = "An elusive rib shaped burger with limited availablity across the galaxy. Now meeting subhuman requirements." + icon_state = "rootrib" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/bbqsauce = 1, + ) + tastes = list("bun" = 2, "pork patty" = 4) + foodtypes = NUTS | MEAT + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/burger/rootchicken + name = "chicken rootwich" + desc = "A delicious chicken sandwich, in a soft rootbread roll." + icon_state = "rootchicken" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/mayonnaise = 3, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/nutriment/fat/oil = 2, + ) + tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1) + foodtypes = NUTS | MEAT | FRIED + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 + +/obj/item/food/burger/rootfish + name = "Fish rootwich" + desc = "Lightly battered fish, sandwiched in a rootroll." + icon_state = "rootfish" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("bun" = 4, "fish" = 4) + foodtypes = NUTS | SEAFOOD + venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_3 + +/obj/item/food/burger/sloppyroot + name = "sssloppy moe" + desc = "Ground meat mixed with onions and barbeque sssauce, sssloppily plopped onto a rootroll. Delicious, but guaranteed to get your hands dirty." + icon_state = "sloppyroot" + icon = 'icons/obj/food/lizard.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("juicy meat" = 4, "BBQ sauce" = 3, "onions" = 2, "bun" = 2) + foodtypes = NUTS | MEAT | VEGETABLES + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm index 9dfa7cb5a01..2441ac0f674 100644 --- a/code/game/objects/items/food/martian.dm +++ b/code/game/objects/items/food/martian.dm @@ -975,7 +975,7 @@ /datum/reagent/consumable/garlic = 1, ) tastes = list("yoghurt" = 1, "garlic" = 1, "lemon" = 1, "egg" = 1, "chilli heat" = 1) - foodtypes = DAIRY | VEGETABLES | FRUIT | BREAKFAST + foodtypes = DAIRY | VEGETABLES | MEAT | BREAKFAST w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 205fca79708..b928a460abb 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -939,6 +939,39 @@ venue_value = FOOD_PRICE_NORMAL crafting_complexity = FOOD_COMPLEXITY_5 +/obj/item/food/korta_wellington + name = "Kotra wellington" + desc = "A luxurious log of beef, covered in a fine mushroom duxelle and pancetta ham, then bound in korta pastry." + icon = 'icons/obj/food/meat.dmi' + icon_state = "korta_wellington" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 21, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1) + foodtypes = MEAT | VEGETABLES | NUTS + w_class = WEIGHT_CLASS_NORMAL + venue_value = FOOD_PRICE_EXOTIC + crafting_complexity = FOOD_COMPLEXITY_5 + +/obj/item/food/korta_wellington/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/korta_wellington_slice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/korta_wellington_slice + name = "korta wellington slice" + desc = "A slice of korta & beef wellington, topped with a rich gravy. Simply delicious." + icon = 'icons/obj/food/meat.dmi' + icon_state = "korta_wellington_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("beef" = 3, "mushrooms" = 1, "pancetta" = 1) + foodtypes = MEAT | VEGETABLES | NUTS + w_class = WEIGHT_CLASS_SMALL + venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_5 + /obj/item/food/roast_dinner name = "roast dinner" desc = "A luxuriously roasted chicken, accompanied by cabbage, parsnip, potatoes, peas, stuffing and a small boat of gravy." diff --git a/code/game/objects/items/food/mexican.dm b/code/game/objects/items/food/mexican.dm index b4e32587bc6..396e351ff4b 100644 --- a/code/game/objects/items/food/mexican.dm +++ b/code/game/objects/items/food/mexican.dm @@ -305,6 +305,7 @@ /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/nutriment/protein = 4, ) + trash_type = /obj/item/reagent_containers/cup/bowl tastes = list("mashed beans" = 1, "onion" = 3,) foodtypes = VEGETABLES | FRIED w_class = WEIGHT_CLASS_SMALL @@ -319,6 +320,7 @@ /datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6, ) + trash_type = /obj/item/reagent_containers/cup/bowl tastes = list("zesty rice" = 1, "tomato sauce" = 3,) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/moth.dm b/code/game/objects/items/food/moth.dm index df9207da7e0..f9cc4098f1b 100644 --- a/code/game/objects/items/food/moth.dm +++ b/code/game/objects/items/food/moth.dm @@ -756,7 +756,7 @@ /datum/reagent/consumable/nutriment/vitamin = 5, ) tastes = list("crust" = 1, "pesto" = 1, "cheese" = 1) - foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS | RAW + foodtypes = GRAIN | VEGETABLES | DAIRY | NUTS slice_type = /obj/item/food/pizzaslice/mothic_pesto boxtag = "Presto Pesto" crafting_complexity = FOOD_COMPLEXITY_5 diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index dfebfd356cb..277e6efaff8 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -372,6 +372,8 @@ var/list/prefill_flavours /obj/item/food/icecream/New(loc, list/prefill_flavours) + if(ingredients) + ingredients_text = "Requires: [reagent_paths_list_to_text(ingredients)]" return ..() /obj/item/food/icecream/Initialize(mapload, list/prefill_flavours) diff --git a/code/game/objects/items/food/sweets.dm b/code/game/objects/items/food/sweets.dm index 98f9417811a..5c638077d16 100644 --- a/code/game/objects/items/food/sweets.dm +++ b/code/game/objects/items/food/sweets.dm @@ -232,7 +232,6 @@ metabolization_amount = REAGENTS_METABOLISM /obj/item/food/bubblegum/bubblegum/process() - . = ..() if(iscarbon(loc)) hallucinate(loc) diff --git a/code/game/objects/items/granters/martial_arts/_martial_arts.dm b/code/game/objects/items/granters/martial_arts/_martial_arts.dm index 7646faec2c6..b7d186c99c0 100644 --- a/code/game/objects/items/granters/martial_arts/_martial_arts.dm +++ b/code/game/objects/items/granters/martial_arts/_martial_arts.dm @@ -9,7 +9,7 @@ /obj/item/book/granter/martial/can_learn(mob/user) if(!martial) CRASH("Someone attempted to learn [type], which did not have a martial arts set.") - if(user.mind.has_martialart(initial(martial.id))) + if(istype(user.mind?.martial_art, martial)) to_chat(user, span_warning("You already know [martial_name]!")) return FALSE return TRUE @@ -19,7 +19,12 @@ return TRUE /obj/item/book/granter/martial/on_reading_finished(mob/user) - to_chat(user, "[greet]") var/datum/martial_art/martial_to_learn = new martial() - martial_to_learn.teach(user) + if(!martial_to_learn.teach(user)) + to_chat(user, span_warning("You attempt to learn [martial_name] from [src], \ + but your current knowledge of martial arts conflicts with the new style, so it just doesn't stick with you.")) + uses += 1 // Return the use + return + + to_chat(user, "[greet]") user.log_message("learned the martial art [martial_name] ([martial_to_learn])", LOG_ATTACK, color = "orange") diff --git a/code/game/objects/items/granters/martial_arts/cqc.dm b/code/game/objects/items/granters/martial_arts/cqc.dm index 697541e0216..b2191997586 100644 --- a/code/game/objects/items/granters/martial_arts/cqc.dm +++ b/code/game/objects/items/granters/martial_arts/cqc.dm @@ -10,7 +10,7 @@ "Lock... Kick...", "Strike their abdomen, neck and back for critical damage...", "Slam... Lock...", - "I could probably combine this with some other martial arts!", + "I could probably combine this with some other martial arts! ...Wait, that's illegal.", "Words that kill...", "The last and final moment is yours...", ) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 9b44b2ed4a2..ea758c8993e 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -119,10 +119,14 @@ message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)] with [det_time] second fuse") user.log_message("planted [name] on [target.name] with a [det_time] second fuse.", LOG_ATTACK) + var/icon/target_icon = icon(bomb_target.icon, bomb_target.icon_state) + target_icon.Blend(icon(icon, icon_state), ICON_OVERLAY) + var/mutable_appearance/bomb_target_image = mutable_appearance(target_icon) notify_ghosts( "[user] has planted \a [src] on [target] with a [det_time] second fuse!", source = bomb_target, header = "Explosive Planted", + alert_overlay = bomb_target_image, notify_flags = NOTIFY_CATEGORY_NOFLASH, ) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index d923d4258f0..e00a2aa61f3 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -46,7 +46,9 @@ throw_range = 5 custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5) breakouttime = 1 MINUTES - var/handcuff_time = 3 SECONDS + var/handcuff_time = 4 SECONDS + ///Multiplier for handcuff time + var/handcuff_time_mod = 1 armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 ///Sound that plays when starting to put handcuffs on someone @@ -80,6 +82,11 @@ apply_cuffs(user,user) return + if(HAS_TRAIT(user, TRAIT_FAST_CUFFING)) + handcuff_time_mod = 0.75 + else + handcuff_time_mod = 1 + if(!C.handcuffed) if(C.canBeHandcuffed()) C.visible_message(span_danger("[user] is trying to put [src] on [C]!"), \ @@ -88,7 +95,7 @@ to_chat(C, span_userdanger("As you feel someone grab your wrists, [src] start digging into your skin!")) playsound(loc, cuffsound, 30, TRUE, -2) log_combat(user, C, "attempted to handcuff") - if(do_after(user, handcuff_time, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) + if(do_after(user, handcuff_time * handcuff_time_mod, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) if(iscyborg(user)) apply_cuffs(C, user, TRUE) else diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 9f5f94d048b..b4835a0d565 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -66,15 +66,19 @@ return . if(target_turf.is_blocked_turf(TRUE)) //don't try to sneak dense stuff on our tile during the wait. return . - target_holosign = new holosign_type(get_turf(target), src) - target_holosign.add_hiddenprint(user) - if(color) - target_holosign.color = color + target_holosign = create_holosign(target, user) return . /obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return +/obj/item/holosign_creator/proc/create_holosign(atom/target, mob/user) + var/atom/new_holosign = new holosign_type(get_turf(target), src) + new_holosign.add_hiddenprint(user) + if(color) + new_holosign.color = color + return new_holosign + /obj/item/holosign_creator/attack_self(mob/user) if(LAZYLEN(signs)) for(var/obj/structure/holosign/hologram as anything in signs) @@ -126,6 +130,49 @@ holosign_type = /obj/structure/holosign/barrier/atmos creation_time = 0 max_signs = 6 + /// Clearview holograms don't catch clicks and are more transparent + var/clearview = FALSE + /// Timer for auto-turning off clearview + var/clearview_timer + +/obj/item/holosign_creator/atmos/Initialize(mapload) + . = ..() + register_context() + +/obj/item/holosign_creator/atmos/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(LAZYLEN(signs)) + context[SCREENTIP_CONTEXT_RMB] = "[clearview ? "Turn off" : "Temporarily activate"] clearview" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/holosign_creator/atmos/create_holosign(atom/target, mob/user) + var/obj/structure/holosign/barrier/atmos/new_holosign = new holosign_type(get_turf(target), src) + new_holosign.add_hiddenprint(user) + if(color) + new_holosign.color = color + if(clearview) + new_holosign.clearview_transparency() + return new_holosign + +/obj/item/holosign_creator/atmos/attack_self_secondary(mob/user, modifiers) + if(clearview) + reset_hologram_transparency() + balloon_alert(user, "turned off clearview") + return + if(LAZYLEN(signs)) + for(var/obj/structure/holosign/barrier/atmos/hologram as anything in signs) + hologram.clearview_transparency() + clearview = TRUE + balloon_alert(user, "turned on clearview") + clearview_timer = addtimer(CALLBACK(src, PROC_REF(reset_hologram_transparency)), 40 SECONDS, TIMER_STOPPABLE) + return ..() + +/obj/item/holosign_creator/atmos/proc/reset_hologram_transparency() + if(LAZYLEN(signs)) + for(var/obj/structure/holosign/barrier/atmos/hologram as anything in signs) + hologram.reset_transparency() + clearview = FALSE + deltimer(clearview_timer) /obj/item/holosign_creator/medical name = "\improper PENLITE barrier projector" diff --git a/code/game/objects/items/implants/implant_clown.dm b/code/game/objects/items/implants/implant_clown.dm index cc5b52781b0..515a1b4d312 100644 --- a/code/game/objects/items/implants/implant_clown.dm +++ b/code/game/objects/items/implants/implant_clown.dm @@ -4,11 +4,9 @@ actions_types = null /obj/item/implant/sad_trombone/get_data() - var/dat = {"Implant Specifications:
- Name: Honk Co. Sad Trombone Implant
- Life: Activates upon death.
- "} - return dat + return "Implant Specifications:
\ + Name: Honk Co. Sad Trombone Implant
\ + Life: Activates upon death.
" /obj/item/implant/sad_trombone/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) . = ..() diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 29627f377f2..25966a24c68 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -45,16 +45,14 @@ INVOKE_ASYNC(src, PROC_REF(activate), "death") /obj/item/implant/explosive/get_data() - var/dat = {"Implant Specifications:
- Name: Robust Corp RX-78 Employee Management Implant
- Life: Activates upon death.
- Important Notes: Explodes
-
- Implant Details:
- Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
- Special Features: Explodes
- "} - return dat + return "Implant Specifications:
\ + Name: Robust Corp RX-78 Employee Management Implant
\ + Life: Activates upon death.
\ + Important Notes: Explodes
\ +
\ + Implant Details:
\ + Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
\ + Special Features: Explodes
" /obj/item/implant/explosive/activate(cause) . = ..() diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index 1fa61c27510..c1df7212dc8 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -29,18 +29,15 @@ qdel(src) /obj/item/implant/freedom/get_data() - var/dat = {" - Implant Specifications:
- Name: Freedom Beacon
- Life: Optimum [initial(uses)] uses
- Important Notes: Illegal
-
- Implant Details:
- Function: Transmits a specialized cluster of signals to override handcuff locking - mechanisms. These signals will release any bindings on both the arms and legs.
- Disclaimer: Heavy-duty restraints such as straightjackets are deemed "too complex" to release from. - "} - return dat + return "Implant Specifications:
\ + Name: Freedom Beacon
\ + Life: Optimum [initial(uses)] uses
\ + Important Notes: Illegal
\ +
\ + Implant Details:
\ + Function: Transmits a specialized cluster of signals to override handcuff locking \ + mechanisms. These signals will release any bindings on both the arms and legs.
\ + Disclaimer: Heavy-duty restraints such as straightjackets are deemed \"too complex\" to release from." /obj/item/implanter/freedom name = "implanter" // Skyrat edit , was implanter (freedom) diff --git a/code/game/objects/items/implants/implant_krav_maga.dm b/code/game/objects/items/implants/implant_krav_maga.dm index fa3ccd1ccb2..4d921269beb 100644 --- a/code/game/objects/items/implants/implant_krav_maga.dm +++ b/code/game/objects/items/implants/implant_krav_maga.dm @@ -3,7 +3,7 @@ desc = "Teaches you the arts of Krav Maga in 5 short instructional videos beamed directly into your eyeballs." icon = 'icons/obj/scrolls.dmi' icon_state ="scroll2" - var/datum/martial_art/krav_maga/style = new + var/datum/martial_art/krav_maga/style /obj/item/implant/krav_maga/get_data() var/dat = {"Implant Specifications:
@@ -13,17 +13,23 @@ Function: Teaches even the clumsiest host the arts of Krav Maga."} return dat +/obj/item/implant/krav_maga/Initialize(mapload) + . = ..() + style = new() + style.allow_temp_override = FALSE + +/obj/item/implant/krav_maga/Destroy() + QDEL_NULL(style) + return ..() + /obj/item/implant/krav_maga/activate() . = ..() - var/mob/living/carbon/human/H = imp_in - if(!ishuman(H)) + if(isnull(imp_in.mind)) return - if(!H.mind) + if(style.fully_remove(imp_in)) return - if(H.mind.has_martialart(MARTIALART_KRAVMAGA)) - style.remove(H) - else - style.teach(H,1) + + style.teach(imp_in, TRUE) /obj/item/implanter/krav_maga name = "implanter (krav maga)" diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 33bfafbbbdd..67b1f4c6d92 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -4,16 +4,15 @@ actions_types = null /obj/item/implant/mindshield/get_data() - var/dat = {"Implant Specifications:
- Name: Nanotrasen Employee Management Implant
- Life: Ten years.
- Important Notes: Personnel injected with this device are much more resistant to brainwashing.
-
- Implant Details:
- Function: Contains a small pod of nanobots that protects the host's mental functions from manipulation.
- Special Features: Will prevent and cure most forms of brainwashing.
- Integrity: Implant will last so long as the nanobots are inside the bloodstream."} - return dat + return "Implant Specifications:
\ + Name: Nanotrasen Employee Management Implant
\ + Life: Ten years.
\ + Important Notes: Personnel injected with this device are much more resistant to brainwashing.
\ +
\ + Implant Details:
\ + Function: Contains a small pod of nanobots that protects the host's mental functions from manipulation.
\ + Special Features: Will prevent and cure most forms of brainwashing.
\ + Integrity: Implant will last so long as the nanobots are inside the bloodstream." /obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 5f06071cd5c..819091eef6b 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -5,12 +5,11 @@ actions_types = null /obj/item/implant/weapons_auth/get_data() - var/dat = {"Implant Specifications:
- Name: Firearms Authentication Implant
- Life: 4 hours after death of host
- Implant Details:
- Function: Allows operation of implant-locked weaponry, preventing equipment from falling into enemy hands."} - return dat + return "Implant Specifications:
\ + Name: Firearms Authentication Implant
\ + Life: 4 hours after death of host
\ + Implant Details:
\ + Function: Allows operation of implant-locked weaponry, preventing equipment from falling into enemy hands." /obj/item/implant/emp name = "emp implant" @@ -77,11 +76,10 @@ subspace_transmission = TRUE /obj/item/implant/radio/get_data() - var/dat = {"Implant Specifications:
- Name: Internal Radio Implant
- Life: 24 hours
- Implant Details: Allows user to use an internal radio, useful if user expects equipment loss, or cannot equip conventional radios."} - return dat + return "Implant Specifications:
\ + Name: Internal Radio Implant
\ + Life: 24 hours
\ + Implant Details: Allows user to use an internal radio, useful if user expects equipment loss, or cannot equip conventional radios." /obj/item/implanter/radio name = "implanter (internal radio)" diff --git a/code/game/objects/items/implants/implant_spell.dm b/code/game/objects/items/implants/implant_spell.dm index 8005e1c56e9..a758cb72ac0 100644 --- a/code/game/objects/items/implants/implant_spell.dm +++ b/code/game/objects/items/implants/implant_spell.dm @@ -25,12 +25,11 @@ return ..() /obj/item/implant/spell/get_data() - var/dat = {"Implant Specifications:
- Name: Spell Implant
- Life: 4 hours after death of host
- Implant Details:
- Function: [spell_to_give ? "Allows a non-wizard to cast [spell_to_give] as if they were a wizard." : "None."]"} - return dat + return "Implant Specifications:
\ + Name: Spell Implant
\ + Life: 4 hours after death of host
\ + Implant Details:
\ + Function: [spell_to_give ? "Allows a non-wizard to cast [spell_to_give] as if they were a wizard." : "None."]" /obj/item/implant/spell/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) . = ..() diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 6a1b662f64e..706fb29733d 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -3,76 +3,87 @@ desc = "Used to modify implants." icon = 'icons/obj/devices/tool.dmi' icon_state = "implantpad-0" + base_icon_state = "implantpad" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - var/obj/item/implantcase/case = null + + ///The implant case currently inserted into the pad. + var/obj/item/implantcase/inserted_case /obj/item/implantpad/update_icon_state() - icon_state = "implantpad-[!QDELETED(case)]" + icon_state = "[base_icon_state]-[!isnull(inserted_case)]" return ..() /obj/item/implantpad/examine(mob/user) . = ..() + if(!inserted_case) + . += span_info("It is currently empty.") + return + if(Adjacent(user)) - . += "It [case ? "contains \a [case]" : "is currently empty"]." - if(case) - . += span_info("Alt-click to remove [case].") + . += span_info("It contains \a [inserted_case].") else - if(case) - . += span_warning("There seems to be something inside it, but you can't quite tell what from here...") + . += span_warning("There seems to be something inside it, but you can't quite tell what from here...") + . += span_info("Alt-click to remove [inserted_case].") /obj/item/implantpad/Exited(atom/movable/gone, direction) . = ..() - if(gone == case) - case = null - update_appearance() - updateSelfDialog() + if(gone == inserted_case) + inserted_case = null + update_appearance(UPDATE_ICON) + +/obj/item/implantpad/attackby(obj/item/implantcase/attacking_item, mob/user, params) + if(inserted_case || !istype(attacking_item)) + return ..() + if(!user.transferItemToLoc(attacking_item, src)) + return + user.balloon_alert(user, "case inserted") + inserted_case = attacking_item + update_static_data_for_all_viewers() + update_appearance(UPDATE_ICON) /obj/item/implantpad/AltClick(mob/user) - ..() + . = ..() if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return - if(!case) - to_chat(user, span_warning("There's no implant to remove from [src].")) + remove_implant(user) + +/obj/item/implantpad/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "ImplantPad", name) + ui.open() + +/obj/item/implantpad/ui_static_data(mob/user) + var/list/data = list() + data["has_case"] = !!inserted_case + if(!inserted_case) + return data + data["has_implant"] = !!inserted_case.imp + if(inserted_case.imp) + data["case_information"] = inserted_case.imp.get_data() + return data + +/obj/item/implantpad/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = usr + if(action == "eject_implant") + remove_implant(user) return - user.put_in_hands(case) - +///Removes the implant from the pad and puts it in the user's hands if possible. +/obj/item/implantpad/proc/remove_implant(mob/user) + if(!inserted_case) + user.balloon_alert(user, "no case inside!") + return FALSE add_fingerprint(user) - case.add_fingerprint(user) - - updateSelfDialog() - update_appearance() - -/obj/item/implantpad/attackby(obj/item/implantcase/C, mob/user, params) - if(istype(C, /obj/item/implantcase) && !case) - if(!user.transferItemToLoc(C, src)) - return - case = C - updateSelfDialog() - update_appearance() - else - return ..() - -/obj/item/implantpad/ui_interact(mob/user) - if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - user.unset_machine(src) - user << browse(null, "window=implantpad") - return - - user.set_machine(src) - var/dat = "Implant Mini-Computer:
" - if(case) - if(case.imp) - if(istype(case.imp, /obj/item/implant)) - dat += case.imp.get_data() - else - dat += "The implant casing is empty." - else - dat += "Please insert an implant casing!" - user << browse(dat, "window=implantpad") - onclose(user, "implantpad") + inserted_case.add_fingerprint(user) + user.put_in_hands(inserted_case) + user.balloon_alert(user, "case removed") + update_appearance(UPDATE_ICON) + update_static_data_for_all_viewers() + return TRUE diff --git a/code/game/objects/items/implants/security/implant_beacon.dm b/code/game/objects/items/implants/security/implant_beacon.dm index dea6b4ed190..5851566d06a 100644 --- a/code/game/objects/items/implants/security/implant_beacon.dm +++ b/code/game/objects/items/implants/security/implant_beacon.dm @@ -9,15 +9,14 @@ var/lifespan_postmortem = 10 MINUTES /obj/item/implant/beacon/get_data() - var/dat = {"Implant Specifications:
- Name: Robust Corp JMP-21 Fugitive Retrieval Implant
- Life: Deactivates upon death after ten minutes, but remains within the body.
- Important Notes: N/A
-
- Implant Details:
- Function: Acts as a teleportation beacon that can be tracked by any standard bluespace transponder. - Using this, you can teleport directly to whoever has this implant inside of them."} - return dat + return "Implant Specifications:
\ + Name: Robust Corp JMP-21 Fugitive Retrieval Implant
\ + Life: Deactivates upon death after ten minutes, but remains within the body.
\ + Important Notes: N/A
\ +
\ + Implant Details:
\ + Function: Acts as a teleportation beacon that can be tracked by any standard bluespace transponder. \ + Using this, you can teleport directly to whoever has this implant inside of them." /obj/item/implant/beacon/is_shown_on_console(obj/machinery/computer/prisoner/management/console) return TRUE diff --git a/code/game/objects/items/implants/security/implant_chem.dm b/code/game/objects/items/implants/security/implant_chem.dm index db41d8bcac2..bad6cca8c69 100644 --- a/code/game/objects/items/implants/security/implant_chem.dm +++ b/code/game/objects/items/implants/security/implant_chem.dm @@ -9,18 +9,17 @@ var/list/implant_sizes = list(1, 5, 10) /obj/item/implant/chem/get_data() - var/dat = {"Implant Specifications:
- Name: Robust Corp MJ-420 Prisoner Management Implant
- Life: Deactivates upon death but remains within the body.
- Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
- will suffer from an increased appetite.

- Implant Details:
- Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
- the implant releases the chemicals directly into the blood stream.
- Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
- Can only be loaded while still in its original case.
- Integrity: Implant will last so long as the subject is alive, breaking down and releasing all contents on death."} - return dat + return "Implant Specifications:
\ + Name: Robust Corp MJ-420 Prisoner Management Implant
\ + Life: Deactivates upon death but remains within the body.
\ + Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
\ + will suffer from an increased appetite.

\ + Implant Details:
\ + Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
\ + the implant releases the chemicals directly into the blood stream.
\ + Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
\ + Can only be loaded while still in its original case.
\ + Integrity: Implant will last so long as the subject is alive, breaking down and releasing all contents on death." /obj/item/implant/chem/is_shown_on_console(obj/machinery/computer/prisoner/management/console) return is_valid_z_level(get_turf(console), get_turf(imp_in)) diff --git a/code/game/objects/items/implants/security/implant_exile.dm b/code/game/objects/items/implants/security/implant_exile.dm index 5c33d146b3a..9c04f1f9d37 100644 --- a/code/game/objects/items/implants/security/implant_exile.dm +++ b/code/game/objects/items/implants/security/implant_exile.dm @@ -9,11 +9,10 @@ hud_icon_state = "hud_imp_exile" /obj/item/implant/exile/get_data() - var/dat = {"Implant Specifications:
- Name: Nanotrasen Employee Exile Implant
- Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant. - Additionally, station mining shuttles will lock their controls if handled by someone with this implant.
"} - return dat + return "Implant Specifications:
\ + Name: Nanotrasen Employee Exile Implant
\ + Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant. \ + Additionally, station mining shuttles will lock their controls if handled by someone with this implant.
" ///Used to help the staff of the space hotel resist the urge to use the space hotel's incredibly alluring roundstart teleporter to ignore their flavor/greeting text and come to the station. @@ -22,10 +21,9 @@ desc = "Uses impressive bluespace grounding techniques to deny the person implanted by this implant the ability to teleport (or be teleported). Used by certain slavers (or particularly strict employers) to keep their slaves from using teleporters to escape their grasp." /obj/item/implant/exile/noteleport/get_data() - var/dat = {"Implant Specifications:
- Name: Anti-Teleportation Implant
- Implant Details: Keeps the implantee from using most teleportation devices. In addition, it spoofs the implant signature of an exile implant to keep the implantee from using certain gateway systems.
"} - return dat + return "Implant Specifications:
\ + Name: Anti-Teleportation Implant
\ + Implant Details: Keeps the implantee from using most teleportation devices. In addition, it spoofs the implant signature of an exile implant to keep the implantee from using certain gateway systems.
" /obj/item/implant/exile/noteleport/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) . = ..() diff --git a/code/game/objects/items/implants/security/implant_noteleport.dm b/code/game/objects/items/implants/security/implant_noteleport.dm index be4ec29659a..b4795a7f797 100644 --- a/code/game/objects/items/implants/security/implant_noteleport.dm +++ b/code/game/objects/items/implants/security/implant_noteleport.dm @@ -7,11 +7,10 @@ hud_icon_state = "hud_imp_noteleport" /obj/item/implant/teleport_blocker/get_data() - var/dat = {"Implant Specifications:
- Name: Robust Corp EXP-001 'Bluespace Grounder'
- Implant Details: Upon implantation, grounds the user's bluespace signature to their currently occupied plane of existence. - Most, if not all forms of teleportation on the implantee will be rendered ineffective. Useful for keeping especially slippery prisoners in place.
"} - return dat + return "Implant Specifications:
\ + Name: Robust Corp EXP-001 'Bluespace Grounder'
\ + Implant Details: Upon implantation, grounds the user's bluespace signature to their currently occupied plane of existence. \ + Most, if not all forms of teleportation on the implantee will be rendered ineffective. Useful for keeping especially slippery prisoners in place.
" /obj/item/implant/teleport_blocker/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) . = ..() diff --git a/code/game/objects/items/implants/security/implant_track.dm b/code/game/objects/items/implants/security/implant_track.dm index 652d9d6507a..b95c0afa7d8 100644 --- a/code/game/objects/items/implants/security/implant_track.dm +++ b/code/game/objects/items/implants/security/implant_track.dm @@ -9,17 +9,16 @@ var/lifespan_postmortem = 10 MINUTES /obj/item/implant/tracking/get_data() - var/dat = {"Implant Specifications:
- Name: Robust Corp EYE-5 Convict Parole Implant
- Life: 10 minutes after death of host.
-
- Implant Details:
- Function: Continuously transmits low power signal. Can be tracked from a prisoner management console.
- Special Features:
- Neuro-Safe- Specialized shell absorbs excess voltages self-destructing the chip if - a malfunction occurs thereby securing safety of subject. The implant will melt and - disintegrate into bio-safe elements.
"} - return dat + return "Implant Specifications:
\ + Name: Robust Corp EYE-5 Convict Parole Implant
\ + Life: 10 minutes after death of host.
\ +
\ + Implant Details:
\ + Function: Continuously transmits low power signal. Can be tracked from a prisoner management console.
\ + Special Features:
\ + Neuro-Safe- Specialized shell absorbs excess voltages self-destructing the chip if \ + a malfunction occurs thereby securing safety of subject. The implant will melt and \ + disintegrate into bio-safe elements.
" /obj/item/implant/tracking/is_shown_on_console(obj/machinery/computer/prisoner/management/console) if(imp_in.stat == DEAD && imp_in.timeofdeath + lifespan_postmortem < world.time) diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 35c73a8cb95..f2493bf869d 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -19,10 +19,12 @@ cell = new cell_type /obj/item/inducer/proc/induce(obj/item/stock_parts/cell/target, coefficient) - var/totransfer = min(cell.charge,(powertransfer * coefficient)) + var/obj/item/stock_parts/cell/our_cell = get_cell() + var/totransfer = min(our_cell.charge, (powertransfer * coefficient)) var/transferred = target.give(totransfer) - cell.use(transferred) - cell.update_appearance() + + our_cell.use(transferred) + our_cell.update_appearance() target.update_appearance() /obj/item/inducer/get_cell() @@ -30,17 +32,18 @@ /obj/item/inducer/emp_act(severity) . = ..() - if(cell && !(. & EMP_PROTECT_CONTENTS)) - cell.emp_act(severity) + var/obj/item/stock_parts/cell/our_cell = get_cell() + if(!isnull(our_cell) && !(. & EMP_PROTECT_CONTENTS)) + our_cell.emp_act(severity) -/obj/item/inducer/attack_atom(obj/O, mob/living/carbon/user, params) +/obj/item/inducer/attack_atom(obj/target, mob/living/carbon/user, params) if(user.combat_mode) return ..() if(cantbeused(user)) return - if(recharge(O, user)) + if(recharge(target, user)) return return ..() @@ -50,11 +53,13 @@ to_chat(user, span_warning("You don't have the dexterity to use [src]!")) return TRUE - if(!cell) + var/obj/item/stock_parts/cell/our_cell = get_cell() + + if(isnull(our_cell)) balloon_alert(user, "no cell installed!") return TRUE - if(!cell.charge) + if(!our_cell.charge) balloon_alert(user, "no charge!") return TRUE return FALSE @@ -73,78 +78,80 @@ update_appearance() return -/obj/item/inducer/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/stock_parts/cell)) +/obj/item/inducer/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/stock_parts/cell)) if(opened) - if(!cell) - if(!user.transferItemToLoc(W, src)) + var/obj/item/stock_parts/cell/our_cell = get_cell() + if(isnull(our_cell)) + if(!user.transferItemToLoc(used_item, src)) return - to_chat(user, span_notice("You insert [W] into [src].")) - cell = W + to_chat(user, span_notice("You insert [used_item] into [src].")) + cell = used_item update_appearance() return else - to_chat(user, span_warning("[src] already has \a [cell] installed!")) + to_chat(user, span_warning("[src] already has \a [our_cell] installed!")) return if(cantbeused(user)) return - if(recharge(W, user)) + if(recharge(used_item, user)) return return ..() -/obj/item/inducer/proc/recharge(atom/movable/A, mob/user) - if(!isturf(A) && user.loc == A) +/obj/item/inducer/proc/recharge(atom/movable/target, mob/user) + if(!isturf(target) && user.loc == target) return FALSE if(recharging) return TRUE - else - recharging = TRUE - var/obj/item/stock_parts/cell/C = A.get_cell() - var/obj/O + + recharging = TRUE + var/obj/item/stock_parts/cell/our_cell = get_cell() + var/obj/item/stock_parts/cell/target_cell = target.get_cell() + var/obj/target_as_object = target var/coefficient = 1 - if(istype(A, /obj/item/gun/energy)) + + if(istype(target, /obj/item/gun/energy) || istype(target, /obj/item/clothing/suit/space)) to_chat(user, span_alert("Error: unable to interface with device.")) return FALSE - if(istype(A, /obj/item/clothing/suit/space)) - to_chat(user, span_alert("Error: unable to interface with device.")) - return FALSE - if(isobj(A)) - O = A - if(C) + + if(target_cell) var/done_any = FALSE - if(C.charge >= C.maxcharge) + if(target_cell.charge >= target_cell.maxcharge) balloon_alert(user, "it's fully charged!") recharging = FALSE return TRUE - user.visible_message(span_notice("[user] starts recharging [A] with [src]."), span_notice("You start recharging [A] with [src].")) - while(C.charge < C.maxcharge) - if(do_after(user, 10, target = user) && cell.charge) + + user.visible_message(span_notice("[user] starts recharging [target] with [src]."), span_notice("You start recharging [target] with [src].")) + + while(target_cell.charge < target_cell.maxcharge) + if(do_after(user, 10, target = user) && our_cell.charge) done_any = TRUE - induce(C, coefficient) - do_sparks(1, FALSE, A) - if(O) - O.update_appearance() + induce(target_cell, coefficient) + do_sparks(1, FALSE, target) + if(istype(target_as_object)) + target_as_object.update_appearance() else break if(done_any) // Only show a message if we succeeded at least once - user.visible_message(span_notice("[user] recharged [A]!"), span_notice("You recharged [A]!")) + user.visible_message(span_notice("[user] recharged [target]!"), span_notice("You recharged [target]!")) recharging = FALSE return TRUE recharging = FALSE -/obj/item/inducer/attack(mob/M, mob/living/user) +/obj/item/inducer/attack(mob/target, mob/living/user) if(user.combat_mode) return ..() if(cantbeused(user)) return - if(recharge(M, user)) + if(recharge(target, user)) return + return ..() @@ -157,10 +164,11 @@ update_appearance() -/obj/item/inducer/examine(mob/living/M) +/obj/item/inducer/examine(mob/living/user) . = ..() - if(cell) - . += span_notice("Its display shows: [display_energy(cell.charge)].") + var/obj/item/stock_parts/cell/our_cell = get_cell() + if(!isnull(our_cell)) + . += span_notice("Its display shows: [display_energy(our_cell.charge)].") else . += span_notice("Its display is dark.") if(opened) @@ -170,7 +178,7 @@ . = ..() if(!opened) return - . += "inducer-[cell ? "bat" : "nobat"]" + . += "inducer-[!isnull(get_cell()) ? "bat" : "nobat"]" /obj/item/inducer/empty cell_type = null diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 4d63f825c07..b7273ed0a32 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -152,14 +152,11 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' desc = "A sharpened bone. The bare minimum in survival." embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) + obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY force = 15 throwforce = 15 custom_materials = null -/obj/item/knife/combat/bone/Initialize(mapload) - flags_1 &= ~CONDUCTS_ELECTRICITY - return ..() - /obj/item/knife/combat/cyborg name = "cyborg knife" icon = 'icons/obj/items_cyborg.dmi' @@ -174,6 +171,7 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' desc = "A makeshift glass shiv." + obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY force = 8 throwforce = 12 attack_verb_continuous = list("shanks", "shivs") @@ -181,10 +179,6 @@ armor_type = /datum/armor/none custom_materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT * 4) -/obj/item/knife/shiv/Initialize(mapload) - flags_1 &= ~CONDUCTS_ELECTRICITY - return ..() - /obj/item/knife/shiv/plasma name = "plasma shiv" icon_state = "plasmashiv" diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 19a3c2bc39c..da0bf1dbc64 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -625,7 +625,7 @@ . = list() .["visible"] = span_danger("[user] tries to stun [target] with [src], and predictably fails!") - .["local"] = span_userdanger("[target] tries to... stun you with [src]?") + .["local"] = span_userdanger("[user] tries to... stun you with [src]?") /obj/item/melee/baton/security/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index 5364905bdc9..928f1a373bb 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -31,6 +31,7 @@ force_unwielded = 5, \ force_wielded = 10, \ ) + AddElement(/datum/element/disarm_attack) var/static/list/slapcraft_recipe_list = list(\ /datum/crafting_recipe/pillow_suit, /datum/crafting_recipe/pillow_hood,\ diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index ab97026a6a1..7e14ca91b3f 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -1,9 +1,6 @@ /// Multiplier applied on construction & deconstruction time when building multiple structures #define FREQUENT_USE_DEBUFF_MULTIPLIER 3 -/// Delay before another rcd scan can be performed in the UI -#define RCD_DESTRUCTIVE_SCAN_COOLDOWN (RCD_HOLOGRAM_FADE_TIME + 1 SECONDS) - //RAPID CONSTRUCTION DEVICE /obj/item/construction/rcd @@ -33,8 +30,8 @@ /// The path of the structure the rcd is currently creating var/atom/movable/rcd_design_path - /// owner of this rcd. It can either be an construction console or an player - var/owner + /// Owner of this rcd. It can either be a construction console, player, or mech. + var/atom/owner /// used by arcd, can this rcd work from a range var/ranged = FALSE /// delay multiplier for all construction types @@ -243,8 +240,9 @@ return FALSE var/beam if(ranged) - beam = user.Beam(target, icon_state = "rped_upgrade", time = delay) - if(!do_after(user, delay, target = target)) + var/atom/beam_source = owner ? owner : user + beam = beam_source.Beam(target, icon_state = "rped_upgrade", time = delay) + if(delay && !do_after(user, delay, target = target)) // no need for do_after with no delay qdel(rcd_effect) if(!isnull(beam)) qdel(beam) @@ -510,8 +508,55 @@ has_ammobar = FALSE upgrade = RCD_ALL_UPGRADES & ~RCD_UPGRADE_SILO_LINK +/obj/item/construction/rcd/exosuit + name = "mounted RCD" + desc = "An exosuit-mounted Rapid Construction Device." + max_matter = INFINITY // mass-energy equivalence go brrrrrr + canRturf = TRUE + ranged = TRUE + has_ammobar = FALSE + resistance_flags = FIRE_PROOF | INDESTRUCTIBLE // should NOT be destroyed unless the equipment is destroyed + item_flags = NO_MAT_REDEMPTION | NOBLUDGEON | DROPDEL // already qdeleted in the equipment's Destroy() but you can never be too sure + delay_mod = 0.5 + ///How much charge is used up for each matter unit. + var/mass_to_energy = 16 + +/obj/item/construction/rcd/exosuit/ui_status(mob/user) + if(ismecha(owner)) + return owner.ui_status(user) + return UI_CLOSE + +/obj/item/construction/rcd/exosuit/get_matter(mob/user) + if(silo_link) + return ..() + if(!ismecha(owner)) + return 0 + var/obj/vehicle/sealed/mecha/gundam = owner + return round(gundam.get_charge() / mass_to_energy) + +/obj/item/construction/rcd/exosuit/useResource(amount, mob/user) + if(silo_link) + return ..() + if(!ismecha(owner)) + return 0 + var/obj/vehicle/sealed/mecha/gundam = owner + if(!gundam.use_power(amount * mass_to_energy)) + gundam.balloon_alert(user, "insufficient charge!") + return FALSE + return TRUE + +/obj/item/construction/rcd/exosuit/checkResource(amount, mob/user) + if(silo_link) + return ..() + if(!ismecha(owner)) + return 0 + var/obj/vehicle/sealed/mecha/gundam = owner + if(!gundam.has_charge(amount * mass_to_energy)) + gundam.balloon_alert(user, "insufficient charge!") + return FALSE + return TRUE + #undef FREQUENT_USE_DEBUFF_MULTIPLIER -#undef RCD_DESTRUCTIVE_SCAN_COOLDOWN /obj/item/rcd_ammo name = "RCD matter cartridge" diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 8abf1f2e3f2..9151c85ed03 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -95,16 +95,17 @@ /obj/item/construction/proc/install_upgrade(obj/item/rcd_upgrade/design_disk, mob/user) if(design_disk.upgrade & upgrade) balloon_alert(user, "already installed!") - return + return FALSE if(design_disk.upgrade & banned_upgrades) balloon_alert(user, "cannot install upgrade!") - return + return FALSE upgrade |= design_disk.upgrade if((design_disk.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) silo_mats = AddComponent(/datum/component/remote_materials, FALSE, FALSE) playsound(loc, 'sound/machines/click.ogg', 50, TRUE) qdel(design_disk) update_static_data_for_all_viewers() + return TRUE /// Inserts matter into the RCD allowing it to build /obj/item/construction/proc/insert_matter(obj/item, mob/user) diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index 4995c7d9df6..01541df5a9c 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -56,24 +56,25 @@ stored.forceMove(user.drop_location()) /obj/item/borg/apparatus/pre_attack(atom/atom, mob/living/user, params) - if(!stored) - // Borgs should not be grabbing their own modules - if(!istype(atom.loc, /mob/living/silicon/robot)) - var/itemcheck = FALSE - for(var/storable_type in storable) - if(istype(atom, storable_type)) - itemcheck = TRUE - break - if(itemcheck) - var/obj/item/item = atom - item.forceMove(src) - stored = item - RegisterSignal(stored, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_stored_updated_icon)) - update_appearance() - return TRUE - else + if(stored) stored.melee_attack_chain(user, atom, params) return TRUE + + if(istype(atom.loc, /mob/living/silicon/robot) || istype(atom.loc, /obj/item/robot_model) || HAS_TRAIT(atom, TRAIT_NODROP)) + return ..() // Borgs should not be grabbing their own modules + + var/itemcheck = FALSE + for(var/storable_type in storable) + if(istype(atom, storable_type)) + itemcheck = TRUE + break + if(itemcheck) + var/obj/item/item = atom + item.forceMove(src) + stored = item + RegisterSignal(stored, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_stored_updated_icon)) + update_appearance() + return TRUE return ..() /** diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 3b8b5cf91e8..5090f82bc9e 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -636,30 +636,40 @@ model_type = list(/obj/item/robot_model/engineering, /obj/item/robot_model/saboteur) model_flags = BORG_MODEL_ENGINEERING -/obj/item/borg/upgrade/inducer/action(mob/living/silicon/robot/R, user = usr) +/obj/item/borg/upgrade/inducer/action(mob/living/silicon/robot/silicon_friend, user = usr) . = ..() if(.) - var/obj/item/inducer/cyborg/inter_inducer = locate() in R + var/obj/item/inducer/cyborg/inter_inducer = locate() in silicon_friend if(inter_inducer) + silicon_friend.balloon_alert(user, "already has one!") return FALSE - inter_inducer = new(R.model) - R.model.basic_modules += inter_inducer - R.model.add_module(inter_inducer, FALSE, TRUE) - inter_inducer.cell = R.cell -/obj/item/borg/upgrade/inducer/deactivate(mob/living/silicon/robot/R, user = usr) + inter_inducer = new(silicon_friend.model) + silicon_friend.model.basic_modules += inter_inducer + silicon_friend.model.add_module(inter_inducer, FALSE, TRUE) + +/obj/item/borg/upgrade/inducer/deactivate(mob/living/silicon/robot/silicon_friend, user = usr) . = ..() - if (.) - var/obj/item/inducer/cyborg/inter_inducer = locate() in R.model - if (inter_inducer) - R.model.remove_module(inter_inducer, TRUE) - inter_inducer.cell = null + if(.) + var/obj/item/inducer/cyborg/inter_inducer = locate() in silicon_friend.model + if(inter_inducer) + silicon_friend.model.remove_module(inter_inducer, TRUE) /obj/item/inducer/cyborg name = "Internal inducer" powertransfer = 1500 icon = 'icons/obj/tools.dmi' icon_state = "inducer-engi" + cell_type = null + +/obj/item/inducer/cyborg/get_cell() + var/obj/item/robot_model/possible_model = loc + var/mob/living/silicon/robot/silicon_friend = istype(possible_model) ? possible_model.robot : possible_model + if(istype(silicon_friend)) + . = silicon_friend.cell + +/obj/item/inducer/cyborg/screwdriver_act(mob/living/user, obj/item/tool) + return FALSE /obj/item/borg/upgrade/pinpointer name = "medical cyborg crew pinpointer" diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index ef434c1993d..b711bb63d45 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -35,6 +35,10 @@ fire = 80 acid = 70 +/obj/item/shield/Initialize(mapload) + . = ..() + AddElement(/datum/element/disarm_attack) + /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) if(transparent && (hitby.pass_flags & PASSGLASS)) return FALSE @@ -57,21 +61,32 @@ if(0 to 25) . += span_warning("It's falling apart!") -/obj/item/shield/proc/shatter(mob/living/carbon/human/owner) - playsound(owner, shield_break_sound, 50) - new shield_break_leftover(get_turf(src)) - /obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(!breakable_by_damage || (damage_type != BRUTE && damage_type != BURN)) return TRUE - if (atom_integrity <= damage) - var/turf/owner_turf = get_turf(owner) - owner_turf.visible_message(span_warning("[hitby] destroys [src]!")) - shatter(owner) - qdel(src) - return FALSE - take_damage(damage) - return TRUE + var/penetration = 0 + var/armor_flag = MELEE + if(isprojectile(hitby)) + var/obj/projectile/bang_bang = hitby + armor_flag = bang_bang.armor_flag + penetration = bang_bang.armour_penetration + else if(isitem(hitby)) + var/obj/item/weapon = hitby + penetration = weapon.armour_penetration + else if(isanimal(hitby)) + var/mob/living/simple_animal/critter = hitby + penetration = critter.armour_penetration + else if(isbasicmob(hitby)) + var/mob/living/basic/critter = hitby + penetration = critter.armour_penetration + take_damage(damage, damage_type, armor_flag, armour_penetration = penetration) + +/obj/item/shield/atom_destruction(damage_flag) + playsound(src, shield_break_sound, 50) + new shield_break_leftover(get_turf(src)) + if(isliving(loc)) + loc.balloon_alert(loc, "shield broken!") + return ..() /obj/item/shield/buckler name = "wooden buckler" @@ -100,9 +115,14 @@ armor_type = /datum/armor/none max_integrity = 30 +/datum/armor/item_shield/riot + melee = 80 + bullet = 20 + laser = 20 + /obj/item/shield/riot name = "riot shield" - desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." + desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder, less so bullets and laser beams." icon_state = "riot" inhand_icon_state = "riot" custom_materials = list(/datum/material/glass= SHEET_MATERIAL_AMOUNT * 3.75, /datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT) @@ -110,6 +130,7 @@ max_integrity = 75 shield_break_sound = 'sound/effects/glassbr3.ogg' shield_break_leftover = /obj/item/shard + armor_type = /datum/armor/item_shield/riot /obj/item/shield/riot/Initialize(mapload) . = ..() @@ -177,7 +198,9 @@ QDEL_NULL(embedded_flash) return ..() -/obj/item/shield/riot/flash/attack(mob/living/target_mob, mob/user) +/obj/item/shield/riot/flash/attack(mob/living/target_mob, mob/living/user) + if(user.combat_mode) + return ..() flash_away(user, target_mob) /obj/item/shield/riot/flash/attack_self(mob/living/carbon/user) @@ -275,6 +298,7 @@ clumsy_check = !can_clumsy_use, \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + RegisterSignal(src, COMSIG_ITEM_CAN_DISARM_ATTACK, PROC_REF(can_disarm_attack)) /obj/item/shield/energy/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)) @@ -302,6 +326,13 @@ playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE +/obj/item/shield/energy/proc/can_disarm_attack(datum/source, mob/living/victim, mob/living/user, send_message = TRUE) + SIGNAL_HANDLER + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + if(send_message) + balloon_alert(user, "activate it first!") + return COMPONENT_BLOCK_ITEM_DISARM_ATTACK + /obj/item/shield/energy/advanced name = "advanced combat energy shield" desc = "A hardlight shield capable of reflecting all energy projectiles, as well las providing well-rounded defense from most all other attacks. \ @@ -338,6 +369,7 @@ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + RegisterSignal(src, COMSIG_ITEM_CAN_DISARM_ATTACK, PROC_REF(can_disarm_attack)) /obj/item/shield/riot/tele/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)) @@ -358,4 +390,11 @@ playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE +/obj/item/shield/riot/tele/proc/can_disarm_attack(datum/source, mob/living/victim, mob/living/user, send_message = TRUE) + SIGNAL_HANDLER + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + if(send_message) + balloon_alert(user, "extend it first!") + return COMPONENT_BLOCK_ITEM_DISARM_ATTACK + #undef BATON_BASH_COOLDOWN diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 9ec5f22746d..306bc0fa9f9 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -32,6 +32,8 @@ var/sanitization /// How much we add to flesh_healing for burn wounds on application var/flesh_regeneration + /// Time it takes to assess injuries when looping healing + var/assessing_injury_delay = 1 SECONDS /obj/item/stack/medical/interact_with_atom(atom/interacting_with, mob/living/user) if(!isliving(interacting_with)) @@ -75,7 +77,14 @@ return patient.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE) /// In which we print the message that we're starting to heal someone, then we try healing them. Does the do_after whether or not it can actually succeed on a targeted mob -/obj/item/stack/medical/proc/try_heal(mob/living/patient, mob/user, silent = FALSE) +/obj/item/stack/medical/proc/try_heal(mob/living/patient, mob/user, silent = FALSE, looping = FALSE) + if(!try_heal_checks(patient, user, heal_brute, heal_burn, looping)) + return + var/new_self_delay = self_delay + var/new_other_delay = other_delay + if(iscarbon(patient)) + new_self_delay = looping ? clamp((self_delay - assessing_injury_delay), 0, self_delay) : self_delay + new_other_delay = looping ? clamp((other_delay - assessing_injury_delay), 0, other_delay) : other_delay if(patient == user) if(!silent) user.visible_message( @@ -84,7 +93,7 @@ ) if(!do_after( user, - self_delay, + new_self_delay, patient, extra_checks = CALLBACK(src, PROC_REF(can_heal), patient, user), )) @@ -98,7 +107,7 @@ ) if(!do_after( user, - other_delay, + new_other_delay, patient, extra_checks = CALLBACK(src, PROC_REF(can_heal), patient, user), )) @@ -111,48 +120,76 @@ return if(!can_heal(patient, user)) return - try_heal(patient, user, silent = TRUE) + try_heal(patient, user, silent = TRUE, looping = TRUE) /// Apply the actual effects of the healing if it's a simple animal, goes to [/obj/item/stack/medical/proc/heal_carbon] if it's a carbon, returns TRUE if it works, FALSE if it doesn't /obj/item/stack/medical/proc/heal(mob/living/patient, mob/user) if(patient.stat == DEAD) patient.balloon_alert(user, "they're dead!") - return - if(isanimal_or_basicmob(patient) && heal_brute) // only brute can heal - if (!(patient.mob_biotypes & MOB_ORGANIC)) - patient.balloon_alert(user, "can't fix that!") - return FALSE - if (patient.health == patient.maxHealth) - patient.balloon_alert(user, "not hurt!") - return FALSE - user.visible_message("[user] applies [src] on [patient].", "You apply [src] on [patient].") - patient.heal_bodypart_damage((heal_brute * patient.maxHealth/100)) - return TRUE + return FALSE if(iscarbon(patient)) return heal_carbon(patient, user, heal_brute, heal_burn) - patient.balloon_alert(user, "can't heal that!") + else if(isanimal_or_basicmob(patient)) + if(!try_heal_checks(patient, user, heal_brute, heal_burn)) + return FALSE + if(patient.heal_bodypart_damage((heal_brute * patient.maxHealth/100))) + user.visible_message("[user] applies [src] on [patient].", "You apply [src] on [patient].") + return TRUE + patient.balloon_alert(user, "can't heal [patient]!") + return FALSE + +/obj/item/stack/medical/proc/try_heal_checks(mob/living/patient, mob/user, brute, burn, looping = FALSE) + if(iscarbon(patient)) + if(looping) + balloon_alert(user, "assessing injuries...") + if(!do_after(user, assessing_injury_delay, patient)) + return FALSE + var/mob/living/carbon/carbon_patient = patient + var/obj/item/bodypart/affecting = carbon_patient.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) //Missing limb? + carbon_patient.balloon_alert(user, "no [parse_zone(user.zone_selected)]!") + return FALSE + if(!IS_ORGANIC_LIMB(affecting)) //Limb must be organic to be healed - RR + carbon_patient.balloon_alert(user, "[affecting.plaintext_zone] is not organic!") + return FALSE + if(!(affecting.brute_dam && brute) && !(affecting.burn_dam && burn)) + if(!affecting.brute_dam && !affecting.burn_dam) + if(patient != user || !looping) + carbon_patient.balloon_alert(user, "[affecting.plaintext_zone] is not hurt!") + else + carbon_patient.balloon_alert(user, "can't heal [affecting.plaintext_zone] with [name]!") + return FALSE + return TRUE + if(isanimal_or_basicmob(patient)) + if(patient.stat == DEAD) + patient.balloon_alert(user, "they're dead!") + return FALSE + if(!heal_brute) // only brute can heal + patient.balloon_alert(user, "can't heal with [name]!") + return FALSE + if(!(patient.mob_biotypes & MOB_ORGANIC)) + patient.balloon_alert(user, "no organic tissue!") + return FALSE + if(patient.health == patient.maxHealth) + patient.balloon_alert(user, "not hurt!") + return FALSE + return TRUE + /// The healing effects on a carbon patient. Since we have extra details for dealing with bodyparts, we get our own fancy proc. Still returns TRUE on success and FALSE on fail /obj/item/stack/medical/proc/heal_carbon(mob/living/carbon/patient, mob/user, brute, burn) var/obj/item/bodypart/affecting = patient.get_bodypart(check_zone(user.zone_selected)) - if(!affecting) //Missing limb? - patient.balloon_alert(user, "no [parse_zone(user.zone_selected)]!") + if(!try_heal_checks(patient, user, brute, burn)) return FALSE - if(!IS_ORGANIC_LIMB(affecting)) //Limb must be organic to be healed - RR - patient.balloon_alert(user, "it's not organic!") - return FALSE - if(affecting.brute_dam && brute || affecting.burn_dam && burn) - user.visible_message( - span_infoplain(span_green("[user] applies [src] on [patient]'s [parse_zone(affecting.body_zone)].")), - span_infoplain(span_green("You apply [src] on [patient]'s [parse_zone(affecting.body_zone)].")) - ) - var/previous_damage = affecting.get_damage() - if(affecting.heal_damage(brute, burn)) - patient.update_damage_overlays() - post_heal_effects(max(previous_damage - affecting.get_damage(), 0), patient, user) - return TRUE - patient.balloon_alert(user, "can't heal that!") - return FALSE + user.visible_message( + span_infoplain(span_green("[user] applies [src] on [patient]'s [parse_zone(affecting.body_zone)].")), + span_infoplain(span_green("You apply [src] on [patient]'s [parse_zone(affecting.body_zone)].")) + ) + var/previous_damage = affecting.get_damage() + if(affecting.heal_damage(brute, burn)) + patient.update_damage_overlays() + post_heal_effects(max(previous_damage - affecting.get_damage(), 0), patient, user) + return TRUE ///Override this proc for special post heal effects. /obj/item/stack/medical/proc/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) @@ -203,7 +240,7 @@ gauzed_bodypart = null // gauze is only relevant for wounds, which are handled in the wounds themselves -/obj/item/stack/medical/gauze/try_heal(mob/living/patient, mob/user, silent) +/obj/item/stack/medical/gauze/try_heal(mob/living/patient, mob/user, silent, looping) var/treatment_delay = (user == patient ? self_delay : other_delay) @@ -375,7 +412,7 @@ return ..() icon_state = "regen_mesh_closed" -/obj/item/stack/medical/mesh/try_heal(mob/living/patient, mob/user, silent = FALSE) +/obj/item/stack/medical/mesh/try_heal(mob/living/patient, mob/user, silent = FALSE, looping) if(!is_open) balloon_alert(user, "open it first!") return diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 309d23aac9f..947f56be97f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -769,7 +769,8 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ // Sinew slapcrafting will mostly-sinew recipes, and bones will have mostly-bones recipes. var/static/list/slapcraft_recipe_list = list(\ /datum/crafting_recipe/bonedagger, /datum/crafting_recipe/bonespear, /datum/crafting_recipe/boneaxe,\ - /datum/crafting_recipe/bonearmor, /datum/crafting_recipe/skullhelm, /datum/crafting_recipe/bracers + /datum/crafting_recipe/bonearmor, /datum/crafting_recipe/skullhelm, /datum/crafting_recipe/bracers, + /datum/crafting_recipe/ash_recipe/bone_greaves, ) AddComponent( diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 67b260dcf09..d51b9d04875 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -254,6 +254,7 @@ turf_type = /turf/open/floor/carpet/black tableVariant = /obj/structure/table/wood/fancy/black merge_type = /obj/item/stack/tile/carpet/black + tile_reskin_types = null /obj/item/stack/tile/carpet/blue name = "blue carpet" @@ -262,6 +263,7 @@ turf_type = /turf/open/floor/carpet/blue tableVariant = /obj/structure/table/wood/fancy/blue merge_type = /obj/item/stack/tile/carpet/blue + tile_reskin_types = null /obj/item/stack/tile/carpet/cyan name = "cyan carpet" @@ -270,6 +272,7 @@ turf_type = /turf/open/floor/carpet/cyan tableVariant = /obj/structure/table/wood/fancy/cyan merge_type = /obj/item/stack/tile/carpet/cyan + tile_reskin_types = null /obj/item/stack/tile/carpet/green name = "green carpet" @@ -278,6 +281,7 @@ turf_type = /turf/open/floor/carpet/green tableVariant = /obj/structure/table/wood/fancy/green merge_type = /obj/item/stack/tile/carpet/green + tile_reskin_types = null /obj/item/stack/tile/carpet/orange name = "orange carpet" @@ -286,6 +290,7 @@ turf_type = /turf/open/floor/carpet/orange tableVariant = /obj/structure/table/wood/fancy/orange merge_type = /obj/item/stack/tile/carpet/orange + tile_reskin_types = null /obj/item/stack/tile/carpet/purple name = "purple carpet" @@ -294,6 +299,7 @@ turf_type = /turf/open/floor/carpet/purple tableVariant = /obj/structure/table/wood/fancy/purple merge_type = /obj/item/stack/tile/carpet/purple + tile_reskin_types = null /obj/item/stack/tile/carpet/red name = "red carpet" @@ -302,6 +308,7 @@ turf_type = /turf/open/floor/carpet/red tableVariant = /obj/structure/table/wood/fancy/red merge_type = /obj/item/stack/tile/carpet/red + tile_reskin_types = null /obj/item/stack/tile/carpet/royalblack name = "royal black carpet" @@ -310,6 +317,7 @@ turf_type = /turf/open/floor/carpet/royalblack tableVariant = /obj/structure/table/wood/fancy/royalblack merge_type = /obj/item/stack/tile/carpet/royalblack + tile_reskin_types = null /obj/item/stack/tile/carpet/royalblue name = "royal blue carpet" @@ -318,6 +326,7 @@ turf_type = /turf/open/floor/carpet/royalblue tableVariant = /obj/structure/table/wood/fancy/royalblue merge_type = /obj/item/stack/tile/carpet/royalblue + tile_reskin_types = null /obj/item/stack/tile/carpet/executive name = "executive carpet" @@ -325,6 +334,7 @@ inhand_icon_state = "tile-carpet-royalblue" turf_type = /turf/open/floor/carpet/executive merge_type = /obj/item/stack/tile/carpet/executive + tile_reskin_types = null /obj/item/stack/tile/carpet/stellar name = "stellar carpet" @@ -332,6 +342,7 @@ inhand_icon_state = "tile-carpet-royalblue" turf_type = /turf/open/floor/carpet/stellar merge_type = /obj/item/stack/tile/carpet/stellar + tile_reskin_types = null /obj/item/stack/tile/carpet/donk name = "\improper Donk Co. promotional carpet" @@ -339,6 +350,7 @@ inhand_icon_state = "tile-carpet-orange" turf_type = /turf/open/floor/carpet/donk merge_type = /obj/item/stack/tile/carpet/donk + tile_reskin_types = null /obj/item/stack/tile/carpet/fifty amount = 50 @@ -386,6 +398,8 @@ inhand_icon_state = "tile-neon" turf_type = /turf/open/floor/carpet/neon merge_type = /obj/item/stack/tile/carpet/neon + tile_reskin_types = null + // Neon overlay /// The icon used for the neon overlay and emissive overlay. diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 5c8ef888517..6c4c8a881e9 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -37,6 +37,7 @@ icon = 'icons/obj/service/janitor.dmi' icon_state = "trashbag" inhand_icon_state = "trashbag" + worn_icon_state = "trashbag" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' storage_type = /datum/storage/trash @@ -154,6 +155,12 @@ UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) listeningTo = null +/obj/item/storage/bag/ore/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/boulder)) + to_chat(user, span_warning("You can't fit \the [attacking_item] into \the [src]. Perhaps you should break it down first, or find an ore box.")) + return TRUE + return ..() + /obj/item/storage/bag/ore/proc/pickup_ores(mob/living/user) SIGNAL_HANDLER diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index 0fe4210e249..4c18ef4f6df 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -104,11 +104,11 @@ new /obj/item/storage/box/papersack/meat(src) /obj/item/storage/box/hero/mothpioneer - name = "Mothic Fleet Pioneer - 2100's." + name = "Mothic Fleet Pioneer - 2429." desc = "Some claim that the fleet engineers are directly responsible for most modern advancements in spacefaring designs. Although the exact details of their past contributions are somewhat fuzzy, their ingenuity remains unmatched and unquestioned to this day." /obj/item/storage/box/hero/mothpioneer/PopulateContents() - new /obj/item/clothing/head/mothcap(src) + new /obj/item/clothing/head/mothcap/original(src) new /obj/item/clothing/suit/mothcoat/original(src) new /obj/item/crowbar(src) new /obj/item/flashlight/lantern(src) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 23bdfab205c..e1c21d1305c 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -155,6 +155,16 @@ . = ..() atom_storage.set_holdable(list(/obj/item/food/egg)) +/* + * Fertile Egg Box + */ + +/obj/item/storage/fancy/egg_box/fertile + name = "fertile egg box" + desc = "Only one thing here is fertile, and it's not the eggs." + spawn_type = /obj/item/food/egg/fertile + spawn_count = 6 + /* * Candle Box */ @@ -506,7 +516,7 @@ spawn_type = /obj/item/food/pickle spawn_count = 10 contents_tag = "pickle" - foldable_result = null + foldable_result = /obj/item/reagent_containers/cup/beaker/large custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) open_status = FANCY_CONTAINER_ALWAYS_OPEN has_open_closed_states = FALSE diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 94c8847577e..82a96bb3350 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -682,12 +682,11 @@ implant_color = "r" /obj/item/implant/nuclear_operative/get_data() - var/dat = {"Implant Specifications:
- Name: Suspicious Implant
- Life: UNKNOWN
- Implant Details:
- Function: Strange implant that seems to resist any attempts at scanning it."} - return dat + return "Implant Specifications:
\ + Name: Suspicious Implant
\ + Life: UNKNOWN
\ + Implant Details:
\ + Function: Strange implant that seems to resist any attempts at scanning it." /obj/item/implant/nuclear_operative/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) . = ..() diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 6b84407ed30..6c11c435507 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -1,5 +1,9 @@ /// How much time (in seconds) is assumed to pass while assuming air. Used to scale overpressure/overtemp damage when assuming air. #define ASSUME_AIR_DT_FACTOR 1 +/// Multiplies the pressure of assembly bomb explosions before it's put through THE LOGARITHM +#define ASSEMBLY_BOMB_COEFFICIENT 0.5 +/// Base of the logarithmic function used to calculate assembly bomb explosion size +#define ASSEMBLY_BOMB_BASE 2.7 /** * # Gas Tank @@ -48,6 +52,10 @@ var/list/reaction_info /// Mob that is currently breathing from the tank. var/mob/living/carbon/breathing_mob = null + /// Attached assembly, can either detonate the tank or release its contents when receiving a signal + var/obj/item/assembly_holder/tank_assembly + /// Whether or not it will try to explode when it receives a signal + var/bomb_status = FALSE /// Closes the tank if dropped while open. /datum/armor/item_tank @@ -123,8 +131,16 @@ /obj/item/tank/Destroy() STOP_PROCESSING(SSobj, src) air_contents = null + QDEL_NULL(tank_assembly) return ..() +/obj/item/tank/update_overlays() + . = ..() + if(tank_assembly) + . += tank_assembly.icon_state + . += tank_assembly.overlays + . += "bomb_assembly" + /obj/item/tank/examine(mob/user) var/obj/icon = src . = ..() @@ -155,6 +171,9 @@ . += span_notice("It feels [descriptive].") + if(tank_assembly) + . += span_warning("There is some kind of device [EXAMINE_HINT("rigged")] to the tank!") + /obj/item/tank/deconstruct(disassembled = TRUE) var/atom/location = loc if(location) @@ -176,8 +195,30 @@ /obj/item/tank/attackby(obj/item/attacking_item, mob/user, params) add_fingerprint(user) if(istype(attacking_item, /obj/item/assembly_holder)) + if(tank_assembly) + balloon_alert(user, "something already attached!") + return ITEM_INTERACT_BLOCKING bomb_assemble(attacking_item, user) - return TRUE + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/item/tank/wrench_act(mob/living/user, obj/item/tool) + if(tank_assembly) + tool.play_tool_sound(src) + bomb_disassemble(user) + return ITEM_INTERACT_SUCCESS + return ..() + +/obj/item/tank/welder_act(mob/living/user, obj/item/tool) + if(bomb_status) + balloon_alert(user, "already welded!") + return ITEM_INTERACT_BLOCKING + if(tool.use_tool(src, user, 0, volume=40)) + bomb_status = TRUE + balloon_alert(user, "bomb armed") + log_bomber(user, "welded a single tank bomb,", src, "| Temp: [air_contents.temperature] Pressure: [air_contents.return_pressure()]") + add_fingerprint(user) + return ITEM_INTERACT_SUCCESS return ..() /obj/item/tank/ui_state(mob/user) @@ -361,16 +402,87 @@ /obj/item/tank/proc/explosion_information() return list(TANK_RESULTS_REACTION = reaction_info, TANK_RESULTS_MISC = explosion_info) -/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode - if(igniting) - stack_trace("Attempted to ignite a /obj/item/tank multiple times") - return //no double ignite - igniting = TRUE - // This is done in return_air call, but even then it actually makes zero sense, this tank is going to be deleted - // before ever getting a chance to process. - //START_PROCESSING(SSobj, src) - var/datum/gas_mixture/our_mix = return_air() +/obj/item/tank/on_found(mob/finder) //for mousetraps + . = ..() + if(tank_assembly) + tank_assembly.on_found(finder) +/obj/item/tank/attack_hand() //also for mousetraps + if(..()) + return + if(tank_assembly) + tank_assembly.attack_hand() + +/obj/item/tank/Move() + . = ..() + if(tank_assembly) + tank_assembly.setDir(dir) + +/obj/item/tank/dropped() + . = ..() + if(tank_assembly) + tank_assembly.dropped() + +/obj/item/tank/IsSpecialAssembly() + return TRUE + +/obj/item/tank/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. + audible_message(span_warning("[icon2html(src, hearers(src))] *beep* *beep* *beep*")) + playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + addtimer(CALLBACK(src, PROC_REF(ignite)), 1 SECONDS) + +/// Attaches an assembly holder to the tank to create a bomb. +/obj/item/tank/proc/bomb_assemble(obj/item/assembly_holder/assembly, mob/living/user) + //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it + var/igniter_count = 0 + for(var/obj/item/assembly/igniter/attached_assembly in assembly.assemblies) + igniter_count++ + + if(LAZYLEN(assembly.assemblies) == igniter_count) + return + + if((src in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src)) + balloon_alert(user, "it's stuck!") + return + + if(!user.canUnEquip(assembly)) + balloon_alert(user, "it's stuck!") + return + + if(!user.transferItemToLoc(assembly, src)) + balloon_alert(user, "it's stuck!") + return + + tank_assembly = assembly //Tell the tank about its assembly part + assembly.master = src //Tell the assembly about its new owner + assembly.on_attach() + + balloon_alert(user, "bomb assembled") + update_appearance(UPDATE_OVERLAYS) + +/// Detaches an assembly holder from the tank, disarming the bomb +/obj/item/tank/proc/bomb_disassemble(mob/user) + bomb_status = FALSE + balloon_alert(user, "bomb disarmed") + if(!tank_assembly) + CRASH("bomb_disassemble() called on a tank with no assembly!") + user.put_in_hands(tank_assembly) + tank_assembly.master = null + tank_assembly = null + update_appearance(UPDATE_OVERLAYS) + +/// Ignites the contents of the tank. Called when receiving a signal if the tank is welded and has an igniter attached. +/obj/item/tank/proc/ignite() + if(!bomb_status) // if it isn't welded, release the gases instead + release() + return + + // check to make sure it's not already exploding before exploding it + if(igniting) + CRASH("ignite() called multiple times on [type]") + igniting = TRUE + + var/datum/gas_mixture/our_mix = return_air() our_mix.assert_gases(/datum/gas/plasma, /datum/gas/oxygen) var/fuel_moles = our_mix.gases[/datum/gas/plasma][MOLES] + our_mix.gases[/datum/gas/oxygen][MOLES]/6 our_mix.garbage_collect() @@ -379,6 +491,14 @@ var/turf/ground_zero = get_turf(loc) + /// Used to determine what the temperature of the hotspot when it isn't able to explode + var/igniter_temperature = 0 + for(var/obj/item/assembly/igniter/firestarter in tank_assembly.assemblies) + igniter_temperature = max(igniter_temperature, firestarter.heat) + + if(!igniter_temperature) + CRASH("[type] called ignite() without any igniters attached") + if(bomb_mixture.temperature > (T0C + 400)) strength = (fuel_moles/15) @@ -392,7 +512,7 @@ explosion(ground_zero, devastation_range = -1, light_impact_range = 1, flash_range = 2, explosion_cause = src) else ground_zero.assume_air(bomb_mixture) - ground_zero.hotspot_expose(1000, 125) + ground_zero.hotspot_expose(igniter_temperature, 125) else if(bomb_mixture.temperature > (T0C + 250)) strength = (fuel_moles/20) @@ -403,7 +523,7 @@ explosion(ground_zero, devastation_range = -1, light_impact_range = 1, flash_range = 2, explosion_cause = src) else ground_zero.assume_air(bomb_mixture) - ground_zero.hotspot_expose(1000, 125) + ground_zero.hotspot_expose(igniter_temperature, 125) else if(bomb_mixture.temperature > (T0C + 100)) strength = (fuel_moles/25) @@ -412,21 +532,24 @@ explosion(ground_zero, devastation_range = -1, light_impact_range = round(strength,1), flash_range = round(strength*3,1), explosion_cause = src) else ground_zero.assume_air(bomb_mixture) - ground_zero.hotspot_expose(1000, 125) + ground_zero.hotspot_expose(igniter_temperature, 125) else ground_zero.assume_air(bomb_mixture) - ground_zero.hotspot_expose(1000, 125) + ground_zero.hotspot_expose(igniter_temperature, 125) - if(master) - qdel(master) qdel(src) -/obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. +/// Releases air stored in the tank. Called when signaled without being welded, or when ignited without enough pressure to explode. +/obj/item/tank/proc/release() var/datum/gas_mixture/our_mix = return_air() var/datum/gas_mixture/removed = remove_air(our_mix.total_moles()) var/turf/T = get_turf(src) if(!T) return + log_atmos("[type] released its contents of ", air_contents) T.assume_air(removed) + +#undef ASSEMBLY_BOMB_BASE +#undef ASSEMBLY_BOMB_COEFFICIENT #undef ASSUME_AIR_DT_FACTOR diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 5317afe4a78..214187b7708 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -499,12 +499,15 @@ to_chat(victim, span_warning("[user] teleports into you, knocking you to the floor with the bluespace wave!")) ///Bleed and make blood splatters at tele start and end points -/obj/item/syndicate_teleporter/proc/make_bloods(turf/old_location, turf/new_location, mob/user) +/obj/item/syndicate_teleporter/proc/make_bloods(turf/old_location, turf/new_location, mob/living/user) + user.add_splatter_floor(old_location) + user.add_splatter_floor(new_location) + if(!iscarbon(user)) + return var/mob/living/carbon/carbon_user = user - carbon_user.add_splatter_floor(old_location) - carbon_user.add_splatter_floor(new_location) carbon_user.bleed(10) + /obj/item/paper/syndicate_teleporter name = "Teleporter Guide" default_raw_text = {" diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 9265dc7cb4e..bc4e0a94c16 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -235,7 +235,7 @@ var/mech_dir = mech.dir mech.balloon_alert(user, "prying open...") playsound(mech, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - if(!use_tool(mech, user, mech.enclosed ? 5 SECONDS : 3 SECONDS, volume = 0, extra_checks = CALLBACK(src, PROC_REF(extra_checks), mech, mech_dir))) + if(!use_tool(mech, user, (mech.mecha_flags & IS_ENCLOSED) ? 5 SECONDS : 3 SECONDS, volume = 0, extra_checks = CALLBACK(src, PROC_REF(extra_checks), mech, mech_dir))) mech.balloon_alert(user, "interrupted!") return user.log_message("pried open [mech], located at [loc_name(mech)], which is currently occupied by [mech.occupants.Join(", ")].", LOG_ATTACK) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index fccc6302fd7..9275725ffa8 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -155,6 +155,11 @@ if(!use_tool(attacked_humanoid, user, use_delay, volume=50, amount=1)) return ITEM_INTERACT_BLOCKING + // SKYRAT EDIT ADDITION START + if(!do_after(user, other_delay, attacked_humanoid)) + return ITEM_INTERACT_BLOCKING + + // SKYRAT EDIT ADDITION END item_heal_robotic(attacked_humanoid, user, 15, 0) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 2a6db83d9d4..1057eaabaa3 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -98,12 +98,6 @@ var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) take_damage(amt, BRUTE) -/obj/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - if(!user.is_adult) - return - if(attack_generic(user, rand(10, 15), BRUTE, MELEE, 1)) - log_combat(user, src, "attacked") - /obj/singularity_act() SSexplosions.high_mov_atom += src if(src && !QDELETED(src)) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index cdc2b2bd5ec..1943f0aa398 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -66,3 +66,6 @@ take_damage(power * 2.5e-4, BURN, "energy") power -= power * 5e-4 //walls take a lot out of ya . = ..() + +/obj/structure/animate_atom_living(mob/living/owner) + new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 32e1226c93e..0a157dc98a1 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -12,7 +12,7 @@ smoothing_groups = SMOOTH_GROUP_ALIEN_NEST canSmoothWith = SMOOTH_GROUP_ALIEN_NEST build_stack_type = null - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION elevation = 0 var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "nestoverlay", LYING_MOB_LAYER) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 0eeb8ee15b2..e2038cb623b 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -118,6 +118,12 @@ /obj/structure/bed/medical/AltClick(mob/user) . = ..() + if(!can_interact(user)) + return + + if(has_buckled_mobs() && (user in buckled_mobs)) + return + anchored = !anchored balloon_alert(user, "brakes [anchored ? "applied" : "released"]") update_appearance() diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index be83e86ca7b..2fe14ed1dd9 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -492,7 +492,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) icon_state = null buildstacktype = null item_chair = null - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION alpha = 0 /obj/structure/chair/mime/post_buckle_mob(mob/living/M) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index c440976b409..5ea634cf5f8 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -74,7 +74,7 @@ LINEN BINS return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/bedsheet/attack_self(mob/living/user) - if(!user.CanReach(src)) //No telekenetic grabbing. + if(!user.CanReach(src)) //No telekinetic grabbing. return if(user.body_position != LYING_DOWN) return diff --git a/code/game/objects/structures/construction_console/construction_console.dm b/code/game/objects/structures/construction_console/construction_console.dm index d33c91f7c07..720f568369e 100644 --- a/code/game/objects/structures/construction_console/construction_console.dm +++ b/code/game/objects/structures/construction_console/construction_console.dm @@ -80,12 +80,12 @@ /obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) ..() //When the eye is in use, make it visible to players so they know when someone is building. - SetInvisibility(INVISIBILITY_NONE, id=type) + eyeobj.SetInvisibility(INVISIBILITY_NONE, id=type) /obj/machinery/computer/camera_advanced/base_construction/remove_eye_control(mob/living/user) ..() //Set back to default invisibility when not in use. - RemoveInvisibility(type) + eyeobj.RemoveInvisibility(type) /** * A mob used by [/obj/machinery/computer/camera_advanced/base_construction] for building in specific areas. diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index de68f768c34..b3d3c7085bd 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -145,7 +145,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) populate_contents_immediate() var/static/list/loc_connections = list( - COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(locker_carbon), + COMSIG_LIVING_DISARM_COLLIDE = PROC_REF(locker_living), COMSIG_ATOM_MAGICALLY_UNLOCKED = PROC_REF(on_magic_unlock), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -333,7 +333,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) if(anchorable && !anchored) . += span_notice("It can be [EXAMINE_HINT("bolted")] to the ground.") if(anchored) - . += span_notice("Its [EXAMINE_HINT("bolted")] to the ground.") + . += span_notice("It's [anchorable ? EXAMINE_HINT("bolted") : "attached firmly"] to the ground.") if(length(paint_jobs)) . += span_notice("It can be [EXAMINE_HINT("painted")] another texture.") if(HAS_TRAIT(user, TRAIT_SKITTISH) && divable) @@ -365,6 +365,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) if(istype(held_item) && held_item.tool_behaviour == TOOL_WELDER) if(opened) context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + screentip_change = TRUE else if(!welded && can_weld_shut) context[SCREENTIP_CONTEXT_LMB] = "Weld" @@ -373,7 +374,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) context[SCREENTIP_CONTEXT_LMB] = "Unweld" screentip_change = TRUE - if(istype(held_item) && held_item.tool_behaviour == TOOL_WRENCH) + if(istype(held_item) && held_item.tool_behaviour == TOOL_WRENCH && anchorable) context[SCREENTIP_CONTEXT_RMB] = anchored ? "Unanchor" : "Anchor" screentip_change = TRUE @@ -1159,11 +1160,11 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/return_temperature() return -/obj/structure/closet/proc/locker_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) +/obj/structure/closet/proc/locker_living(datum/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon) SIGNAL_HANDLER if(!opened && (locked || welded)) //Yes this could be less code, no I don't care return - if(!opened && !shove_blocked) + if(!opened && ((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED))) return var/was_opened = opened if(!toggle()) @@ -1173,18 +1174,12 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) else target.Knockdown(SHOVE_KNOCKDOWN_SOLID) update_icon() - if(target == shover) - target.visible_message(span_danger("[target.name] shoves [target.p_them()]self into [src]!"), - null, - span_hear("You hear shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) - to_chat(shover, span_notice("You shove yourself into [src]!")) - else - target.visible_message(span_danger("[shover.name] shoves [target.name] into [src]!"), - span_userdanger("You're shoved into [src] by [shover.name]!"), - span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) - to_chat(src, span_danger("You shove [target.name] into [src]!")) - log_combat(shover, target, "shoved", "into [src] (locker/crate)") - return COMSIG_CARBON_SHOVE_HANDLED + target.visible_message(span_danger("[shover.name] shoves [target.name] into [src]!"), + span_userdanger("You're shoved into [src] by [shover.name]!"), + span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) + to_chat(src, span_danger("You shove [target.name] into [src]!")) + log_combat(shover, target, "shoved", "into [src] (locker/crate)[weapon ? " with [weapon]" : ""]") + return COMSIG_LIVING_SHOVE_HANDLED /// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Unlock and open up when we get knock casted. /obj/structure/closet/proc/on_magic_unlock(datum/source, datum/action/cooldown/spell/aoe/knock/spell, atom/caster) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 71166a840df..b8051b942c7 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -107,6 +107,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(!opened) opened = 1 playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) + update_appearance(UPDATE_ICON) else toggle_cabinet(user) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 327f7a054c8..aac22154030 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -455,7 +455,7 @@ icon_state = "pinepresents" desc = "A wondrous decorated Christmas tree. It has presents!" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //protected by the christmas spirit - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION var/gift_type = /obj/item/gift/anything var/unlimited = FALSE var/static/list/took_presents //shared between all xmas trees @@ -1118,4 +1118,3 @@ . = ..() icon_state = "lavarocks[rand(1, 3)]" update_appearance() - diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 2fa25dee9fa..a3d09340d87 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -111,6 +111,20 @@ rad_insulation = RAD_LIGHT_INSULATION resistance_flags = FIRE_PROOF | FREEZE_PROOF +/obj/structure/holosign/barrier/atmos/proc/clearview_transparency() + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 25 + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + var/turf/our_turf = get_turf(src) + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir) + +/obj/structure/holosign/barrier/atmos/proc/reset_transparency() + mouse_opacity = initial(mouse_opacity) + alpha = initial(alpha) + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + var/turf/our_turf = get_turf(src) + SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir, add_appearance_flags = RESET_ALPHA) + /obj/structure/holosign/barrier/atmos/sturdy name = "sturdy holofirelock" max_integrity = 150 diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 9b7b5590018..ef6ea9d433e 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -224,17 +224,6 @@ use(user, going_up = FALSE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/structure/ladder/attack_slime(mob/user, list/modifiers) - use(user) - return TRUE - -/obj/structure/ladder/attack_slime_secondary(mob/user, list/modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - use(user, going_up = FALSE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - /obj/structure/ladder/attackby(obj/item/item, mob/user, params) use(user) return TRUE diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index d9653378c62..72f28ed8251 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -158,14 +158,18 @@ /obj/structure/lattice/lava/deconstruction_hints(mob/user) return span_notice("The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile.") -/obj/structure/lattice/lava/attackby(obj/item/C, mob/user, params) +/obj/structure/lattice/lava/attackby(obj/item/attacking_item, mob/user, params) . = ..() - if(istype(C, /obj/item/stack/tile/iron)) - var/obj/item/stack/tile/iron/P = C - if(P.use(1)) - to_chat(user, span_notice("You construct a floor plating, as lava settles around the rods.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) - new /turf/open/floor/plating(locate(x, y, z)) - else - to_chat(user, span_warning("You need one floor tile to build atop [src].")) + if(!istype(attacking_item, /obj/item/stack/tile/iron)) return + var/obj/item/stack/tile/iron/attacking_tiles = attacking_item + if(!attacking_tiles.use(1)) + to_chat(user, span_warning("You need one floor tile to build atop [src].")) + return + to_chat(user, span_notice("You construct new plating with [src] as support.")) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + + var/turf/turf_we_place_on = get_turf(src) + turf_we_place_on.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + + qdel(src) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm new file mode 100644 index 00000000000..72cdd7d4ba5 --- /dev/null +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -0,0 +1,533 @@ +#define MAX_ARTIFACT_ROLL_CHANCE 10 +#define MINERAL_TYPE_OPTIONS_RANDOM 4 +#define OVERLAY_OFFSET_START 0 +#define OVERLAY_OFFSET_EACH 5 + +/obj/structure/ore_vent + name = "ore vent" + desc = "An ore vent, brimming with underground ore. Scan with an advanced mining scanner to start extracting ore from it." + icon = 'icons/obj/mining_zones/terrain.dmi' + icon_state = "ore_vent" + move_resist = MOVE_FORCE_EXTREMELY_STRONG + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //This thing will take a beating. + anchored = TRUE + density = TRUE + can_buckle = TRUE + + /// Has this vent been tapped to produce boulders? Cannot be untapped. + var/tapped = FALSE + /// Has this vent been scanned by a mining scanner? Cannot be scanned again. Adds ores to the vent's description. + var/discovered = FALSE + /// Is this type of vent exempt from the 15 vent limit? Think the free iron/glass vent or boss vents. This also causes it to not roll for random mineral breakdown. + var/unique_vent = FALSE + /// What icon_state do we use when the ore vent has been tapped? + var/icon_state_tapped = "ore_vent_active" + + /// A weighted list of what minerals are contained in this vent, with weight determining how likely each mineral is to be picked in produced boulders. + var/list/mineral_breakdown = list() + /// How many rolls on the mineral_breakdown list are made per boulder produced? EG: 3 rolls means 3 minerals per boulder, with order determining percentage. + var/minerals_per_boulder = 3 + /// How many minerals are picked to be in the ore vent? These are added to the mineral_breakdown list. + var/minerals_per_breakdown = MINERAL_TYPE_OPTIONS_RANDOM + /// What size boulders does this vent produce? + var/boulder_size = BOULDER_SIZE_SMALL + /// Reference to this ore vent's NODE drone, to track wave success. + var/mob/living/basic/node_drone/node = null //this path is a placeholder. + /// String containing the formatted list of ores that this vent can produce, and who first discovered this vent. + var/ore_string = "" + /// Associated list of vent size weights to pick from. + var/list/ore_vent_options = list( + LARGE_VENT_TYPE = 3, + MEDIUM_VENT_TYPE = 5, + SMALL_VENT_TYPE = 7, + ) + + /// What string do we use to warn the player about the excavation event? + var/excavation_warning = "Are you ready to excavate this ore vent?" + ///Are we currently spawning mobs? + var/spawning_mobs = FALSE + /// A list of mobs that can be spawned by this vent during a wave defense event. + var/list/defending_mobs = list( + /mob/living/basic/mining/goliath, + /mob/living/basic/mining/legion/spawner_made, + /mob/living/basic/mining/watcher, + /mob/living/basic/mining/lobstrosity/lava, + /mob/living/basic/mining/brimdemon, + /mob/living/basic/mining/bileworm, + ) + ///What items can be used to scan a vent? + var/static/list/scanning_equipment = list( + /obj/item/t_scanner/adv_mining_scanner, + /obj/item/mining_scanner, + ) + + /// What base icon_state do we use for this vent's boulders? + var/boulder_icon_state = "boulder" + /// Percent chance that this vent will produce an artifact boulder. + var/artifact_chance = 0 + /// We use a cooldown to prevent the wave defense from being started multiple times. + COOLDOWN_DECLARE(wave_cooldown) + COOLDOWN_DECLARE(manual_vent_cooldown) + + +/obj/structure/ore_vent/Initialize(mapload) + if(mapload) + generate_description() + register_context() + SSore_generation.possible_vents += src + boulder_icon_state = pick(list( + "boulder", + "rock", + "stone", + )) + if(tapped) + SSore_generation.processed_vents += src + icon_state = icon_state_tapped + update_appearance(UPDATE_ICON_STATE) + add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) + return ..() + +/obj/structure/ore_vent/Destroy() + SSore_generation.possible_vents -= src + node = null + if(tapped) + SSore_generation.processed_vents -= src + return ..() + +/obj/structure/ore_vent/attackby(obj/item/attacking_item, mob/user, params) + . = ..() + if(.) + return TRUE + if(!is_type_in_list(attacking_item, scanning_equipment)) + return TRUE + if(tapped) + balloon_alert_to_viewers("vent tapped!") + return TRUE + scan_and_confirm(user) + return TRUE + +/obj/structure/ore_vent/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + if(!HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + return + if(!discovered) + to_chat(user, span_notice("You can't quite find the weakpoint of [src]... Perhaps it needs to be scanned first?")) + return + to_chat(user, span_notice("You start striking [src] with your golem's fist, attempting to dredge up a boulder...")) + for(var/i in 1 to 3) + if(do_after(user, boulder_size * 1 SECONDS, src)) + user.apply_damage(20, STAMINA) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + produce_boulder() + visible_message(span_notice("You've successfully produced a boulder! Boy are your arms tired.")) + +/obj/structure/ore_vent/attack_basic_mob(mob/user, list/modifiers) + . = ..() + if(!HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + return + produce_boulder() + +/obj/structure/ore_vent/is_buckle_possible(mob/living/target, force, check_loc) + . = ..() + if(tapped) + return FALSE + if(istype(target, /mob/living/basic/node_drone)) + return TRUE + +/obj/structure/ore_vent/examine(mob/user) + . = ..() + if(discovered) + switch(boulder_size) + if(BOULDER_SIZE_SMALL) + . += span_notice("This vent produces [span_bold("small")] boulders containing [ore_string]") + if(BOULDER_SIZE_MEDIUM) + . += span_notice("This vent produces [span_bold("medium")] boulders containing [ore_string]") + if(BOULDER_SIZE_LARGE) + . += span_notice("This vent produces [span_bold("large")] boulders containing [ore_string]") + else + . += span_notice("This vent can be scanned with a [span_bold("Mining Scanner")].") + +/obj/structure/ore_vent/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(is_type_in_list(held_item, scanning_equipment)) + context[SCREENTIP_CONTEXT_LMB] = "Scan vent" + return CONTEXTUAL_SCREENTIP_SET + +/** + * Picks n types of materials to pack into a boulder created by this ore vent, where n is this vent's minerals_per_boulder. + * Then assigns custom_materials based on boulder_size, assigned via the ore_quantity_function + */ +/obj/structure/ore_vent/proc/create_mineral_contents() + var/list/refined_list = list() + for(var/iteration in 1 to minerals_per_boulder) + var/datum/material/material = pick_weight(mineral_breakdown) + refined_list[material] += ore_quantity_function(iteration) + return refined_list + +/** + * This proc is called when the ore vent is initialized, in order to determine what minerals boulders it spawns can contain. + * The materials available are determined by SSore_generation.ore_vent_minerals, which is a list of all minerals that can be contained in ore vents for a given cave generation. + * As a result, minerals use a weighted list as seen by ore_vent_minerals_default, which is then copied to ore_vent_minerals. + * Once a material is picked from the weighted list, it's removed from ore_vent_minerals, so that it can't be picked again and provided it's own internal weight used when assigning minerals to boulders spawned by this vent. + * May also be called after the fact, as seen in SSore_generation's initialize, to add more minerals to an existing vent. + * + * The above applies only when spawning in at mapload, otherwise we pick randomly from ore_vent_minerals_default. + * + * @params max_minerals How many minerals should be added to this vent? Defaults to MINERAL_TYPE_OPTIONS_RANDOM, which is 4. + * @params map_loading Is this vent being spawned in at mapload? If so, we use the ore_generation subsystem's ore_vent_minerals list to pick minerals. Otherwise, we pick randomly from ore_vent_minerals_default. + */ +/obj/structure/ore_vent/proc/generate_mineral_breakdown(max_minerals = MINERAL_TYPE_OPTIONS_RANDOM, map_loading = FALSE) + if(max_minerals < 1) + CRASH("generate_mineral_breakdown called with max_minerals < 1.") + for(var/iterator in 1 to max_minerals) + if(!SSore_generation.ore_vent_minerals.len && map_loading) + CRASH("No minerals left to pick from! We may have spawned too many ore vents in init, or added too many ores to the existing vents.") + var/datum/material/material + if(map_loading) + material = pick_weight(SSore_generation.ore_vent_minerals) + if(is_type_in_list(mineral_breakdown, material)) + continue + if(map_loading) + SSore_generation.ore_vent_minerals[material] -= 1 //We remove 1 from the ore vent's mineral breakdown weight, so that it can't be picked again. + if(SSore_generation.ore_vent_minerals[material] <= 0) + SSore_generation.ore_vent_minerals -= material + else + material = pick_weight(SSore_generation.ore_vent_minerals_default) + mineral_breakdown[material] = rand(1, 4) + + +/** + * Returns the quantity of mineral sheets in each ore vent's boulder contents roll. + * First roll can produce the most ore, with subsequent rolls scaling lower logarithmically. + * Inversely scales with ore_floor, so that the first roll is the largest, and subsequent rolls are smaller. + * (1 -> from 16 to 7 sheets of materials, and 3 -> from 8 to 6 sheets of materials on a small vent) + * This also means a large boulder can highroll a boulder with a full stack of 50 sheets of material. + * @params ore_floor The number of minerals already rolled. Used to scale the logarithmic function. + */ +/obj/structure/ore_vent/proc/ore_quantity_function(ore_floor) + return SHEET_MATERIAL_AMOUNT * round(boulder_size * (log(rand(1 + ore_floor, 4 + ore_floor)) ** -1)) + +/** + * Starts the wave defense event, which will spawn a number of lavaland mobs based on the size of the ore vent. + * Called after the vent has been tapped by a scanning device. + * Will summon a number of waves of mobs, ending in the vent being tapped after the final wave. + */ +/obj/structure/ore_vent/proc/start_wave_defense() + AddComponent(\ + /datum/component/spawner, \ + spawn_types = defending_mobs, \ + spawn_time = (10 SECONDS + (5 SECONDS * (boulder_size/5))), \ + max_spawned = 10, \ + max_spawn_per_attempt = (1 + (boulder_size/5)), \ + spawn_text = "emerges to assault", \ + spawn_distance = 4, \ + spawn_distance_exclude = 3, \ + ) + var/wave_timer = 60 SECONDS + if(boulder_size == BOULDER_SIZE_MEDIUM) + wave_timer = 90 SECONDS + else if(boulder_size == BOULDER_SIZE_LARGE) + wave_timer = 150 SECONDS + COOLDOWN_START(src, wave_cooldown, wave_timer) + addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer) + spawning_mobs = TRUE + icon_state = icon_state_tapped + update_appearance(UPDATE_ICON_STATE) + +/** + * Called when the wave defense event ends, after a variable amount of time in start_wave_defense. + * + * If the node drone is still alive, the ore vent is tapped and the ore vent will begin generating boulders. + * If the node drone is dead, the ore vent is not tapped and the wave defense can be reattempted. + * + * Also gives xp and mining points to all nearby miners in equal measure. + */ +/obj/structure/ore_vent/proc/handle_wave_conclusion() + SEND_SIGNAL(src, COMSIG_VENT_WAVE_CONCLUDED) + COOLDOWN_RESET(src, wave_cooldown) + particles = null + if(!QDELETED(node)) ///The Node Drone has survived the wave defense, and the ore vent is tapped. + tapped = TRUE + SSore_generation.processed_vents += src + balloon_alert_to_viewers("vent tapped!") + icon_state = icon_state_tapped + update_appearance(UPDATE_ICON_STATE) + else + visible_message(span_danger("\the [src] creaks and groans as the mining attempt fails, and the vent closes back up.")) + icon_state = initial(icon_state) + update_appearance(UPDATE_ICON_STATE) + return FALSE //Bad end, try again. + + for(var/mob/living/miner in range(7, src)) //Give the miners who are near the vent points and xp. + var/obj/item/card/id/user_id_card = miner.get_idcard(TRUE) + if(miner.stat <= SOFT_CRIT) + miner.mind?.adjust_experience(/datum/skill/mining, MINING_SKILL_BOULDER_SIZE_XP * boulder_size) + if(!user_id_card) + continue + var/point_reward_val = (MINER_POINT_MULTIPLIER * boulder_size) - MINER_POINT_MULTIPLIER // We remove the base value of discovering the vent + user_id_card.registered_account.mining_points += point_reward_val + user_id_card.registered_account.bank_card_talk("You have been awarded [point_reward_val] mining points for your efforts.") + node.pre_escape() //Visually show the drone is done and flies away. + add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) + +/** + * Called when the ore vent is tapped by a scanning device. + * Gives a readout of the ores available in the vent that gets added to the description, + * then asks the user if they want to start wave defense if it's already been discovered. + * @params user The user who tapped the vent. + * @params scan_only If TRUE, the vent will only scan, and not prompt to start wave defense. Used by the mech mineral scanner. + */ +/obj/structure/ore_vent/proc/scan_and_confirm(mob/living/user, scan_only = FALSE) + if(tapped) + balloon_alert_to_viewers("vent tapped!") + return + if(!COOLDOWN_FINISHED(src, wave_cooldown)) + if(!scan_only) + balloon_alert_to_viewers("protect the node drone!") + return + if(!discovered) + if(scan_only) + discovered = TRUE + generate_description(user) + balloon_alert_to_viewers("vent scanned!") + return + + if(DOING_INTERACTION_WITH_TARGET(user, src)) + balloon_alert(user, "already scanning!") + return + balloon_alert(user, "scanning...") + playsound(src, 'sound/items/timer.ogg', 30, TRUE) + if(!do_after(user, 4 SECONDS, src)) + return + + discovered = TRUE + balloon_alert(user, "vent scanned!") + generate_description(user) + var/obj/item/card/id/user_id_card = user.get_idcard(TRUE) + if(isnull(user_id_card)) + return + user_id_card.registered_account.mining_points += (MINER_POINT_MULTIPLIER) + user_id_card.registered_account.bank_card_talk("You've been awarded [MINER_POINT_MULTIPLIER] mining points for discovery of an ore vent.") + return + if(scan_only) + return + if(tgui_alert(user, excavation_warning, "Begin defending ore vent?", list("Yes", "No")) != "Yes") + return + if(!COOLDOWN_FINISHED(src, wave_cooldown)) + return + //This is where we start spitting out mobs. + Shake(duration = 3 SECONDS) + node = new /mob/living/basic/node_drone(loc) + node.arrive(src) + RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) + particles = new /particles/smoke/ash() + + for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense. + for(var/turf/closed/mineral/rock in oview(i)) + if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // so it's too common + new /obj/effect/decal/cleanable/rubble(rock) + if(prob(100 - (i * 15))) + rock.gets_drilled(user, FALSE) + if(prob(50)) + new /obj/effect/decal/cleanable/rubble(rock) + sleep(0.6 SECONDS) + + start_wave_defense() + +/** + * Generates a description of the ore vent to ore_string, based on the minerals contained within it. + * Ore_string is passed to examine(). + */ +/obj/structure/ore_vent/proc/generate_description(mob/user) + ore_string = "" + var/list/mineral_names = list() + for(var/datum/material/resource as anything in mineral_breakdown) + mineral_names += initial(resource.name) + + ore_string = "[english_list(mineral_names)]." + if(user) + ore_string += "\nThis vent was first discovered by [user]." +/** + * Adds floating temp_visual overlays to the vent, showcasing what minerals are contained within it. + * If undiscovered, adds a single overlay with the icon_state "unknown". + */ +/obj/structure/ore_vent/proc/add_mineral_overlays() + if(mineral_breakdown.len && !discovered) + var/obj/effect/temp_visual/mining_overlay/vent/new_mat = new /obj/effect/temp_visual/mining_overlay/vent(drop_location()) + new_mat.icon_state = "unknown" + return + for(var/datum/material/selected_mat as anything in mineral_breakdown) + var/obj/effect/temp_visual/mining_overlay/vent/new_mat = new /obj/effect/temp_visual/mining_overlay/vent(drop_location()) + new_mat.icon_state = selected_mat.name + +/** + * Here is where we handle producing a new boulder, based on the qualities of this ore vent. + * Returns the boulder produced. + * @params apply_cooldown Should we apply a cooldown to producing boulders? Default's false, used by manual boulder production (goldgrubs, golems, etc). + */ +/obj/structure/ore_vent/proc/produce_boulder(apply_cooldown = FALSE) + if(!COOLDOWN_FINISHED(src, manual_vent_cooldown)) + return + var/obj/item/boulder/new_rock + if(prob(artifact_chance)) + new_rock = new /obj/item/boulder/artifact(loc) + else + new_rock = new /obj/item/boulder(loc) + var/list/mats_list = create_mineral_contents() + Shake(duration = 1.5 SECONDS) + new_rock.set_custom_materials(mats_list) + new_rock.flavor_boulder(src) + if(apply_cooldown) + COOLDOWN_START(src, manual_vent_cooldown, 10 SECONDS) + return new_rock + + +//comes with the station, and is already tapped. +/obj/structure/ore_vent/starter_resources + name = "active ore vent" + desc = "An ore vent, brimming with underground ore. It's already supplying the station with iron and glass." + tapped = TRUE + discovered = TRUE + unique_vent = TRUE + boulder_size = BOULDER_SIZE_SMALL + mineral_breakdown = list( + /datum/material/iron = 50, + /datum/material/glass = 50, + ) + +/obj/structure/ore_vent/random + /// Static list of ore vent types, for random generation. + var/static/list/ore_vent_types = list( + BOULDER_SIZE_SMALL, + BOULDER_SIZE_MEDIUM, + BOULDER_SIZE_LARGE, + ) + +/obj/structure/ore_vent/random/Initialize(mapload) + . = ..() + if(!unique_vent && !mapload) + generate_mineral_breakdown(map_loading = mapload) //Default to random mineral breakdowns, unless this is a unique vent or we're still setting up default vent distribution. + generate_description() + artifact_chance = rand(0, MAX_ARTIFACT_ROLL_CHANCE) + var/string_boulder_size = pick_weight(ore_vent_options) + name = "[string_boulder_size] ore vent" + switch(string_boulder_size) + if(LARGE_VENT_TYPE) + boulder_size = BOULDER_SIZE_LARGE + if(mapload) + SSore_generation.ore_vent_sizes["large"] -= 1 + if(MEDIUM_VENT_TYPE) + boulder_size = BOULDER_SIZE_MEDIUM + if(mapload) + SSore_generation.ore_vent_sizes["medium"] -= 1 + if(SMALL_VENT_TYPE) + boulder_size = BOULDER_SIZE_SMALL + if(mapload) + SSore_generation.ore_vent_sizes["small"] -= 1 + else + boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value + name = initial(name) + + + +/obj/structure/ore_vent/random/icebox //The one that shows up on the top level of icebox + icon_state = "ore_vent_ice" + icon_state_tapped = "ore_vent_ice_active" + defending_mobs = list( + /mob/living/basic/mining/lobstrosity, + /mob/living/basic/mining/legion/snow/spawner_made, + /mob/living/simple_animal/hostile/asteroid/polarbear, + /mob/living/simple_animal/hostile/asteroid/wolf, + ) + ore_vent_options = list( + "small", + ) + +/obj/structure/ore_vent/random/icebox/lower + defending_mobs = list( + /mob/living/basic/mining/ice_whelp, + /mob/living/basic/mining/lobstrosity, + /mob/living/basic/mining/legion/snow/spawner_made, + /mob/living/basic/mining/ice_demon, + /mob/living/simple_animal/hostile/asteroid/polarbear, + /mob/living/simple_animal/hostile/asteroid/wolf, + ) + ore_vent_options = list( + "small", + "medium", + "large", + ) + + +/obj/structure/ore_vent/boss + name = "menacing ore vent" + desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful." + unique_vent = TRUE + boulder_size = BOULDER_SIZE_LARGE + mineral_breakdown = list( // All the riches of the world, eeny meeny boulder room. + /datum/material/iron = 1, + /datum/material/glass = 1, + /datum/material/plasma = 1, + /datum/material/titanium = 1, + /datum/material/silver = 1, + /datum/material/gold = 1, + /datum/material/diamond = 1, + /datum/material/uranium = 1, + /datum/material/bluespace = 1, + /datum/material/plastic = 1, + ) + defending_mobs = list( + /mob/living/simple_animal/hostile/megafauna/bubblegum, + /mob/living/simple_animal/hostile/megafauna/dragon, + /mob/living/simple_animal/hostile/megafauna/colossus, + ) + excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent?" + ///What boss do we want to spawn? + var/summoned_boss = null + +/obj/structure/ore_vent/boss/Initialize(mapload) + . = ..() + summoned_boss = pick(defending_mobs) + +/obj/structure/ore_vent/boss/examine(mob/user) + . = ..() + var/boss_string = "" + switch(summoned_boss) + if(/mob/living/simple_animal/hostile/megafauna/bubblegum) + boss_string = "A giant fleshbound beast" + if(/mob/living/simple_animal/hostile/megafauna/dragon) + boss_string = "Sharp teeth and scales" + if(/mob/living/simple_animal/hostile/megafauna/colossus) + boss_string = "A giant, armored behemoth" + if(/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner) + boss_string = "A bloody drillmark" + if(/mob/living/simple_animal/hostile/megafauna/wendigo) + boss_string = "A chilling skull" + . += span_notice("[boss_string] is etched onto the side of the vent.") + +/obj/structure/ore_vent/boss/start_wave_defense() + // Completely override the normal wave defense, and just spawn the boss. + var/mob/living/simple_animal/hostile/megafauna/boss = new summoned_boss(loc) + RegisterSignal(boss, COMSIG_LIVING_DEATH, PROC_REF(handle_wave_conclusion)) + COOLDOWN_START(src, wave_cooldown, INFINITY) //Basically forever + boss.say(boss.summon_line) //Pull their specific summon line to say. Default is meme text so make sure that they have theirs set already. + +/obj/structure/ore_vent/boss/handle_wave_conclusion() + node = new /mob/living/basic/node_drone(loc) //We're spawning the vent after the boss dies, so the player can just focus on the boss. + COOLDOWN_RESET(src, wave_cooldown) + return ..() + +/obj/structure/ore_vent/boss/icebox + icon_state = "ore_vent_ice" + icon_state_tapped = "ore_vent_ice_active" + defending_mobs = list( + /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner, + /mob/living/simple_animal/hostile/megafauna/wendigo, + /mob/living/simple_animal/hostile/megafauna/colossus, + ) + +#undef MAX_ARTIFACT_ROLL_CHANCE +#undef MINERAL_TYPE_OPTIONS_RANDOM +#undef OVERLAY_OFFSET_START +#undef OVERLAY_OFFSET_EACH diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 54896c2e414..a752faba40c 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -91,8 +91,24 @@ visible_message(span_danger(destruction_message)) qdel(src) +/obj/structure/statue/petrified/animate_atom_living(mob/living/owner) + if(isnull(petrified_mob)) + return ..() + var/mob/living/basic/statue/new_statue = new(drop_location()) + new_statue.name = "statue of [petrified_mob.name]" + if(owner) + new_statue.befriend(owner) + new_statue.icon = icon + new_statue.icon_state = icon_state + new_statue.copy_overlays(src, TRUE) + new_statue.atom_colours = atom_colours.Copy() + petrified_mob.mind?.transfer_to(new_statue) + to_chat(new_statue, span_userdanger("You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! [owner ? "Do not harm [owner], your creator" : ""].")) + forceMove(new_statue) + /mob/proc/petrify(statue_timer) + return /mob/living/carbon/human/petrify(statue_timer, save_brain, colorlist) if(!isturf(loc)) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index a3af72878c3..0f1b1bb57b5 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -64,7 +64,14 @@ /obj/structure/spawner/Initialize(mapload) . = ..() - AddComponent(spawner_type, mob_types, spawn_time, max_mobs, faction, spawn_text) + AddComponent(\ + spawner_type, \ + spawn_types = mob_types, \ + spawn_time = spawn_time, \ + max_spawned = max_mobs, \ + faction = faction, \ + spawn_text = spawn_text, \ + ) /obj/structure/spawner/attack_animal(mob/living/simple_animal/user, list/modifiers) if(faction_check(faction, user.faction, FALSE) && !user.client) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index c3ec9b166f9..dc99dcae275 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -47,7 +47,7 @@ make_climbable() var/static/list/loc_connections = list( - COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(table_carbon), + COMSIG_LIVING_DISARM_COLLIDE = PROC_REF(table_living), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -181,7 +181,7 @@ pushed_mob.Knockdown(30) pushed_mob.apply_damage(10, BRUTE) pushed_mob.apply_damage(40, STAMINA) - if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) + if(user.mind?.martial_art?.smashes_tables && user.mind?.martial_art.can_use(user)) deconstruct(FALSE) playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [src]!"), \ @@ -198,7 +198,7 @@ banged_limb?.receive_damage(30, wound_bonus = extra_wound) pushed_mob.apply_damage(60, STAMINA) take_damage(50) - if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) + if(user.mind?.martial_art?.smashes_tables && user.mind?.martial_art.can_use(user)) deconstruct(FALSE) playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.plaintext_zone] against \the [src]!"), @@ -323,17 +323,17 @@ return TRUE return FALSE -/obj/structure/table/proc/table_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) +/obj/structure/table/proc/table_living(datum/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon) SIGNAL_HANDLER - if(!shove_blocked) + if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) return target.Knockdown(SHOVE_KNOCKDOWN_TABLE) target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), - span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) target.throw_at(src, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check - log_combat(shover, target, "shoved", "onto [src] (table)") - return COMSIG_CARBON_SHOVE_HANDLED + log_combat(shover, target, "shoved", "onto [src] (table)[weapon ? " with [weapon]" : ""]") + return COMSIG_LIVING_SHOVE_HANDLED /obj/structure/table/greyscale icon = 'icons/obj/smooth_structures/table_greyscale.dmi' diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 678a9a25314..c86a093340c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -185,7 +185,7 @@ /obj/structure/window/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime +/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal if(!can_be_reached(user)) return return ..() @@ -803,7 +803,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/reinforced/shuttle/indestructible name = "hardened shuttle window" - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION flags_1 = PREVENT_CLICK_UNDER_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/say.dm b/code/game/say.dm index c0e9d4ff8ef..4f888a255c7 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -37,7 +37,9 @@ GLOBAL_LIST_INIT(freqtospan, list( spans |= speech_span if(!language) language = get_selected_language() - send_speech(message, message_range, src, bubble_type, spans, message_language = language, forced = forced) + var/list/message_mods = list() + message_mods[SAY_MOD_VERB] = say_mod(message, message_mods) + send_speech(message, message_range, src, bubble_type, spans, language, message_mods, forced = forced) /// Called when this movable hears a message from a source. /// Returns TRUE if the message was received and understood. @@ -149,6 +151,12 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq) return "" +/** + * Works out and returns which prefix verb the passed message should use. + * + * input - The message for which we want the verb. + * message_mods - A list of message modifiers, i.e. whispering/singing. + */ /atom/movable/proc/say_mod(input, list/message_mods = list()) var/ending = copytext_char(input, -1) if(copytext_char(input, -2) == "!!") @@ -162,15 +170,21 @@ GLOBAL_LIST_INIT(freqtospan, list( else if(ending == "!") return verb_exclaim else - return verb_say + return get_default_say_verb() + +/** + * Gets the say verb we default to if no special verb is chosen. + * This is primarily a hook for inheritors, + * like human_say.dm's tongue-based verb_say changes. + */ +/atom/movable/proc/get_default_say_verb() + return verb_say /atom/movable/proc/say_quote(input, list/spans=list(speech_span), list/message_mods = list()) if(!input) input = "..." - var/say_mod = message_mods[MODE_CUSTOM_SAY_EMOTE] - if (!say_mod) - say_mod = say_mod(input, message_mods) + var/say_mod = message_mods[MODE_CUSTOM_SAY_EMOTE] || message_mods[SAY_MOD_VERB] || say_mod(input, message_mods) SEND_SIGNAL(src, COMSIG_MOVABLE_SAY_QUOTE, args) @@ -196,8 +210,8 @@ GLOBAL_LIST_INIT(freqtospan, list( #undef ENCODE_HTML_EMPHASIS -/// Modifies the message by comparing the languages of the speaker with the languages of the hearer. Called on the hearer. -/atom/movable/proc/translate_language(atom/movable/speaker, datum/language/language, raw_message, list/spans, list/message_mods = list()) +/// Modifies the message by comparing the languages of the speaker with the languages of the hearer. Called on the hearer. +/atom/movable/proc/translate_language(atom/movable/speaker, datum/language/language, raw_message, list/spans, list/message_mods) if(!language) return "makes a strange sound." @@ -237,7 +251,7 @@ GLOBAL_LIST_INIT(freqtospan, list( return "2" return "0" -/atom/movable/proc/GetVoice() +/atom/proc/GetVoice() return "[src]" //Returns the atom's name, prepended with 'The' if it's not a proper noun //HACKY VIRTUALSPEAKER STUFF BEYOND THIS POINT @@ -262,7 +276,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/virtualspeaker) source = M if(istype(M)) name = radio.anonymize ? "Unknown" : M.GetVoice() - verb_say = M.verb_say + verb_say = M.get_default_say_verb() verb_ask = M.verb_ask verb_exclaim = M.verb_exclaim verb_yell = M.verb_yell diff --git a/code/game/sound.dm b/code/game/sound.dm index f1b5dd0406f..8cf9e6fef80 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -417,4 +417,12 @@ soundin = pick('sound/effects/rocktap1.ogg', 'sound/effects/rocktap2.ogg', 'sound/effects/rocktap3.ogg') if(SFX_SEAR) soundin = 'sound/weapons/sear.ogg' + if(SFX_REEL) + soundin = pick( + 'sound/items/reel1.ogg', + 'sound/items/reel2.ogg', + 'sound/items/reel3.ogg', + 'sound/items/reel4.ogg', + 'sound/items/reel5.ogg', + ) return soundin diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index ec02e5b27a7..6d47d353b51 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -28,15 +28,21 @@ color = "#677" //SKYRAT EDIT ADDITION var/turf/open/floor/plating/turf_type = /turf/open/misc/asteroid/airless + /// The path of the ore stack we spawn when we're mined. var/obj/item/stack/ore/mineralType = null + /// If we spawn a boulder like on the gulag, we use this in lou of mineralType + var/obj/item/boulder/spawned_boulder = null + /// How much ore we spawn when we're mining a mineralType. var/mineralAmt = 3 - var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner - var/defer_change = 0 - // If true you can mine the mineral turf without tools. + ///Holder for the image we display when we're pinged by a mining scanner + var/scan_state = "" + ///If true, this turf will not call AfterChange during change_turf calls. + var/defer_change = FALSE + /// If true you can mine the mineral turf without tools. var/weak_turf = FALSE - ///How long it takes to mine this turf with tools, before the tool's speed and the user's skill modifier are factored in. + /// How long it takes to mine this turf with tools, before the tool's speed and the user's skill modifier are factored in. var/tool_mine_speed = 4 SECONDS - ///How long it takes to mine this turf without tools, if it's weak. + /// How long it takes to mine this turf without tools, if it's weak. var/hand_mine_speed = 15 SECONDS @@ -85,6 +91,70 @@ var/obj/item/stack/ore/the_ore = ore_type scan_state = initial(the_ore.scan_state) // I SAID. SWITCH. TO. IT. mineralType = ore_type // Everything else assumes that this is typed correctly so don't set it to non-ores thanks. + if(ispath(ore_type, /obj/item/boulder)) + scan_state = "rock_Boulder" //Yes even the lowly boulder has a scan state + spawned_boulder = /obj/item/boulder/gulag_expanded + +/** + * Returns the distance to the nearest ore vent, where ore vents are tracked in SSore_generation's possible vents list. + * Returns 0 if we're not on lavaland, and as we're using get_dist, our range is limited to 127 tiles. + */ +/turf/closed/mineral/proc/prox_to_vent() + if(!is_mining_level(z)) + return 0 + + var/distance = 128 // Max distance for a get_dist is 127 + for(var/obj/structure/ore_vent/vent as anything in SSore_generation.possible_vents) + if(vent.unique_vent) + continue + if(vent.z != src.z) + continue //Silly + var/temp_distance = get_dist(src, vent) + if(temp_distance < distance) + distance = temp_distance + return distance + +/** + * Returns the chance of ore spawning in this turf, based on proximity to a vent. + * See mining defines for the chances and distance defines. + */ +/turf/closed/mineral/proc/proximity_ore_chance() + var/distance = prox_to_vent() + if(distance == 0) //We asked for a random chance but we could not successfully find a vent, so 0. + return 0 + + if(distance < VENT_PROX_VERY_HIGH) + return VENT_CHANCE_VERY_HIGH + if(distance < VENT_PROX_HIGH) + return VENT_CHANCE_HIGH + if(distance < VENT_PROX_MEDIUM) + return VENT_CHANCE_MEDIUM + if(distance < VENT_PROX_LOW) + return VENT_CHANCE_LOW + if(distance < VENT_PROX_FAR) + return VENT_CHANCE_FAR + return 0 + +/** + * Returns the amount of ore to spawn in this turf, based on proximity to a vent. + * If for some reason we have a distance of zero (like being off mining Z levels), we return a random amount between 1 and 5 instead. + */ +/turf/closed/mineral/proc/scale_ore_to_vent() + var/distance = prox_to_vent() + if(distance == 0) // We're not on lavaland or similar failure condition + return rand(1,5) + + if(distance < VENT_PROX_VERY_HIGH) + return 5 + if(distance < VENT_PROX_HIGH) + return 4 + if(distance < VENT_PROX_MEDIUM) + return 3 + if(distance < VENT_PROX_LOW) + return 2 + if(distance < VENT_PROX_FAR) + return 1 + return 0 /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) if(turf_type) @@ -145,9 +215,11 @@ /turf/closed/mineral/proc/gets_drilled(mob/user, give_exp = FALSE) if(istype(user)) SEND_SIGNAL(user, COMSIG_MOB_MINED, src, give_exp) - if (mineralType && (mineralAmt > 0)) + if(mineralType && (mineralAmt > 0)) new mineralType(src, mineralAmt) SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, mineralType) + if(spawned_boulder) + new spawned_boulder(src) if(ishuman(user)) var/mob/living/carbon/human/H = user if(give_exp) @@ -206,7 +278,10 @@ gets_drilled(give_exp = FALSE) /turf/closed/mineral/random + /// What are the base odds that this turf spawns a mineral in the wall on initialize? var/mineralChance = 13 + /// Does this mineral determine it's random chance and mineral contents based on proximity to a vent? Overrides mineralChance and mineralAmt. + var/proximity_based = FALSE /// Returns a list of the chances for minerals to spawn. /// Will only run once, and will then be cached. @@ -228,7 +303,10 @@ var/static/list/mineral_chances_by_type = list() . = ..() - if (prob(mineralChance)) + var/dynamic_prob = mineralChance + if(proximity_based) + dynamic_prob = proximity_ore_chance() // We assign the chance of ore spawning based on probability. + if (prob(dynamic_prob)) var/list/spawn_chance_list = mineral_chances_by_type[type] if (isnull(spawn_chance_list)) mineral_chances_by_type[type] = expand_weights(mineral_chances()) @@ -246,7 +324,8 @@ if(ismineralturf(T)) var/turf/closed/mineral/M = T M.turf_type = src.turf_type - M.mineralAmt = rand(1, 5) + M.mineralAmt = scale_ore_to_vent() + SSore_generation.post_ore_random["[M.mineralAmt]"] += 1 src = M M.levelupdate() else @@ -254,12 +333,15 @@ T.levelupdate() else - Change_Ore(path, 1) + Change_Ore(path, FALSE) Spread_Vein(path) + mineralAmt = scale_ore_to_vent() + SSore_generation.post_ore_manual["[mineralAmt]"] += 1 /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 + proximity_based = FALSE /turf/closed/mineral/random/high_chance/mineral_chances() return list( @@ -277,6 +359,7 @@ baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = TRUE + proximity_based = FALSE /turf/closed/mineral/random/high_chance/volcanic/mineral_chances() return list( @@ -327,8 +410,8 @@ baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = TRUE - - mineralChance = 10 + proximity_based = FALSE //SKYRAT EDIT: Original TRUE + mineralChance = 5 /turf/closed/mineral/random/volcanic/mineral_chances() return list( @@ -343,12 +426,6 @@ /turf/closed/mineral/gibtonite/volcanic = 4, ) -/// A turf that can't we can't build openspace chasms on or spawn ruins in. -/turf/closed/mineral/random/volcanic/do_not_chasm - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins - turf_flags = NO_RUINS - /turf/closed/mineral/random/snow name = "snowy mountainside" icon = MAP_SWITCH('icons/turf/walls/mountain_wall.dmi', 'icons/turf/mining.dmi') @@ -361,6 +438,7 @@ baseturfs = /turf/open/misc/asteroid/snow/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS weak_turf = TRUE + proximity_based = FALSE //SKYRAT EDIT: Original TRUE /turf/closed/mineral/random/snow/Change_Ore(ore_type, random = 0) . = ..() @@ -384,7 +462,7 @@ ) /// Near exact same subtype as parent, just used in ruins to prevent other ruins/chasms from spawning on top of it. -/turf/closed/mineral/random/snow/do_not_chasm +/turf/closed/mineral/snowmountain/do_not_chasm turf_type = /turf/open/misc/asteroid/snow/icemoon/do_not_chasm baseturfs = /turf/open/misc/asteroid/snow/icemoon/do_not_chasm turf_flags = NO_RUINS @@ -409,6 +487,7 @@ ) /turf/closed/mineral/random/snow/high_chance + proximity_based = FALSE /turf/closed/mineral/random/snow/high_chance/mineral_chances() return list( @@ -426,13 +505,7 @@ /turf/closed/mineral/random/labormineral/mineral_chances() return list( - /obj/item/stack/ore/diamond = 1, - /obj/item/stack/ore/gold = 8, - /obj/item/stack/ore/iron = 95, - /obj/item/stack/ore/plasma = 30, - /obj/item/stack/ore/silver = 20, - /obj/item/stack/ore/titanium = 8, - /obj/item/stack/ore/uranium = 3, + /obj/item/boulder/gulag = 165, /turf/closed/mineral/gibtonite = 2, ) @@ -444,14 +517,7 @@ /turf/closed/mineral/random/labormineral/volcanic/mineral_chances() return list( - /obj/item/stack/ore/bluespace_crystal = 1, - /obj/item/stack/ore/diamond = 1, - /obj/item/stack/ore/gold = 8, - /obj/item/stack/ore/iron = 95, - /obj/item/stack/ore/plasma = 30, - /obj/item/stack/ore/silver = 20, - /obj/item/stack/ore/titanium = 8, - /obj/item/stack/ore/uranium = 3, + /obj/item/boulder/gulag_expanded = 166, /turf/closed/mineral/gibtonite/volcanic = 2, ) @@ -471,15 +537,8 @@ /turf/closed/mineral/random/labormineral/ice/mineral_chances() return list( - /obj/item/stack/ore/bluespace_crystal = 1, - /obj/item/stack/ore/diamond = 1, - /obj/item/stack/ore/gold = 8, - /obj/item/stack/ore/iron = 95, - /obj/item/stack/ore/plasma = 30, - /obj/item/stack/ore/silver = 20, - /obj/item/stack/ore/titanium = 8, - /obj/item/stack/ore/uranium = 3, - /turf/closed/mineral/gibtonite/volcanic = 2, + /obj/item/boulder/gulag = 168, + /turf/closed/mineral/gibtonite/ice/icemoon = 2, ) /turf/closed/mineral/random/labormineral/ice/Change_Ore(ore_type, random = 0) diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 23e9a2cf775..b42e194ffcf 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -270,11 +270,6 @@ base_icon_state = "shuttle_wall" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/mineral/titanium/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smoothing_flags = NONE - /turf/closed/wall/mineral/titanium/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS @@ -332,11 +327,6 @@ base_icon_state = "plastitanium_wall" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/mineral/plastitanium/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smoothing_flags = NONE - /turf/closed/wall/mineral/plastitanium/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 39e19f45a07..ad6d7b6e82e 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -253,11 +253,6 @@ base_icon_state = "plastitanium_wall" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/r_wall/syndicate/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smoothing_flags = NONE - /turf/closed/wall/r_wall/syndicate/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 2cc6d32bc03..4e79d835271 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -72,7 +72,7 @@ ) RegisterSignals(src, list( COMSIG_MOB_CLIENT_PRE_MOVE, - COMSIG_HUMAN_DISARM_HIT, + COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE, @@ -83,7 +83,7 @@ SIGNAL_HANDLER UnregisterSignal(src, list( COMSIG_MOB_CLIENT_PRE_MOVE, - COMSIG_HUMAN_DISARM_HIT, + COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE, diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index b453fb0c4be..3a3a837968a 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -185,6 +185,10 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins turf_flags = NO_RUINS +/// A turf that can't we can't build openspace chasms on or spawn ruins in. +/turf/closed/mineral/volcanic/lava_land_surface/do_not_chasm + turf_flags = NO_RUINS + /turf/open/misc/asteroid/lowpressure initial_gas_mix = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/misc/asteroid/lowpressure diff --git a/code/game/turfs/open/cliff.dm b/code/game/turfs/open/cliff.dm index 507f3eb7a7a..1417e527e64 100644 --- a/code/game/turfs/open/cliff.dm +++ b/code/game/turfs/open/cliff.dm @@ -82,6 +82,11 @@ // We can walk infront of the bottom cliff turf, so check that here if(!iscliffturf(get_step(src, fall_direction)) && !(get_dir(arrived, src) & fall_direction)) return FALSE + + // gravity + // marked in UNLINT due to a spacemandmm bug: https://github.com/SpaceManiac/SpacemanDMM/issues/382 (REMOVE ONCE FIXED!) + if(UNLINT(!arrived.has_gravity(src))) + return FALSE return TRUE diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 3e58d647023..8634883762f 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -314,7 +314,6 @@ icon = 'icons/hud/radial.dmi' icon_state = "wallfloor" - #undef PLATE_INTACT #undef PLATE_BOLTS_LOOSENED #undef PLATE_CUT diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2bee06e7c49..cf25268db99 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -200,12 +200,12 @@ GLOBAL_LIST_EMPTY(station_turfs) for(var/A in B.contents) qdel(A) return - QDEL_LIST(blueprint_data) + LAZYCLEARLIST(blueprint_data) flags_1 &= ~INITIALIZED_1 requires_activation = FALSE ..() - if (length(vis_contents)) + if(length(vis_contents)) vis_contents.Cut() /// WARNING WARNING @@ -228,9 +228,11 @@ GLOBAL_LIST_EMPTY(station_turfs) return //move the turf - old_area.turfs_to_uncontain += src + LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, z, list()) + LISTASSERTLEN(new_area.turfs_by_zlevel, z, list()) + old_area.turfs_to_uncontain_by_zlevel[z] += src + new_area.turfs_by_zlevel[z] += src new_area.contents += src - new_area.contained_turfs += src //changes to make after turf has moved on_change_area(old_area, new_area) diff --git a/code/game/world.dm b/code/game/world.dm index 43e01895575..47e92316d94 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -381,12 +381,23 @@ GLOBAL_VAR(restart_counter) if(length(features)) new_status += ": [jointext(features, ", ")]" - new_status += "
Time: [gameTimestamp("hh:mm")]" + if(!SSticker || SSticker?.current_state == GAME_STATE_STARTUP) + new_status += "
STARTING" + else if(SSticker) + if(SSticker.current_state == GAME_STATE_PREGAME && SSticker.GetTimeLeft() > 0) + new_status += "
Starting: [round((SSticker.GetTimeLeft())/10)]" + else if(SSticker.current_state == GAME_STATE_SETTING_UP) + new_status += "
Starting: Now" + else if(SSticker.IsRoundInProgress()) + new_status += "
Time: [time2text(STATION_TIME_PASSED(), "hh:mm", 0)]" + if(SSshuttle?.emergency && SSshuttle?.emergency?.mode != (SHUTTLE_IDLE || SHUTTLE_ENDGAME)) + new_status += " | Shuttle: [SSshuttle.emergency.getModeStr()] [SSshuttle.emergency.getTimerStr()]" + else if(SSticker.current_state == GAME_STATE_FINISHED) + new_status += "
RESTARTING" if(SSmapping.config) new_status += "
Map: [SSmapping.config.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmapping.config.map_name]" - var/alert_text = SSsecurity_level.get_current_level_as_text() - if(alert_text) - new_status += "
Alert: [capitalize(alert_text)]" + if(SSmapping.next_map_config) + new_status += "[SSmapping.config ? " | " : "
"]Next: [SSmapping.next_map_config.map_path == CUSTOM_MAP_PATH ? "Uncharted Territory" : SSmapping.next_map_config.map_name]" status = new_status */ @@ -413,10 +424,13 @@ GLOBAL_VAR(restart_counter) if(!map_load_z_cutoff) return var/area/global_area = GLOB.areas_by_type[world.area] // We're guaranteed to be touching the global area, so we'll just do this - var/list/to_add = block( - locate(old_max + 1, 1, 1), - locate(maxx, maxy, map_load_z_cutoff)) - global_area.contained_turfs += to_add + LISTASSERTLEN(global_area.turfs_by_zlevel, map_load_z_cutoff, list()) + for (var/zlevel in 1 to map_load_z_cutoff) + var/list/to_add = block( + locate(old_max + 1, 1, zlevel), + locate(maxx, maxy, zlevel)) + + global_area.turfs_by_zlevel[zlevel] += to_add /world/proc/increase_max_y(new_maxy, map_load_z_cutoff = maxz) if(new_maxy <= maxy) @@ -426,10 +440,12 @@ GLOBAL_VAR(restart_counter) if(!map_load_z_cutoff) return var/area/global_area = GLOB.areas_by_type[world.area] // We're guarenteed to be touching the global area, so we'll just do this - var/list/to_add = block( - locate(1, old_maxy + 1, 1), - locate(maxx, maxy, map_load_z_cutoff)) - global_area.contained_turfs += to_add + LISTASSERTLEN(global_area.turfs_by_zlevel, map_load_z_cutoff, list()) + for (var/zlevel in 1 to map_load_z_cutoff) + var/list/to_add = block( + locate(1, old_maxy + 1, 1), + locate(maxx, maxy, map_load_z_cutoff)) + global_area.turfs_by_zlevel[zlevel] += to_add /world/proc/incrementMaxZ() maxz++ diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 437f7fc90c4..eb56ee540f3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -231,6 +231,7 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/get_dynex_range, /*debug verbs for dynex explosions.*/ /client/proc/jump_to_ruin, /client/proc/load_circuit, + /client/proc/map_export, /client/proc/map_template_load, /client/proc/map_template_upload, /client/proc/modify_goals, @@ -258,7 +259,7 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/validate_puzzgrids, /client/proc/GeneratePipeSpritesheet, /client/proc/view_runtimes, - + /client/proc/stop_weather, /client/proc/reload_interactions, /*SKYRAT EDIT ADDITION*/ /client/proc/test_area_spawner, /*AUTOMAPPER - SKYRAT EDIT ADDITION*/ /client/proc/toggle_liquid_debug, /*SKYRAT EDIT ADDITION*/ diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 4df4e19b709..e98016df74f 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -73,7 +73,6 @@ GLOBAL_PROTECT(href_token) activate() else deactivate() - plane_debug = new(src) /datum/admins/Destroy() if(IsAdminAdvancedProcCall()) @@ -88,7 +87,7 @@ GLOBAL_PROTECT(href_token) GLOB.deadmins -= target GLOB.admin_datums[target] = src deadmined = FALSE - QDEL_NULL(plane_debug) + plane_debug = new(src) if (GLOB.directory[target]) associate(GLOB.directory[target]) //find the client for a ckey if they are connected and associate them with us @@ -99,6 +98,7 @@ GLOBAL_PROTECT(href_token) return GLOB.deadmins[target] = src GLOB.admin_datums -= target + QDEL_NULL(plane_debug) deadmined = TRUE var/client/client = owner || GLOB.directory[target] diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 28de1f0aa02..88ab09de6d3 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -632,13 +632,25 @@ browser.set_content(jointext(output, "")) browser.open() +/// Represents a message stored in the db +/datum/admin_message + /// The uid of this message + var/id + /// The admin who left this message + var/admin_key + /// The text of this message + var/text + /// The time this message was first created + var/timestamp + /// The admin who last edited this message + var/editor_key + /proc/get_message_output(type, target_ckey, show_secret = TRUE, after_timestamp) if(!SSdbcore.Connect()) to_chat(usr, span_danger("Failed to establish database connection."), confidential = TRUE) return if(!type) return - var/output var/list/parameters = list( "targetckey" = target_ckey, "type" = type, @@ -663,29 +675,50 @@ if(!query_get_message_output.warn_execute()) qdel(query_get_message_output) return + var/list/datum/admin_message/messages = list() while(query_get_message_output.NextRow()) - var/message_id = query_get_message_output.item[1] - var/admin_key = query_get_message_output.item[2] - var/text = query_get_message_output.item[3] - var/timestamp = query_get_message_output.item[4] - var/editor_key = query_get_message_output.item[5] - switch(type) - if("message") - output += "Admin message left by [span_prefix("[admin_key]")] on [timestamp]" - output += "
[text] (Click here to verify you have read this message)
" - if("note") - output += "Note left by [span_prefix("[admin_key]")] on [timestamp]" - output += "
[text]
" - if("watchlist entry") - message_admins("Notice: [key_name_admin(target_ckey)] has been on the watchlist since [timestamp] and has just connected - Reason: [text]") - send2tgs_adminless_only("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]") - if("memo") - output += "[span_memo("Memo by [admin_key]")] on [timestamp]" - if(editor_key) - output += "
[span_memoedit("Last edit by [editor_key] (Click here to see edit log)")]" - output += "
[text]

" + var/datum/admin_message/message = new() + message.id = query_get_message_output.item[1] + message.admin_key = query_get_message_output.item[2] + message.text = query_get_message_output.item[3] + message.timestamp = query_get_message_output.item[4] + message.editor_key = query_get_message_output.item[5] + messages += message qdel(query_get_message_output) - return output + if(!length(messages)) + return + return messages + +/proc/display_admin_messages(client/display_to) + var/list/text = list() + for(var/datum/admin_message/message in get_message_output("message", display_to.ckey)) + text += "Admin message left by [span_prefix("[message.admin_key]")] on [message.timestamp]" + text += "
[message.text] (Click here to verify you have read this message)
" + if(length(text)) + to_chat(display_to, text.Join()) + +/proc/display_unread_notes(client/display_to, show_after) + var/list/text = list() + for(var/datum/admin_message/message in get_message_output("note", display_to.ckey, FALSE, show_after)) + text += "Note left by [span_prefix("[message.admin_key]")] on [message.timestamp]" + text += "
[message.text]
" + if(length(text)) + to_chat(display_to, text.Join()) + +/proc/display_admin_memos(client/display_to) + var/list/text = list() + for(var/datum/admin_message/message in get_message_output("memo", display_to.ckey)) + text += "[span_memo("Memo by [message.admin_key]")] on [message.timestamp]" + if(message.editor_key) + text += "
[span_memoedit("Last edit by [message.editor_key] (Click here to see edit log)")]" + text += "
[message.text]

" + if(length(text)) + to_chat(display_to, text.Join()) + +/proc/scream_about_watchlists(client/read_from) + for(var/datum/admin_message/message in get_message_output("watchlist entry", read_from.ckey)) + message_admins("Notice: [key_name_admin(read_from.ckey)] has been on the watchlist since [message.timestamp] and has just connected - Reason: [message.text]") + send2tgs_adminless_only("Watchlist", "[key_name(read_from.ckey)] is on the watchlist and has just connected - Reason: [message.text]") #define NOTESFILE "data/player_notes.sav" //if the AUTOCONVERT_NOTES is turned on, anytime a player connects this will be run to try and add all their notes to the databas diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2f29fe9bde2..9ad68801835 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -396,19 +396,6 @@ var/target = href_list["showmessageckeylinkless"] browse_messages(target_ckey = target, linkless = 1) - else if(href_list["messageread"]) - if(!isnum(href_list["message_id"])) - return - var/rounded_message_id = round(href_list["message_id"], 1) - var/datum/db_query/query_message_read = SSdbcore.NewQuery( - "UPDATE [format_table_name("messages")] SET type = 'message sent' WHERE targetckey = :player_key AND id = :id", - list("id" = rounded_message_id, "player_key" = usr.ckey) - ) - if(!query_message_read.warn_execute()) - qdel(query_message_read) - return - qdel(query_message_read) - else if(href_list["messageedits"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/admin.dm b/code/modules/admin/verbs/admin.dm index f2c3b402243..d78014e84d2 100644 --- a/code/modules/admin/verbs/admin.dm +++ b/code/modules/admin/verbs/admin.dm @@ -37,7 +37,7 @@ if(message) if(!check_rights(R_SERVER,0)) message = adminscrub(message,500) - send_formatted_announcement(message, "From [usr.client.holder.fakekey ? "Administrator" : usr.key]") + send_ooc_announcement(message, "From [usr.client.holder.fakekey ? "Administrator" : usr.key]") log_admin("Announce: [key_name(usr)] : [message]") BLACKBOX_LOG_ADMIN_VERB("Announce") diff --git a/code/modules/admin/verbs/admin_newscaster.dm b/code/modules/admin/verbs/admin_newscaster.dm index 0a25ebaca65..2f6870394c2 100644 --- a/code/modules/admin/verbs/admin_newscaster.dm +++ b/code/modules/admin/verbs/admin_newscaster.dm @@ -78,14 +78,15 @@ data["crime_description"] = crime_description var/list/wanted_info = list() if(GLOB.news_network.wanted_issue) - if(GLOB.news_network.wanted_issue.img) + var/has_wanted_issue = !isnull(GLOB.news_network.wanted_issue.img) + if(has_wanted_issue) user << browse_rsc(GLOB.news_network.wanted_issue.img, "wanted_photo.png") wanted_info = list(list( "active" = GLOB.news_network.wanted_issue.active, "criminal" = GLOB.news_network.wanted_issue.criminal, "crime" = GLOB.news_network.wanted_issue.body, "author" = GLOB.news_network.wanted_issue.scanned_user, - "image" = "wanted_photo.png" + "image" = (has_wanted_issue ? "wanted_photo.png" : null) )) //Code breaking down the channels that have been made on-station thus far. ha @@ -320,6 +321,7 @@ new_feed_comment.body = comment_text new_feed_comment.time_stamp = station_time_timestamp() current_message.comments += new_feed_comment + GLOB.news_network.last_action ++ usr.log_message("(as an admin) commented on message [current_message.return_body(-1)] -- [current_message.body]", LOG_COMMENT) creating_comment = FALSE diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 2f058818a46..dfcc5f60dd0 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -10,10 +10,10 @@ return var/list/turfs = list() - for(var/turf/T in A) - if(T.density) - continue - turfs.Add(T) + for (var/list/zlevel_turfs as anything in A.get_zlevel_turf_lists()) + for (var/turf/area_turf as anything in zlevel_turfs) + if(!area_turf.density) + turfs.Add(area_turf) if(length(turfs)) var/turf/T = pick(turfs) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 7d6ab6e2548..260bfb16bf3 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -217,6 +217,8 @@ if(tgui_alert(usr,"This mob is being controlled by [M.key]. Are you sure you wish to give someone else control of it? [M.key] will be made a ghost.",,list("Yes","No")) != "Yes") return var/client/newkey = input(src, "Pick the player to put in control.", "New player") as null|anything in sort_list(GLOB.clients) + if(isnull(newkey)) + return var/mob/oldmob = newkey.mob var/delmob = FALSE if((isobserver(oldmob) || tgui_alert(usr,"Do you want to delete [newkey]'s old mob?","Delete?",list("Yes","No")) != "No")) diff --git a/code/modules/admin/verbs/map_export.dm b/code/modules/admin/verbs/map_export.dm new file mode 100644 index 00000000000..8ff2568e79a --- /dev/null +++ b/code/modules/admin/verbs/map_export.dm @@ -0,0 +1,306 @@ +/client/proc/map_export() + set category = "Debug" + set name = "Map Export" + set desc = "Select a part of the map by coordinates and download it." + + var/z_level = tgui_input_number(usr, "Export Which Z-Level?", "Map Exporter", usr.z || 2) + var/start_x = tgui_input_number(usr, "Start X?", "Map Exporter", usr.x || 1, world.maxx, 1) + var/start_y = tgui_input_number(usr, "Start Y?", "Map Exporter", usr.y || 1, world.maxy, 1) + var/end_x = tgui_input_number(usr, "End X?", "Map Exporter", usr.x || 1, world.maxx, 1) + var/end_y = tgui_input_number(usr, "End Y?", "Map Exporter", usr.y || 1, world.maxy, 1) + var/date = time2text(world.timeofday, "YYYY-MM-DD_hh-mm-ss") + var/file_name = sanitize_filename(tgui_input_text(usr, "Filename?", "Map Exporter", "exported_map_[date]")) + var/confirm = tgui_alert(usr, "Are you sure you want to do this? This will cause extreme lag!", "Map Exporter", list("Yes", "No")) + + if(confirm != "Yes" || !check_rights(R_DEBUG)) + return + + var/map_text = write_map(start_x, start_y, z_level, end_x, end_y, z_level) + log_admin("Build Mode: [key_name(usr)] is exporting the map area from ([start_x], [start_y], [z_level]) through ([end_x], [end_y], [z_level])") + send_exported_map(usr, file_name, map_text) + +/** + * A procedure for saving DMM text to a file and then sending it to the user. + * Arguments: + * * user - a user which get map + * * name - name of file + .dmm + * * map - text with DMM format + */ +/proc/send_exported_map(user, name, map) + var/file_path = "data/[name].dmm" + rustg_file_write(map, file_path) + DIRECT_OUTPUT(user, ftp(file_path, "[name].dmm")) + var/file_to_delete = file(file_path) + fdel(file_to_delete) + +/proc/sanitize_filename(text) + return hashtag_newlines_and_tabs(text, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"="")) + +/proc/hashtag_newlines_and_tabs(text, list/repl_chars = list("\n"="#","\t"="#")) + for(var/char in repl_chars) + var/index = findtext(text, char) + while(index) + text = copytext(text, 1, index) + repl_chars[char] + copytext(text, index + length(char)) + index = findtext(text, char, index + length(char)) + return text + +/** + * A procedure for saving non-standard properties of an object. + * For example, saving ore into a silo, and further spavn by coordinates of metal stacks objects + */ +/obj/proc/on_object_saved() + return null + +// Save resources in silo +/obj/machinery/ore_silo/on_object_saved() + var/data + var/datum/component/material_container/material_holder = GetComponent(/datum/component/material_container) + for(var/each in material_holder.materials) + var/amount = material_holder.materials[each] / 100 + var/datum/material/material_datum = each + while(amount > 0) + var/amount_in_stack = max(1, min(50, amount)) + amount -= amount_in_stack + data += "[data ? ",\n" : ""][material_datum.sheet_type]{\n\tamount = [amount_in_stack]\n\t}" + return data + +/**Map exporter +* Inputting a list of turfs into convert_map_to_tgm() will output a string +* with the turfs and their objects / areas on said turf into the TGM mapping format +* for .dmm files. This file can then be opened in the map editor or imported +* back into the game. +* ============================ +* This has been made semi-modular so you should be able to use these functions +* elsewhere in code if you ever need to get a file in the .dmm format +**/ + +/atom/proc/get_save_vars() + return list( + NAMEOF(src, color), + NAMEOF(src, dir), + NAMEOF(src, icon), + NAMEOF(src, icon_state), + NAMEOF(src, name), + NAMEOF(src, pixel_x), + NAMEOF(src, pixel_y), + ) + +/obj/get_save_vars() + return ..() + NAMEOF(src, req_access) + +/obj/item/stack/get_save_vars() + return ..() + NAMEOF(src, amount) + +/obj/docking_port/get_save_vars() + return ..() + list( + NAMEOF(src, dheight), + NAMEOF(src, dwidth), + NAMEOF(src, height), + NAMEOF(src, shuttle_id), + NAMEOF(src, width), + ) +/obj/docking_port/stationary/get_save_vars() + return ..() + NAMEOF(src, roundstart_template) + +/obj/machinery/atmospherics/get_save_vars() + return ..() + list( + NAMEOF(src, piping_layer), + NAMEOF(src, pipe_color), + ) + +/obj/item/pipe/get_save_vars() + return ..() + list( + NAMEOF(src, piping_layer), + NAMEOF(src, pipe_color), + ) + +GLOBAL_LIST_INIT(save_file_chars, list( + "a","b","c","d","e", + "f","g","h","i","j", + "k","l","m","n","o", + "p","q","r","s","t", + "u","v","w","x","y", + "z","A","B","C","D", + "E","F","G","H","I", + "J","K","L","M","N", + "O","P","Q","R","S", + "T","U","V","W","X", + "Y","Z", +)) + +/proc/to_list_string(list/build_from) + var/list/build_into = list() + build_into += "list(" + var/first_entry = TRUE + for(var/item in build_from) + CHECK_TICK + if(!first_entry) + build_into += ", " + if(isnum(item) || !build_from[item]) + build_into += "[tgm_encode(item)]" + else + build_into += "[tgm_encode(item)] = [tgm_encode(build_from[item])]" + first_entry = FALSE + build_into += ")" + return build_into.Join("") + +/// Takes a constant, encodes it into a TGM valid string +/proc/tgm_encode(value) + if(istext(value)) + //Prevent symbols from being because otherwise you can name something + // [";},/obj/item/gun/energy/laser/instakill{name="da epic gun] and spawn yourself an instakill gun. + return "\"[hashtag_newlines_and_tabs("[value]", list("{"="", "}"="", "\""="", ";"="", ","=""))]\"" + if(isnum(value) || ispath(value)) + return "[value]" + if(islist(value)) + return to_list_string(value) + if(isnull(value)) + return "null" + if(isicon(value) || isfile(value)) + return "'[value]'" + // not handled: + // - pops: /obj{name="foo"} + // - new(), newlist(), icon(), matrix(), sound() + + // fallback: string + return tgm_encode("[value]") + +/** + *Procedure for converting a coordinate-selected part of the map into text for the .dmi format + */ +/proc/write_map( + minx, + miny, + minz, + maxx, + maxy, + maxz, + save_flag = ALL, + shuttle_area_flag = SAVE_SHUTTLEAREA_DONTCARE, + list/obj_blacklist = list(), +) + var/width = maxx - minx + var/height = maxy - miny + var/depth = maxz - minz + + //Step 0: Calculate the amount of letters we need (26 ^ n > turf count) + var/turfs_needed = width * height + var/layers = FLOOR(log(GLOB.save_file_chars.len, turfs_needed) + 0.999,1) + + //Step 1: Run through the area and generate file data + var/list/header_data = list() //holds the data of a header -> to its key + var/list/header = list() //The actual header in text + var/list/contents = list() //The contents in text (bit at the end) + var/key_index = 1 // How many keys we've generated so far + for(var/z in 0 to depth) + for(var/x in 0 to width) + contents += "\n([x + 1],1,[z + 1]) = {\"\n" + for(var/y in height to 0 step -1) + CHECK_TICK + //====Get turfs Data==== + var/turf/place + var/area/location + var/turf/pull_from = locate((minx + x), (miny + y), (minz + z)) + //If there is nothing there, save as a noop (For odd shapes) + if(isnull(pull_from)) + place = /turf/template_noop + location = /area/template_noop + //Ignore things in space, must be a space turf + else if(istype(pull_from, /turf/open/space) && !(save_flag & SAVE_SPACE)) + place = /turf/template_noop + location = /area/template_noop + pull_from = null + //Stuff to add + else + var/area/place_area = get_area(pull_from) + location = place_area.type + place = pull_from.type + + //====Saving shuttles only / non shuttles only==== + var/is_shuttle_area = ispath(location, /area/shuttle) + if((is_shuttle_area && shuttle_area_flag == SAVE_SHUTTLEAREA_IGNORE) || (!is_shuttle_area && shuttle_area_flag == SAVE_SHUTTLEAREA_ONLY)) + place = /turf/template_noop + location = /area/template_noop + pull_from = null + //====For toggling not saving areas and turfs==== + if(!(save_flag & SAVE_AREAS)) + location = /area/template_noop + if(!(save_flag & SAVE_TURFS)) + place = /turf/template_noop + //====Generate Header Character==== + // Info that describes this turf and all its contents + // Unique, will be checked for existing later + var/list/current_header = list() + current_header += "(\n" + //Add objects to the header file + var/empty = TRUE + //====SAVING OBJECTS==== + if(save_flag & SAVE_OBJECTS) + for(var/obj/thing in pull_from) + CHECK_TICK + if(obj_blacklist[thing.type]) + continue + var/metadata = generate_tgm_metadata(thing) + current_header += "[empty ? "" : ",\n"][thing.type][metadata]" + empty = FALSE + //====SAVING SPECIAL DATA==== + //This is what causes lockers and machines to save stuff inside of them + if(save_flag & SAVE_OBJECT_PROPERTIES) + var/custom_data = thing.on_object_saved() + current_header += "[custom_data ? ",\n[custom_data]" : ""]" + //====SAVING MOBS==== + if(save_flag & SAVE_MOBS) + for(var/mob/living/thing in pull_from) + CHECK_TICK + if(istype(thing, /mob/living/carbon)) //Ignore people, but not animals + continue + var/metadata = generate_tgm_metadata(thing) + current_header += "[empty ? "" : ",\n"][thing.type][metadata]" + empty = FALSE + current_header += "[empty ? "" : ",\n"][place],\n[location])\n" + //====Fill the contents file==== + var/textiftied_header = current_header.Join() + // If we already know this header just use its key, otherwise we gotta make a new one + var/key = header_data[textiftied_header] + if(!key) + key = calculate_tgm_header_index(key_index, layers) + key_index++ + header += "\"[key]\" = [textiftied_header]" + header_data[textiftied_header] = key + contents += "[key]\n" + contents += "\"}" + return "//[DMM2TGM_MESSAGE]\n[header.Join()][contents.Join()]" + +/proc/generate_tgm_metadata(atom/object) + var/list/data_to_add = list() + + var/list/vars_to_save = object.get_save_vars() + for(var/variable in vars_to_save) + CHECK_TICK + var/value = object.vars[variable] + if(value == initial(object.vars[variable]) || !issaved(object.vars[variable])) + continue + if(variable == "icon_state" && object.smoothing_flags) + continue + + var/text_value = tgm_encode(value) + if(!text_value) + continue + data_to_add += "[variable] = [text_value]" + + if(!length(data_to_add)) + return + return "{\n\t[data_to_add.Join(";\n\t")]\n\t}" + +// Could be inlined, not a massive cost tho so it's fine +/// Generates a key matching our index +/proc/calculate_tgm_header_index(index, key_length) + var/list/output = list() + // We want to stick the first one last, so we walk backwards + var/list/pull_from = GLOB.save_file_chars + var/length = length(pull_from) + for(var/i in key_length to 1 step -1) + var/calculated = FLOOR((index-1) / (length ** (i - 1)), 1) + calculated = (calculated % length) + 1 + output += pull_from[calculated] + return output.Join() diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index 645467bf0fe..b9fd0e6d2ad 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -1,36 +1,29 @@ #ifdef REFERENCE_TRACKING +#define REFSEARCH_RECURSE_LIMIT 64 -/datum/proc/find_references(skip_alert) - running_find_references = type +/datum/proc/find_references(references_to_clear = INFINITY) if(usr?.client) - if(usr.client.running_find_references) - log_reftracker("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - running_find_references = null - //restart the garbage collector - SSgarbage.can_fire = TRUE - SSgarbage.update_nextfire(reset_time = TRUE) - return - - if(!skip_alert && tgui_alert(usr,"Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", list("Yes", "No")) != "Yes") - running_find_references = null + if(tgui_alert(usr,"Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", list("Yes", "No")) != "Yes") return + src.references_to_clear = references_to_clear //this keeps the garbage collector from failing to collect objects being searched for in here SSgarbage.can_fire = FALSE - if(usr?.client) - usr.client.running_find_references = type + _search_references() + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.update_nextfire(reset_time = TRUE) - log_reftracker("Beginning search for references to a [type].") +/datum/proc/_search_references() + log_reftracker("Beginning search for references to a [type], looking for [references_to_clear] refs.") var/starting_time = world.time - - log_reftracker("Refcount for [type]: [refcount(src)]") - //Time to search the whole game for our ref - DoSearchVar(GLOB, "GLOB", search_time = starting_time) //globals + DoSearchVar(GLOB, "GLOB", starting_time) //globals log_reftracker("Finished searching globals") + if(src.references_to_clear == 0) + return //Yes we do actually need to do this. The searcher refuses to read weird lists //And global.vars is a really weird list @@ -38,45 +31,46 @@ for(var/key in global.vars) global_vars[key] = global.vars[key] - DoSearchVar(global_vars, "Native Global", search_time = starting_time) + DoSearchVar(global_vars, "Native Global", starting_time) log_reftracker("Finished searching native globals") + if(src.references_to_clear == 0) + return for(var/datum/thing in world) //atoms (don't beleive its lies) - DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) + DoSearchVar(thing, "World -> [thing.type]", starting_time) + if(src.references_to_clear == 0) + break log_reftracker("Finished searching atoms") + if(src.references_to_clear == 0) + return for(var/datum/thing) //datums - DoSearchVar(thing, "Datums -> [thing.type]", search_time = starting_time) + DoSearchVar(thing, "Datums -> [thing.type]", starting_time) + if(src.references_to_clear == 0) + break log_reftracker("Finished searching datums") + if(src.references_to_clear == 0) + return //Warning, attempting to search clients like this will cause crashes if done on live. Watch yourself #ifndef REFERENCE_DOING_IT_LIVE for(var/client/thing) //clients - DoSearchVar(thing, "Clients -> [thing.type]", search_time = starting_time) + DoSearchVar(thing, "Clients -> [thing.type]", starting_time) + if(src.references_to_clear == 0) + break log_reftracker("Finished searching clients") + if(src.references_to_clear == 0) + return #endif log_reftracker("Completed search for references to a [type].") - if(usr?.client) - usr.client.running_find_references = null - running_find_references = null - - //restart the garbage collector - SSgarbage.can_fire = TRUE - SSgarbage.update_nextfire(reset_time = TRUE) - -/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64, search_time = world.time) - #ifdef REFERENCE_TRACKING_DEBUG - if(SSgarbage.should_save_refs && !found_refs) - found_refs = list() - #endif - - if(usr?.client && !usr.client.running_find_references) +/datum/proc/DoSearchVar(potential_container, container_name, search_time, recursion_count, is_special_list) + if(recursion_count >= REFSEARCH_RECURSE_LIMIT) + log_reftracker("Recursion limit reached. [container_name]") return - if(!recursive_limit) - log_reftracker("Recursion limit reached. [container_name]") + if(references_to_clear == 0) return //Check each time you go down a layer. This makes it a bit slow, but it won't effect the rest of the game at all @@ -90,73 +84,116 @@ return datum_container.last_find_references = search_time - var/container_print = datum_container.ref_search_details() var/list/vars_list = datum_container.vars + var/is_atom = FALSE + var/is_area = FALSE + if(isatom(datum_container)) + is_atom = TRUE + if(isarea(datum_container)) + is_area = TRUE for(var/varname in vars_list) - #ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK - #endif - if (varname == "vars" || varname == "vis_locs") //Fun fact, vis_locs don't count for references - continue var/variable = vars_list[varname] - - if(variable == src) + if(islist(variable)) + //Fun fact, vis_locs don't count for references + if(varname == "vars" || (is_atom && (varname == "vis_locs" || varname == "overlays" || varname == "underlays" || varname == "filters" || varname == "verbs" || (is_area && varname == "contents")))) + continue + // We do this after the varname check to avoid area contents (reading it incures a world loop's worth of cost) + if(!length(variable)) + continue + DoSearchVar(variable,\ + "[container_name] [datum_container.ref_search_details()] -> [varname] (list)",\ + search_time,\ + recursion_count + 1,\ + /*is_special_list = */ is_atom && (varname == "contents" || varname == "vis_contents" || varname == "locs")) + else if(variable == src) #ifdef REFERENCE_TRACKING_DEBUG if(SSgarbage.should_save_refs) + if(!found_refs) + found_refs = list() found_refs[varname] = TRUE continue //End early, don't want these logging + else + log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [datum_container.ref_search_details()] [varname] var. [container_name]") + #else + log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [datum_container.ref_search_details()] [varname] var. [container_name]") #endif - log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [container_print] [varname] var. [container_name]") + references_to_clear -= 1 + if(references_to_clear == 0) + log_reftracker("All references to [type] [text_ref(src)] found, exiting.") + return continue - if(islist(variable)) - DoSearchVar(variable, "[container_name] [container_print] -> [varname] (list)", recursive_limit - 1, search_time) - else if(islist(potential_container)) - var/normal = IS_NORMAL_LIST(potential_container) var/list/potential_cache = potential_container for(var/element_in_list in potential_cache) - #ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK - #endif - //Check normal entrys - if(element_in_list == src) - #ifdef REFERENCE_TRACKING_DEBUG - if(SSgarbage.should_save_refs) - found_refs[potential_cache] = TRUE - continue //End early, don't want these logging - #endif - log_reftracker("Found [type] [text_ref(src)] in list [container_name].") - continue - - var/assoc_val = null - if(!isnum(element_in_list) && normal) - assoc_val = potential_cache[element_in_list] - //Check assoc entrys - if(assoc_val == src) - #ifdef REFERENCE_TRACKING_DEBUG - if(SSgarbage.should_save_refs) - found_refs[potential_cache] = TRUE - continue //End early, don't want these logging - #endif - log_reftracker("Found [type] [text_ref(src)] in list [container_name]\[[element_in_list]\]") - continue - //We need to run both of these checks, since our object could be hiding in either of them //Check normal sublists if(islist(element_in_list)) - DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", recursive_limit - 1, search_time) - //Check assoc sublists - if(islist(assoc_val)) - DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", recursive_limit - 1, search_time) + if(length(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", search_time, recursion_count + 1) + //Check normal entrys + else if(element_in_list == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + if(!found_refs) + found_refs = list() + found_refs[potential_cache] = TRUE + continue + else + log_reftracker("Found [type] [text_ref(src)] in list [container_name].") + #else + log_reftracker("Found [type] [text_ref(src)] in list [container_name].") + #endif -/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) - thing_to_del.qdel_and_find_ref_if_fail(force) + // This is dumb as hell I'm sorry + // I don't want the garbage subsystem to count as a ref for the purposes of this number + // If we find all other refs before it I want to early exit, and if we don't I want to keep searching past it + var/ignore_ref = FALSE + var/list/queues = SSgarbage.queues + for(var/list/queue in queues) + if(potential_cache in queue) + ignore_ref = TRUE + break + if(ignore_ref) + log_reftracker("[container_name] does not count as a ref for our count") + else + references_to_clear -= 1 + if(references_to_clear == 0) + log_reftracker("All references to [type] [text_ref(src)] found, exiting.") + return -/datum/proc/qdel_and_find_ref_if_fail(force = FALSE) - SSgarbage.reference_find_on_fail[text_ref(src)] = TRUE - qdel(src, force) + if(!isnum(element_in_list) && !is_special_list) + // This exists to catch an error that throws when we access a special list + // is_special_list is a hint, it can be wrong + try + var/assoc_val = potential_cache[element_in_list] + //Check assoc sublists + if(islist(assoc_val)) + if(length(assoc_val)) + DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", search_time, recursion_count + 1) + //Check assoc entry + else if(assoc_val == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + if(!found_refs) + found_refs = list() + found_refs[potential_cache] = TRUE + continue + else + log_reftracker("Found [type] [text_ref(src)] in list [container_name]\[[element_in_list]\]") + #else + log_reftracker("Found [type] [text_ref(src)] in list [container_name]\[[element_in_list]\]") + #endif + references_to_clear -= 1 + if(references_to_clear == 0) + log_reftracker("All references to [type] [text_ref(src)] found, exiting.") + return + catch + // So if it goes wrong we kill it + is_special_list = TRUE + log_reftracker("Curiosity: [container_name] lead to an error when acessing [element_in_list], what is it?") +#undef REFSEARCH_RECURSE_LIMIT #endif // Kept outside the ifdef so overrides are easy to implement diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 6ff809b59cb..9ef40a9cebf 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -332,7 +332,15 @@ return to_chat(user, span_notice("You activate [src] and wait for confirmation.")) - var/list/baddie_candidates = SSpolling.poll_ghost_candidates("Do you want to play as a [role_to_play]?", check_jobban = poll_role_check, role = poll_role_check, poll_time = 10 SECONDS, ignore_category = poll_ignore_category, pic_source = src, role_name_text = role_to_play) + var/list/baddie_candidates = SSpolling.poll_ghost_candidates( + "Do you want to play as a [role_to_play]?", + check_jobban = poll_role_check, + role = poll_role_check, + poll_time = 10 SECONDS, + ignore_category = poll_ignore_category, + pic_source = src, + role_name_text = role_to_play, + ) if(!LAZYLEN(baddie_candidates)) to_chat(user, span_warning(fail_text)) return @@ -359,7 +367,7 @@ else spawned_mob.forceMove(locate(1,1,1)) - antag_datum = new() + op_mind.add_antag_datum(antag_datum) if(ishuman(spawned_mob)) var/mob/living/carbon/human/human_mob = spawned_mob @@ -373,6 +381,21 @@ spawned_mob.forceMove(pod) new /obj/effect/pod_landingzone(get_turf(src), pod) +/obj/item/antag_spawner/loadout/contractor + name = "contractor support beacon" + desc = "A beacon sold to the most prestigeous syndicate members, a single-use radio for calling immediate backup." + icon = 'icons/obj/devices/voice.dmi' + icon_state = "nukietalkie" + outfit = /datum/outfit/contractor_partner + use_subtypes = FALSE + antag_datum = /datum/antagonist/traitor/contractor_support + poll_ignore_category = ROLE_TRAITOR + role_to_play = ROLE_CONTRACTOR_SUPPORT + +/obj/item/antag_spawner/loadout/contractor/do_special_things(mob/living/carbon/human/contractor_support, mob/user) + to_chat(contractor_support, "\n[span_alertwarning("[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.")]") + to_chat(contractor_support, "[span_alertwarning("Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.")]") + /obj/item/antag_spawner/loadout/monkey_man name = "monkey agent beacon" desc = "Call up some backup from ARC for monkey mayhem." diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index 6f01eb67aa7..27d177dde68 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -145,7 +145,9 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ /datum/blobstrain/proc/attack_living(mob/living/L, list/nearby_blobs) // When the blob attacks people send_message(L) -/datum/blobstrain/proc/blobbernaut_attack(mob/living/L, blobbernaut) // When this blob's blobbernaut attacks people +/// When this blob's blobbernaut attacks any atom +/datum/blobstrain/proc/blobbernaut_attack(atom/attacking, mob/living/basic/blobbernaut) + return /datum/blobstrain/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag, coefficient = 1) //when the blob takes damage, do this return coefficient*damage diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 05bc73f95c8..9d95d1be8eb 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -11,9 +11,13 @@ reagent.expose_mob(L, VAPOR, BLOB_REAGENTATK_VOL, TRUE, mob_protection, overmind) send_message(L) -/datum/blobstrain/reagent/blobbernaut_attack(mob/living/L) - var/mob_protection = L.getarmor(null, BIO) * 0.01 - reagent.expose_mob(L, VAPOR, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, FALSE, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. +/datum/blobstrain/reagent/blobbernaut_attack(atom/attacking, mob/living/basic/blobbernaut) + if(!isliving(attacking)) + return + + var/mob/living/living_attacking = attacking + var/mob_protection = living_attacking.getarmor(null, BIO) * 0.01 + reagent.expose_mob(living_attacking, VAPOR, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, FALSE, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. /datum/blobstrain/reagent/on_sporedeath(mob/living/basic/spore) var/burst_range = (spore.type == /mob/living/basic/blob_minion/spore) ? 1 : 0 diff --git a/code/modules/antagonists/blob/blobstrains/debris_devourer.dm b/code/modules/antagonists/blob/blobstrains/debris_devourer.dm index 12c75199349..352d7c230a4 100644 --- a/code/modules/antagonists/blob/blobstrains/debris_devourer.dm +++ b/code/modules/antagonists/blob/blobstrains/debris_devourer.dm @@ -29,16 +29,16 @@ for (var/obj/item/I in T) I.forceMove(overmind.blob_core) -/datum/blobstrain/debris_devourer/proc/debris_attack(mob/living/L, source) +/datum/blobstrain/debris_devourer/proc/debris_attack(atom/attacking, atom/source) var/obj/structure/blob/special/core/core = overmind.blob_core if (prob(40 * DEBRIS_DENSITY)) // Pretend the items are spread through the blob and its mobs and not in the core. - var/obj/item/I = pick(core.contents) - if (I && !QDELETED(I)) + var/obj/item/I = length(core.contents) ? pick(core.contents) : null + if (!QDELETED(I)) I.forceMove(get_turf(source)) - I.throw_at(L, 6, 5, overmind, TRUE, FALSE, null, 3) + I.throw_at(attacking, 6, 5, overmind, TRUE, FALSE, null, 3) -/datum/blobstrain/debris_devourer/blobbernaut_attack(mob/living/L, mob/living/blobbernaut) // When this blob's blobbernaut attacks people - debris_attack(L,blobbernaut) +/datum/blobstrain/debris_devourer/blobbernaut_attack(atom/attacking, mob/living/basic/blobbernaut) + debris_attack(attacking, blobbernaut) /datum/blobstrain/debris_devourer/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag, coefficient = 1) //when the blob takes damage, do this var/obj/structure/blob/special/core/core = overmind.blob_core diff --git a/code/modules/antagonists/changeling/headslug_eggs.dm b/code/modules/antagonists/changeling/headslug_eggs.dm index e4327aa3ed1..8f861aec2ec 100644 --- a/code/modules/antagonists/changeling/headslug_eggs.dm +++ b/code/modules/antagonists/changeling/headslug_eggs.dm @@ -6,13 +6,21 @@ desc = "Twitching and disgusting." /// The mind of the original changeling that gave forth to the headslug mob. var/datum/mind/origin - /// Tracks how long the egg has been growing. - var/time = 0 + /// When we're expected to hatch. + var/hatch_time = 0 + /// When this egg last got removed from a body. If -1, the egg hasn't been removed from a body. + var/removal_time = -1 + +/obj/item/organ/internal/body_egg/changeling_egg/Insert(mob/living/carbon/egg_owner, special = FALSE, movement_flags = DELETE_IF_REPLACED) + . = ..() + hatch_time = world.time + (removal_time == -1 ? EGG_INCUBATION_TIME : (hatch_time - removal_time)) + +/obj/item/organ/internal/body_egg/changeling_egg/Remove(mob/living/carbon/egg_owner, special, movement_flags) + . = ..() + removal_time = world.time /obj/item/organ/internal/body_egg/changeling_egg/egg_process(seconds_per_tick, times_fired) - // Changeling eggs grow in dead people - time += seconds_per_tick * 10 - if(time >= EGG_INCUBATION_TIME) + if(owner && hatch_time <= world.time) pop() /// Once the egg is fully grown, we gib the host and spawn a monkey (with the changeling's player controlling it). Very descriptive proc name. diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 27a87bee6c2..5fd8b5d9ee4 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -749,15 +749,15 @@ to_chat(user,span_warning("[human_bloodbag.p_Theyre()] missing too much blood - you cannot drain [human_bloodbag.p_them()] further!")) return if(isconstruct(target)) - var/mob/living/simple_animal/construct_thing = target + var/mob/living/basic/construct/construct_thing = target var/missing_health = construct_thing.maxHealth - construct_thing.health if(missing_health) if(uses > missing_health) - construct_thing.adjustHealth(-missing_health) + construct_thing.adjust_health(-missing_health) construct_thing.visible_message(span_warning("[construct_thing] is fully healed by [user]'s blood magic!")) uses -= missing_health else - construct_thing.adjustHealth(-uses) + construct_thing.adjust_health(-uses) construct_thing.visible_message(span_warning("[construct_thing] is partially healed by [user]'s blood magic!")) uses = 0 playsound(get_turf(construct_thing), 'sound/magic/staff_healing.ogg', 25) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 9cd24f8e707..e38c762d700 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -200,7 +200,8 @@ owner.current.update_mob_action_buttons() for(var/datum/mind/cult_mind as anything in cult_team.members) - vote_ability.Remove(cult_mind.current) + var/datum/antagonist/cult/cult_datum = cult_mind.has_antag_datum(/datum/antagonist/cult) + cult_datum.vote_ability.Remove(cult_mind.current) to_chat(cult_mind.current, span_cultlarge("[owner.current] has won the cult's support and is now their master. \ Follow [owner.current.p_their()] orders to the best of your ability!")) @@ -234,7 +235,8 @@ throwing.Remove(owner.current) owner.current.update_mob_action_buttons() for(var/datum/mind/cult_mind as anything in cult_team.members) - vote_ability.Grant(cult_mind.current) + var/datum/antagonist/cult/cult_datum = cult_mind.has_antag_datum(/datum/antagonist/cult) + cult_datum.vote_ability.Grant(cult_mind.current) to_chat(owner.current, span_cultlarge("You have been demoted from being the cult's Master, you are now an acolyte once more!")) diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 00bdc960644..bee8eec306f 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -99,60 +99,100 @@ /datum/action/innate/cult/mastervote/IsAvailable(feedback = FALSE) if(!owner || !owner.mind) return FALSE - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!C || C.cult_team.cult_vote_called || !ishuman(owner)) + var/datum/antagonist/cult/mind_cult_datum = owner.mind.has_antag_datum(/datum/antagonist/cult) + if(!mind_cult_datum || mind_cult_datum.cult_team.cult_leader_datum || mind_cult_datum.cult_team.cult_vote_called || !ishuman(owner)) return FALSE return ..() /datum/action/innate/cult/mastervote/Activate() var/choice = tgui_alert(owner, "The mantle of leadership is heavy. Success in this role requires an expert level of communication and experience. Are you sure?",, list("Yes", "No")) if(choice == "Yes" && IsAvailable()) - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - pollCultists(owner,C.cult_team) + var/datum/antagonist/cult/mind_cult_datum = owner.mind.has_antag_datum(/datum/antagonist/cult) + start_poll_cultists_for_leader(owner, mind_cult_datum.cult_team) -/proc/pollCultists(mob/living/Nominee, datum/team/cult/team) //Cult Master Poll +///Start the poll for Cult Leaeder. +/proc/start_poll_cultists_for_leader(mob/living/nominee, datum/team/cult/team) if(world.time < CULT_POLL_WAIT) - to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") + to_chat(nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return - team.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try - for(var/datum/mind/B in team.members) - if(B.current) - B.current.update_mob_action_buttons() - if(!B.current.incapacitated()) - SEND_SOUND(B.current, 'sound/hallucinations/im_here1.ogg') - to_chat(B.current, span_cultlarge("Acolyte [Nominee] has asserted that [Nominee.p_theyre()] worthy of leading the cult. A vote will be called shortly.")) - sleep(10 SECONDS) - var/list/asked_cultists = list() - for(var/datum/mind/B in team.members) - if(B.current && B.current != Nominee && !B.current.incapacitated()) - SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg') - asked_cultists += B.current - var/list/yes_voters = SSpolling.poll_candidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 30 SECONDS, group = asked_cultists, pic_source = Nominee, role_name_text = "cult master") - if(QDELETED(Nominee) || Nominee.incapacitated()) + team.cult_vote_called = TRUE + for(var/datum/mind/team_member as anything in team.members) + if(!team_member.current) + continue + team_member.current.update_mob_action_buttons() + if(team_member.current.incapacitated()) + continue + SEND_SOUND(team_member.current, 'sound/hallucinations/im_here1.ogg') + to_chat(team_member.current, span_cultlarge("Acolyte [nominee] has asserted that [nominee.p_theyre()] worthy of leading the cult. A vote will be called shortly.")) + + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(poll_cultists_for_leader), nominee, team), 10 SECONDS) + +///Polls all Cultists on whether the person putting themselves forward should be made the Cult Leader, if they can actually be such. +/proc/poll_cultists_for_leader(mob/living/nominee, datum/team/cult/team) + if(QDELETED(nominee) || nominee.incapacitated()) team.cult_vote_called = FALSE - for(var/datum/mind/B in team.members) - if(B.current) - B.current.update_mob_action_buttons() - if(!B.current.incapacitated()) - to_chat(B.current,span_cultlarge("[Nominee] has died in the process of attempting to win the cult's support!")) + for(var/datum/mind/team_member as anything in team.members) + if(!team_member.current) + continue + team_member.current.update_mob_action_buttons() + if(team_member.current.incapacitated()) + continue + to_chat(team_member.current,span_cultlarge("[nominee] has died in the process of attempting to start a vote!")) return FALSE - if(!Nominee.mind) + var/list/mob/living/asked_cultists = list() + for(var/datum/mind/team_member as anything in team.members) + if(!team_member.current || team_member.current == nominee || team_member.current.incapacitated()) + continue + SEND_SOUND(team_member.current, 'sound/magic/exit_blood.ogg') + asked_cultists += team_member.current + + var/list/yes_voters = SSpolling.poll_candidates( + question = "[nominee] seeks to lead your cult, do you support [nominee.p_them()]?", + poll_time = 30 SECONDS, + group = asked_cultists, + pic_source = nominee, + role_name_text = "cult master", + custom_response_messages = list( + POLL_RESPONSE_SIGNUP = "You have pledged your allegience to [nominee].", + POLL_RESPONSE_ALREADY_SIGNED = "You have already pledged your allegience!", + POLL_RESPONSE_NOT_SIGNED = "You aren't nominated for this.", + POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to unregister yourself, voting has already begun!", + POLL_RESPONSE_UNREGISTERED = "You have been removed your pledge to [nominee].", + ) + ) + if(QDELETED(nominee) || nominee.incapacitated()) team.cult_vote_called = FALSE - for(var/datum/mind/B in team.members) - if(B.current) - B.current.update_mob_action_buttons() - if(!B.current.incapacitated()) - to_chat(B.current,span_cultlarge("[Nominee] has gone catatonic in the process of attempting to win the cult's support!")) + for(var/datum/mind/team_member as anything in team.members) + if(!team_member.current) + continue + team_member.current.update_mob_action_buttons() + if(team_member.current.incapacitated()) + continue + to_chat(team_member.current,span_cultlarge("[nominee] has died in the process of attempting to win the cult's support!")) + return FALSE + if(!nominee.mind) + team.cult_vote_called = FALSE + for(var/datum/mind/team_member as anything in team.members) + if(!team_member.current) + continue + team_member.current.update_mob_action_buttons() + if(team_member.current.incapacitated()) + continue + to_chat(team_member.current,span_cultlarge("[nominee] has gone catatonic in the process of attempting to win the cult's support!")) return FALSE if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5) team.cult_vote_called = FALSE - for(var/datum/mind/B in team.members) - if(B.current) - B.current.update_mob_action_buttons() - if(!B.current.incapacitated()) - to_chat(B.current, span_cultlarge("[Nominee] could not win the cult's support and shall continue to serve as an acolyte.")) + for(var/datum/mind/team_member as anything in team.members) + if(!team_member.current) + continue + team_member.current.update_mob_action_buttons() + if(team_member.current.incapacitated()) + continue + to_chat(team_member.current, span_cultlarge("[nominee] could not win the cult's support and shall continue to serve as an acolyte.")) return FALSE - var/datum/antagonist/cult/cult_datum = Nominee.mind.has_antag_datum(/datum/antagonist/cult) + + team.cult_vote_called = FALSE + var/datum/antagonist/cult/cult_datum = nominee.mind.has_antag_datum(/datum/antagonist/cult) if(!cult_datum.make_cult_leader()) CRASH("[cult_datum.owner.current] was supposed to turn into the leader, but they didn't for some reason. This isn't supposed to happen unless an Admin messed with it.") return TRUE diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index f99f2db9e79..5426b41805a 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -832,9 +832,9 @@ Striking a noncultist, however, will tear their flesh."} var/mob/living/carbon/carbon_cultist = our_target carbon_cultist.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) if(isshade(our_target) || isconstruct(our_target)) - var/mob/living/simple_animal/undead_abomination = our_target - if(undead_abomination.health+5 < undead_abomination.maxHealth) - undead_abomination.adjustHealth(-5) + var/mob/living/basic/construct/undead_abomination = our_target + if(undead_abomination.health + 5 < undead_abomination.maxHealth) + undead_abomination.adjust_health(-5) return PROJECTILE_DELETE_WITHOUT_HITTING /obj/item/blood_beam @@ -934,11 +934,11 @@ Striking a noncultist, however, will tear their flesh."} if(H.stat != DEAD) H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 7) if(isshade(target) || isconstruct(target)) - var/mob/living/simple_animal/M = target - if(M.health+15 < M.maxHealth) - M.adjustHealth(-15) + var/mob/living/basic/construct/healed_guy = target + if(healed_guy.health + 15 < healed_guy.maxHealth) + healed_guy.adjust_health(-15) else - M.health = M.maxHealth + healed_guy.health = healed_guy.maxHealth else var/mob/living/L = target if(L.density) diff --git a/code/modules/antagonists/cult/cult_structure_pylon.dm b/code/modules/antagonists/cult/cult_structure_pylon.dm index 7900aaad120..4bb7c83e7a7 100644 --- a/code/modules/antagonists/cult/cult_structure_pylon.dm +++ b/code/modules/antagonists/cult/cult_structure_pylon.dm @@ -48,12 +48,9 @@ var/static/list/blacklisted_pylon_turfs = typecacheof(list( /turf/closed, /turf/open/floor/engine/cult, - /turf/open/space, - /turf/open/lava, - /turf/open/chasm, /turf/open/misc/asteroid, )) - if(is_type_in_typecache(nearby_turf, blacklisted_pylon_turfs)) + if(isgroundlessturf(nearby_turf) || is_type_in_typecache(nearby_turf, blacklisted_pylon_turfs)) continue validturfs |= nearby_turf diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index c445e73e90e..bf5d64d7e83 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -222,52 +222,58 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/convert/invoke(list/invokers) if(rune_in_use) return + var/list/myriad_targets = list() - var/turf/T = get_turf(src) - for(var/mob/living/M in T) - if(!IS_CULTIST(M)) - myriad_targets |= M - if(!length(myriad_targets)) + for(var/mob/living/non_cultist in loc) + if(!IS_CULTIST(non_cultist)) + myriad_targets += non_cultist + + if(!length(myriad_targets) && !try_spawn_sword()) fail_invoke() - log_game("Offer rune failed - no eligible targets.") return + rune_in_use = TRUE visible_message(span_warning("[src] pulses blood red!")) var/oldcolor = color color = RUNE_COLOR_DARKRED - var/mob/living/L = pick(myriad_targets) - var/mob/living/F = invokers[1] - var/datum/antagonist/cult/C = F.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - var/datum/team/cult/Cult_team = C.cult_team - var/is_convertable = is_convertable_to_cult(L, C.cult_team) - if(L.stat != DEAD && is_convertable) - invocation = "Mah'weyh pleggh at e'ntrath!" - ..() - if(is_convertable) - do_convert(L, invokers, Cult_team) + if(length(myriad_targets)) + var/mob/living/new_convertee = pick(myriad_targets) + var/mob/living/first_invoker = invokers[1] + var/datum/antagonist/cult/first_invoker_datum = first_invoker.mind.has_antag_datum(/datum/antagonist/cult) + var/datum/team/cult/cult_team = first_invoker_datum.get_team() + + var/is_convertable = is_convertable_to_cult(new_convertee, cult_team) + if(new_convertee.stat != DEAD && is_convertable) + invocation = "Mah'weyh pleggh at e'ntrath!" + ..() + do_convert(new_convertee, invokers, cult_team) + + else + invocation = "Barhah hra zar'garis!" + ..() + do_sacrifice(new_convertee, invokers, cult_team) + + cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew + else - invocation = "Barhah hra zar'garis!" - ..() - do_sacrifice(L, invokers) - animate(src, color = oldcolor, time = 5) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 5) - Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew + do_invoke_glow() + + animate(src, color = oldcolor, time = 0.5 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 0.5 SECONDS) rune_in_use = FALSE /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers, datum/team/cult/cult_team) ASSERT(convertee.mind) if(length(invokers) < 2) - for(var/M in invokers) - to_chat(M, span_warning("You need at least two invokers to convert [convertee]!")) - log_game("Offer rune with [convertee] on it failed - tried conversion with one invoker.") + for(var/invoker in invokers) + to_chat(invoker, span_warning("You need at least two invokers to convert [convertee]!")) return FALSE if(convertee.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY, charge_cost = 0)) //No charge_cost because it can be spammed - for(var/M in invokers) - to_chat(M, span_warning("Something is shielding [convertee]'s mind!")) - log_game("Offer rune with [convertee] on it failed - convertee had anti-magic.") + for(var/invoker in invokers) + to_chat(invoker, span_warning("Something is shielding [convertee]'s mind!")) return FALSE var/brutedamage = convertee.getBruteLoss() @@ -314,19 +320,11 @@ structure_check() searches for nearby cultist structures required for the invoca convertee.name = convertee.real_name return TRUE -/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) - var/mob/living/first_invoker = invokers[1] - if(!first_invoker) - return FALSE - var/datum/antagonist/cult/C = first_invoker.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!C) - return FALSE - +/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, datum/team/cult/cult_team) var/big_sac = FALSE - if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && length(invokers) < 3) - for(var/M in invokers) - to_chat(M, span_cultitalic("[sacrificial] is too greatly linked to the world! You need three acolytes!")) - log_game("Offer rune with [sacrificial] on it failed - not enough acolytes and target is living or sac target") + if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || cult_team.is_sacrifice_target(sacrificial.mind)) && length(invokers) < 3) + for(var/invoker in invokers) + to_chat(invoker, span_cultitalic("[sacrificial] is too greatly linked to the world! You need three acolytes!")) return FALSE var/signal_result = SEND_SIGNAL(sacrificial, COMSIG_LIVING_CULT_SACRIFICED, invokers) @@ -335,7 +333,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(sacrificial.mind) LAZYADD(GLOB.sacrificed, WEAKREF(sacrificial.mind)) - for(var/datum/objective/sacrifice/sac_objective in C.cult_team.objectives) + for(var/datum/objective/sacrifice/sac_objective in cult_team.objectives) if(sac_objective.target == sacrificial.mind) sac_objective.sacced = TRUE sac_objective.clear_sacrifice() @@ -344,7 +342,7 @@ structure_check() searches for nearby cultist structures required for the invoca else LAZYADD(GLOB.sacrificed, WEAKREF(sacrificial)) - new /obj/effect/temp_visual/cult/sac(get_turf(src)) + new /obj/effect/temp_visual/cult/sac(loc) if(!(signal_result & SILENCE_SACRIFICE_MESSAGE)) for(var/invoker in invokers) @@ -357,26 +355,70 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(invoker, span_cultlarge("\"I accept this meager sacrifice.\"")) if(iscyborg(sacrificial)) - var/construct_class = show_radial_menu(first_invoker, sacrificial, GLOB.construct_radial_images, require_near = TRUE, tooltips = TRUE) + var/construct_class = show_radial_menu(invokers[1], sacrificial, GLOB.construct_radial_images, require_near = TRUE, tooltips = TRUE) if(QDELETED(sacrificial) || !construct_class) return FALSE sacrificial.grab_ghost() - make_new_construct_from_class(construct_class, THEME_CULT, sacrificial, first_invoker, TRUE, get_turf(src)) + make_new_construct_from_class(construct_class, THEME_CULT, sacrificial, invokers[1], TRUE, get_turf(src)) var/mob/living/silicon/robot/sacriborg = sacrificial sacrificial.log_message("was sacrificed as a cyborg.", LOG_GAME) sacriborg.mmi = null qdel(sacrificial) return TRUE - var/obj/item/soulstone/stone = new /obj/item/soulstone(get_turf(src)) + + var/obj/item/soulstone/stone = new(loc) if(sacrificial.mind && !HAS_TRAIT(sacrificial, TRAIT_SUICIDED)) - stone.capture_soul(sacrificial, first_invoker, TRUE) + stone.capture_soul(sacrificial, invokers[1], forced = TRUE) if(sacrificial) playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, TRUE) sacrificial.investigate_log("has been sacrificially gibbed by the cult.", INVESTIGATE_DEATHS) sacrificial.gib(DROP_ALL_REMAINS) + + try_spawn_sword() // after sharding and gibbing, which potentially dropped a null rod return TRUE +/// Tries to convert a null rod over the rune to a cult sword +/obj/effect/rune/convert/proc/try_spawn_sword() + for(var/obj/item/nullrod/rod in loc) + if(rod.anchored || (rod.resistance_flags & INDESTRUCTIBLE)) + continue + + var/num_slain = LAZYLEN(rod.cultists_slain) + var/displayed_message = "[rod] glows an unholy red and begins to transform..." + if(GET_ATOM_BLOOD_DNA_LENGTH(rod)) + displayed_message += " The blood of [num_slain] fallen cultist[num_slain == 1 ? "":"s"] is absorbed into [rod]!" + + rod.visible_message(span_cultitalic(displayed_message)) + switch(num_slain) + if(0, 1) + animate_spawn_sword(rod, /obj/item/melee/cultblade/dagger) + if(2) + animate_spawn_sword(rod, /obj/item/melee/cultblade) + else + animate_spawn_sword(rod, /obj/item/cult_bastard) + return TRUE + + return FALSE + +/// Does an animation of a null rod transforming into a cult sword +/obj/effect/rune/convert/proc/animate_spawn_sword(obj/item/nullrod/former_rod, new_blade_typepath) + playsound(src, 'sound/effects/magic.ogg', 33, vary = TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 0.66) + former_rod.anchored = TRUE + former_rod.Shake() + animate(former_rod, alpha = 0, transform = matrix(former_rod.transform).Scale(0.01), time = 2 SECONDS, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) + QDEL_IN(former_rod, 2 SECONDS) + + var/obj/item/new_blade = new new_blade_typepath(loc) + var/matrix/blade_matrix_on_spawn = matrix(new_blade.transform) + new_blade.name = "converted [new_blade.name]" + new_blade.anchored = TRUE + new_blade.alpha = 0 + new_blade.transform = matrix(new_blade.transform).Scale(0.01) + new_blade.Shake() + animate(new_blade, alpha = 255, transform = blade_matrix_on_spawn, time = 2 SECONDS, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) + addtimer(VARSET_CALLBACK(new_blade, anchored, FALSE), 2 SECONDS) + /obj/effect/rune/empower cultist_name = "Empower" cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost." @@ -532,7 +574,8 @@ structure_check() searches for nearby cultist structures required for the invoca color = RUNE_COLOR_DARKRED icon_state = "rune_large" pixel_x = -32 //So the big ol' 96x96 sprite shows up right - pixel_y = -32 + pixel_y = 16 + pixel_z = -48 scribe_delay = 50 SECONDS //how long the rune takes to create scribe_damage = 40.1 //how much damage you take doing it log_when_erased = TRUE @@ -1032,7 +1075,8 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) icon = 'icons/effects/96x96.dmi' icon_state = "apoc" pixel_x = -32 - pixel_y = -32 + pixel_y = 16 + pixel_z = -48 color = RUNE_COLOR_DARKRED req_cultists = 3 scribe_delay = 100 diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index d6740521e80..6dee633061a 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -65,7 +65,9 @@ PATH_BLADE = "label", // my favorite color is label PATH_COSMIC = "purple", PATH_LOCK = "yellow", + PATH_MOON = "blue", ) + var/static/list/path_to_rune_color = list( PATH_START = COLOR_LIME, PATH_RUST = COLOR_CARGO_BROWN, @@ -75,6 +77,7 @@ PATH_BLADE = COLOR_SILVER, PATH_COSMIC = COLOR_PURPLE, PATH_LOCK = COLOR_YELLOW, + PATH_MOON = COLOR_BLUE_LIGHT, ) /datum/antagonist/heretic/Destroy() @@ -228,7 +231,6 @@ RegisterSignal(our_mob, COMSIG_MOB_ITEM_AFTERATTACK, PROC_REF(on_item_afterattack)) RegisterSignal(our_mob, COMSIG_MOB_LOGIN, PROC_REF(fix_influence_network)) RegisterSignal(our_mob, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(after_fully_healed)) - RegisterSignal(our_mob, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed)) /datum/antagonist/heretic/remove_innate_effects(mob/living/mob_override) var/mob/living/our_mob = mob_override || owner.current @@ -244,7 +246,6 @@ COMSIG_MOB_ITEM_AFTERATTACK, COMSIG_MOB_LOGIN, COMSIG_LIVING_POST_FULLY_HEAL, - COMSIG_LIVING_CULT_SACRIFICED )) /datum/antagonist/heretic/on_body_transfer(mob/living/old_body, mob/living/new_body) @@ -392,15 +393,6 @@ var/datum/heretic_knowledge/living_heart/heart_knowledge = get_knowledge(/datum/heretic_knowledge/living_heart) heart_knowledge.on_research(source, src) -/// Signal proc for [COMSIG_LIVING_CULT_SACRIFICED] to reward cultists for sacrificing a heretic -/datum/antagonist/heretic/proc/on_cult_sacrificed(mob/living/source, list/invokers) - SIGNAL_HANDLER - - new /obj/item/cult_bastard(source.loc) - for(var/mob/living/cultist as anything in invokers) - to_chat(cultist, span_cultlarge("\"A follower of the forgotten gods! You must be rewarded for such a valuable sacrifice.\"")) - return SILENCE_SACRIFICE_MESSAGE - /** * Create our objectives for our heretic. */ diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 2e747342412..cb9f3b75ccc 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -116,7 +116,7 @@ return TRUE /** - * Parses specific items into a more reaadble form. + * Parses specific items into a more readble form. * Can be overriden by knoweldge subtypes. */ /datum/heretic_knowledge/proc/parse_required_item(atom/item_path, number_of_things) @@ -126,7 +126,6 @@ if(ispath(item_path, /mob/living)) return "carcass[number_of_things > 1 ? "es" : ""] of any kind" return "[initial(item_path.name)]\s" - /** * Called whenever the knowledge's associated ritual is completed successfully. * @@ -144,6 +143,7 @@ /datum/heretic_knowledge/proc/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) if(!length(result_atoms)) return FALSE + for(var/result in result_atoms) new result(loc) return TRUE @@ -181,7 +181,6 @@ continue how_much_to_use = min(required_atoms[requirement], sac_stack.amount) break - sac_stack.use(how_much_to_use) continue diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm new file mode 100644 index 00000000000..5aa63407dc6 --- /dev/null +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -0,0 +1,245 @@ +// The basic eldritch painting +/obj/item/wallframe/painting/eldritch + name = "The debug and a coder who slept" + icon = 'icons/obj/signs.dmi' + resistance_flags = FLAMMABLE + flags_1 = NONE + icon_state = "frame-empty" + result_path = /obj/structure/sign/painting/eldritch + pixel_shift = 30 + +/obj/structure/sign/painting/eldritch + name = "The debug and a coder who slept" + icon = 'icons/obj/signs.dmi' + icon_state = "frame-empty" + custom_materials = list(/datum/material/wood =SHEET_MATERIAL_AMOUNT) + resistance_flags = FLAMMABLE + buildable_sign = FALSE + // The list of canvas types accepted by this frame, set to zero here + accepted_canvas_types = list() + // Set to false since we don't want this to persist + persistence_id = FALSE + /// The trauma the painting applies + var/applied_trauma = /datum/brain_trauma/severe/pacifism + /// The text that shows up when you cross the paintings path + var/text_to_display = "I should not be seeing this..." + /// The range of the paintings effect + var/range = 7 + +/obj/structure/sign/painting/eldritch/Initialize(mapload, dir, building) + . = ..() + if(ispath(applied_trauma)) + var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(apply_trauma)) + AddComponent(/datum/component/connect_range, tracked = src, connections = connections, range = range, works_in_containers = FALSE) + +/obj/structure/sign/painting/eldritch/proc/apply_trauma(datum/source, mob/living/carbon/viewer) + SIGNAL_HANDLER + if(!isliving(viewer) || !can_see(viewer, src, range)) + return + if(isnull(viewer.mind) || isnull(viewer.mob_mood) || viewer.stat != CONSCIOUS || viewer.is_blind()) + return + if(viewer.has_trauma_type(applied_trauma)) + return + if(IS_HERETIC(viewer)) + return + if(viewer.can_block_magic(MAGIC_RESISTANCE)) + return + to_chat(viewer, span_notice(text_to_display)) + viewer.gain_trauma(applied_trauma, TRAUMA_RESILIENCE_SURGERY) + INVOKE_ASYNC(viewer, TYPE_PROC_REF(/mob, emote), "scream") + to_chat(viewer, span_hypnophrase("As you gaze upon the painting, your mind rends to its truth!")) + +/obj/structure/sign/painting/eldritch/wirecutter_act(mob/living/user, obj/item/I) + if(!user.can_block_magic(MAGIC_RESISTANCE)) + user.add_mood_event("ripped_eldritch_painting", /datum/mood_event/eldritch_painting) + to_chat(user, span_hypnophrase("Laughter echoes through your mind....")) + qdel(src) + return ITEM_INTERACT_SUCCESS + +// On examine eldritch paintings give a trait so their effects can not be spammed +/obj/structure/sign/painting/eldritch/examine(mob/user) + . = ..() + if(!iscarbon(user)) + return + if(HAS_TRAIT(user, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + + ADD_TRAIT(user, TRAIT_ELDRITCH_PAINTING_EXAMINE, REF(src)) + addtimer(TRAIT_CALLBACK_REMOVE(user, TRAIT_ELDRITCH_PAINTING_EXAMINE, REF(src)), 3 MINUTES) + addtimer(CALLBACK(src, PROC_REF(examine_effects), user), 0.2 SECONDS) + +/obj/structure/sign/painting/eldritch/proc/examine_effects(mob/living/carbon/examiner) + if(IS_HERETIC(examiner)) + to_chat(examiner, span_notice("Oh, what arts!")) + else + to_chat(examiner, span_notice("Kinda strange painting.")) + +// The sister and He Who Wept eldritch painting +/obj/item/wallframe/painting/eldritch/weeping + name = "The sister and He Who Wept" + desc = "A beautiful artwork depicting a fair lady and HIM, HE WEEPS, I WILL SEE HIM AGAIN." + icon_state = "eldritch_painting_weeping" + result_path = /obj/structure/sign/painting/eldritch/weeping + +/obj/structure/sign/painting/eldritch/weeping + name = "The sister and He Who Wept" + desc = "A beautiful artwork depicting a fair lady and HIM, HE WEEPS, I WILL SEE HIM AGAIN. Destroyable with wirecutters." + icon_state = "eldritch_painting_weeping" + applied_trauma = /datum/brain_trauma/severe/weeping + text_to_display = "Oh what arts! She is so fair, and he...HE WEEPS!!!" + +/obj/structure/sign/painting/eldritch/weeping/examine_effects(mob/living/carbon/examiner) + if(!IS_HERETIC(examiner)) + to_chat(examiner, span_hypnophrase("Respite, for now....")) + examiner.mob_mood.mood_events.Remove("eldritch_weeping") + examiner.add_mood_event("weeping_withdrawl", /datum/mood_event/eldritch_painting/weeping_withdrawl) + return + + to_chat(examiner, span_notice("Oh, what arts! Just gazing upon it clears your mind.")) + examiner.remove_status_effect(/datum/status_effect/hallucination) + examiner.add_mood_event("heretic_eldritch_painting", /datum/mood_event/eldritch_painting/weeping_heretic) + +// The First Desire painting, using a lot of the painting/eldritch framework +/obj/item/wallframe/painting/eldritch/desire + name = "The First Desire" + desc = "A painting depicting a platter of flesh, just looking at it makes your stomach knot and mouth froth." + icon_state = "eldritch_painting_desire" + result_path = /obj/structure/sign/painting/eldritch/desire + +/obj/structure/sign/painting/eldritch/desire + name = "The First Desire" + desc = "A painting depicting a platter of flesh, just looking at it makes your stomach knot and mouth froth. Destroyable with wirecutters." + icon_state = "eldritch_painting_desire" + applied_trauma = /datum/brain_trauma/severe/flesh_desire + text_to_display = "What an artwork, just looking at it makes me hunger...." + +// The special examine interaction for this painting +/obj/structure/sign/painting/eldritch/desire/examine_effects(mob/living/carbon/examiner) + if(!IS_HERETIC(examiner)) + // Gives them some nutrition + examiner.adjust_nutrition(50) + to_chat(examiner, span_warning("You feel a searing pain in your stomach!")) + examiner.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) + to_chat(examiner, span_notice("You feel less hungry, but more empty somehow?")) + examiner.add_mood_event("respite_eldritch_hunger", /datum/mood_event/eldritch_painting/desire_examine) + return + + // A list made of the organs and bodyparts the heretic can get + var/static/list/random_bodypart_or_organ = list( + /obj/item/organ/internal/brain, + /obj/item/organ/internal/lungs, + /obj/item/organ/internal/eyes, + /obj/item/organ/internal/ears, + /obj/item/organ/internal/heart, + /obj/item/organ/internal/liver, + /obj/item/organ/internal/stomach, + /obj/item/organ/internal/appendix, + /obj/item/bodypart/arm/left, + /obj/item/bodypart/arm/right, + /obj/item/bodypart/leg/left, + /obj/item/bodypart/leg/right + ) + var/organ_or_bodypart_to_spawn = pick(random_bodypart_or_organ) + new organ_or_bodypart_to_spawn(drop_location()) + to_chat(examiner, span_notice("A piece of flesh crawls out of the painting and flops onto the floor.")) + // Adds a negative mood event to our heretic + examiner.add_mood_event("heretic_eldritch_hunger", /datum/mood_event/eldritch_painting/desire_heretic) + +// Great chaparral over rolling hills, this one doesn't have the sensor type +/obj/item/wallframe/painting/eldritch/vines + name = "Great chaparral over rolling hills" + desc = "A painting depicting a massive thicket, it seems to be attempting to crawl through the frame." + icon_state = "eldritch_painting_vines" + result_path = /obj/structure/sign/painting/eldritch/vines + +/obj/structure/sign/painting/eldritch/vines + name = "Great chaparral over rolling hills" + desc = "A painting depicting a massive thicket, it seems to be attempting to crawl through the frame. Destroyable with wirecutters." + icon_state = "eldritch_painting_vines" + applied_trauma = null + // A static list of 5 pretty strong mutations, simple to expand for any admins + var/list/mutations = list( + /datum/spacevine_mutation/aggressive_spread, + /datum/spacevine_mutation/fire_proof, + /datum/spacevine_mutation/hardened, + /datum/spacevine_mutation/thorns, + /datum/spacevine_mutation/toxicity, + ) + // Poppy and harebell are used in heretic rituals + var/list/items_to_spawn = list( + /obj/item/food/grown/poppy, + /obj/item/food/grown/harebell, + ) + +/obj/structure/sign/painting/eldritch/vines/Initialize(mapload, dir, building) + . = ..() + new /datum/spacevine_controller(get_turf(src), mutations, 0, 10) + +/obj/structure/sign/painting/eldritch/vines/examine_effects(mob/living/carbon/examiner) + . = ..() + if(!IS_HERETIC(examiner)) + new /datum/spacevine_controller(get_turf(examiner), mutations, 0, 10) + to_chat(examiner, span_hypnophrase("The thicket crawls through the frame, and you suddenly find vines beneath you...")) + return + + var/item_to_spawn = pick(items_to_spawn) + to_chat(examiner, span_notice("You picture yourself in the thicket picking flowers..")) + new item_to_spawn(examiner.drop_location()) + examiner.add_mood_event("heretic_vines", /datum/mood_event/eldritch_painting/heretic_vines) + + +// Lady out of gates, gives a brain trauma causing the person to scratch themselves +/obj/item/wallframe/painting/eldritch/beauty + name = "Lady out of gates" + desc = "A painting depicting a perfect lady, and I must be perfect like her..." + icon_state = "eldritch_painting_beauty" + result_path = /obj/structure/sign/painting/eldritch/beauty + +/obj/structure/sign/painting/eldritch/beauty + name = "Lady out of gates" + desc = "A painting depicting a perfect lady, and I must be perfect like her. Destroyable with wirecutters." + icon_state = "eldritch_painting_beauty" + applied_trauma = /datum/brain_trauma/severe/eldritch_beauty + text_to_display = "Her flesh glows in the pale light, and mine can too...If it wasnt for these imperfections...." + /// List of reagents to add to heretics on examine, set to mutadone by default to remove mutations + var/list/reagents_to_add = list(/datum/reagent/medicine/mutadone = 5) + +// The special examine interaction for this painting +/obj/structure/sign/painting/eldritch/beauty/examine_effects(mob/living/carbon/examiner) + . = ..() + if(!examiner.has_dna()) + return + + if(!IS_HERETIC(examiner)) + to_chat(examiner, span_hypnophrase("You feel changed, more perfect....")) + examiner.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) + return + + to_chat(examiner, span_notice("Your imperfections shed and you are restored.")) + examiner.reagents.add_reagent_list(reagents_to_add) + +// Climb over the rusted mountain, gives a brain trauma causing the person to randomly rust tiles beneath them +/obj/item/wallframe/painting/eldritch/rust + name = "Climb over the rusted mountain" + desc = "A painting depicting something climbing a mountain of rust, it gives you an eerie feeling." + icon_state = "eldritch_painting_rust" + result_path = /obj/structure/sign/painting/eldritch/rust + +/obj/structure/sign/painting/eldritch/rust + name = "Climb over the rusted mountain" + desc = "A painting depicting something climbing a mountain of rust, it gives you an eerie feeling. Destroyable with wirecutters." + icon_state = "eldritch_painting_rust" + applied_trauma = /datum/brain_trauma/severe/rusting + text_to_display = "It climbs, and I will aid it...The rust calls and I shall answer..." + +// The special examine interaction for this painting +/obj/structure/sign/painting/eldritch/rust/examine_effects(mob/living/carbon/examiner) + . = ..() + + if(!IS_HERETIC(examiner)) + to_chat(examiner, span_hypnophrase("It can wait...")) + examiner.add_mood_event("rusted_examine", /datum/mood_event/eldritch_painting/rust_examine) + return + + to_chat(examiner, span_notice("You see the climber, and are inspired by it!")) + examiner.add_mood_event("rusted_examine", /datum/mood_event/eldritch_painting/rust_heretic_examine) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 8eb08a76427..81f9b4bc80a 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -145,3 +145,12 @@ after_use_message = "The Stewards hear your call..." tool_behaviour = TOOL_CROWBAR toolspeed = 1.3 + +// Path of Moon's blade +/obj/item/melee/sickly_blade/moon + name = "\improper moon blade" + desc = "A blade of iron, reflecting the truth of the earth: All join the troupe one day. \ + A troupe bringing joy, carving smiles on their faces if they want one or not." + icon_state = "moon_blade" + inhand_icon_state = "moon_blade" + after_use_message = "The Moon hears your call..." diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index fff184bdfb6..44e387cf970 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -50,3 +50,36 @@ icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL + + +// The amulette conversion tool used by moon heretics +/obj/item/clothing/neck/heretic_focus/moon_amulette + name = "Moonlight Amulette" + desc = "A piece of the mind, the sight and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." + 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? + var/sanity_damage = 20 + +/obj/item/clothing/neck/heretic_focus/moon_amulette/attack(mob/living/target, mob/living/user, params) + var/mob/living/carbon/human/hit = target + if(!IS_HERETIC(user)) + user.balloon_alert(user, "you feel a presence watching you") + user.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) + user.mob_mood.set_sanity(user.mob_mood.sanity - 50) + return + if(hit.can_block_magic()) + return + if(!hit.mob_mood) + return + if(hit.mob_mood.sanity_level < SANITY_LEVEL_CRAZY) + user.balloon_alert(user, "their mind is too strong!") + hit.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) + hit.mob_mood.set_sanity(hit.mob_mood.sanity - sanity_damage) + else + 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]") + . = ..() diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm new file mode 100644 index 00000000000..4fa86427d27 --- /dev/null +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -0,0 +1,78 @@ +//Item for knock/moon heretic sidepath, it can block 5 hits of damage, acts as storage and if the heretic is examined the examiner suffers brain damage and blindness + +/obj/item/storage/belt/unfathomable_curio + name = "Unfathomable Curio" + desc = "It. It looks backs. It looks past. It looks in. It sees. It hides. It opens." + icon_state = "unfathomable_curio" + worn_icon_state = "unfathomable_curio" + content_overlays = FALSE + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg' + //Vars used for the shield component + var/heretic_shield_icon = "unfathomable_shield" + var/max_charges = 1 + var/recharge_start_delay = 60 SECONDS + var/charge_increment_delay = 60 SECONDS + var/charge_recovery = 1 + +/obj/item/storage/belt/unfathomable_curio/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_total_storage = 21 + atom_storage.set_holdable(list( + /obj/item/ammo_box/strilka310/lionhunter, + /obj/item/bodypart, // Bodyparts are often used in rituals. + /obj/item/clothing/neck/eldritch_amulet, + /obj/item/clothing/neck/heretic_focus, + /obj/item/codex_cicatrix, + /obj/item/eldritch_potion, + /obj/item/food/grown/poppy, // Used to regain a Living Heart. + /obj/item/food/grown/harebell, // Used to reroll targets + /obj/item/melee/rune_carver, + /obj/item/melee/sickly_blade, + /obj/item/organ, // Organs are also often used in rituals. + /obj/item/reagent_containers/cup/beaker/eldritch, + /obj/item/stack/sheet/glass, // Glass is often used by moon heretics + )) + + AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ + charge_recovery = charge_recovery, shield_icon = heretic_shield_icon, run_hit_callback = CALLBACK(src, PROC_REF(shield_damaged))) + + +/obj/item/storage/belt/unfathomable_curio/equipped(mob/user, slot, initial) + . = ..() + if(!(slot & slot_flags)) + return + + if(!IS_HERETIC(user)) + to_chat(user, span_warning("The curio wraps around you, and you feel the beating of something dark inside it...")) + + +// Our on hit effect +/obj/item/storage/belt/unfathomable_curio/proc/shield_damaged(mob/living/carbon/wearer, attack_text, new_current_charges) + var/list/brain_traumas = list( + /datum/brain_trauma/severe/mute, + /datum/brain_trauma/severe/flesh_desire, + /datum/brain_trauma/severe/eldritch_beauty, + /datum/brain_trauma/severe/paralysis, + /datum/brain_trauma/severe/monophobia + ) + wearer.visible_message(span_danger("[wearer]'s veil makes [attack_text] miss, but the force behind the blow causes it to disperse!")) + if(IS_HERETIC(wearer)) + return + + 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) + +/obj/item/storage/belt/unfathomable_curio/examine(mob/living/carbon/user) + . = ..() + if(IS_HERETIC(user)) + return + + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) + user.adjust_temp_blindness(5 SECONDS) + . += span_notice("It. It looked. IT WRAPS ITSELF AROUND ME.") + + diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 03b9a716d53..93983c41e0d 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -227,10 +227,7 @@ During this process, you will rapidly regenerate stamina and quickly recover from stuns, however, you will be unable to attack. \ 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." - next_knowledge = list( - /datum/heretic_knowledge/duel_stance, - /datum/heretic_knowledge/rifle, - ) + next_knowledge = list(/datum/heretic_knowledge/duel_stance) spell_to_add = /datum/action/cooldown/spell/realignment cost = 1 route = PATH_BLADE @@ -250,6 +247,7 @@ /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/rune_carver, /datum/heretic_knowledge/crucible, + /datum/heretic_knowledge/rifle, ) cost = 1 route = PATH_BLADE @@ -386,7 +384,7 @@ /datum/heretic_knowledge/ultimate/blade_final name = "Maelstrom of Silver" desc = "The ascension ritual of the Path of Blades. \ - Bring 3 headless corpses to a transmutation rune to complete the ritual. \ + Bring 3 corpses with either no head or a split skull to a transmutation rune to complete the ritual. \ When completed, you will be surrounded in a constant, regenerating orbit of blades. \ These blades will protect you from all attacks, but are consumed on use. \ Your Furious Steel spell will also have a shorter cooldown. \ @@ -401,7 +399,7 @@ if(!.) return FALSE - return !sacrifice.get_bodypart(BODY_ZONE_HEAD) + return !sacrifice.get_bodypart(BODY_ZONE_HEAD) || HAS_TRAIT(sacrifice, TRAIT_HAS_CRANIAL_FISSURE) /datum/heretic_knowledge/ultimate/blade_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 7c4a61da09d..1a16f2e9f93 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -71,9 +71,9 @@ gain_text = "The distant stars crept into my dreams, roaring and screaming without reason. \ I spoke, and heard my own words echoed back." next_knowledge = list( + /datum/heretic_knowledge/summon/fire_shark, /datum/heretic_knowledge/mark/cosmic_mark, /datum/heretic_knowledge/essence, - /datum/heretic_knowledge/summon/fire_shark, ) spell_to_add = /datum/action/cooldown/spell/cosmic_rune cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 6c0def3f67d..d6fcb2f43a2 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -13,7 +13,6 @@ * Imperfect Ritual * > Sidepaths: * Void Cloak - * Ashen Eyes * * Mark of Flesh * Ritual of Knowledge @@ -21,13 +20,13 @@ * Raw Ritual * > Sidepaths: * Blood Siphon - * Curse of Paralysis + * Opening Blast * * Bleeding Steel * Lonely Ritual * > Sidepaths: - * Ashen Ritual * Cleave + * Aptera Vulnera * * Priest's Final Hymn */ @@ -129,7 +128,6 @@ next_knowledge = list( /datum/heretic_knowledge/mark/flesh_mark, /datum/heretic_knowledge/void_cloak, - /datum/heretic_knowledge/medallion, ) required_atoms = list( /mob/living/carbon/human = 1, @@ -242,7 +240,7 @@ /datum/heretic_knowledge/blade_upgrade/flesh, /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/curse/paralysis, + /datum/heretic_knowledge/spell/opening_blast, ) required_atoms = list( /obj/item/organ/internal/eyes = 1, @@ -281,7 +279,7 @@ An ever shapeshifting mass of flesh, it knew well my goals. The Marshal approved." next_knowledge = list( /datum/heretic_knowledge/ultimate/flesh_final, - /datum/heretic_knowledge/summon/ashy, + /datum/heretic_knowledge/spell/apetra_vulnera, /datum/heretic_knowledge/spell/cleave, ) required_atoms = list( diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 3550e287b6a..30b330efe28 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -5,21 +5,22 @@ * * A Steward's Secret * Grasp of Lock - * > Sidepaths: - * Ashen Eyes - * Codex Cicatrix * Key Keeper’s Burden - * + * > Sidepaths: + * Mindgate * Concierge's Rite * Mark Of Lock * Ritual of Knowledge * Burglar's Finesse * > Sidepaths: - * Apetra Vulnera * Opening Blast + * Unfathomable Curio + * Unsealed arts * * Opening Blade * Caretaker’s Last Refuge + * > Sidepaths: + * Apetra Vulnera * * Unlock the Labyrinth */ @@ -45,11 +46,7 @@ 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." - next_knowledge = list( - /datum/heretic_knowledge/key_ring, - /datum/heretic_knowledge/medallion, - /datum/heretic_knowledge/codex_cicatrix, - ) + next_knowledge = list(/datum/heretic_knowledge/key_ring) cost = 1 route = PATH_LOCK @@ -105,22 +102,10 @@ /obj/item/card/id = 1, ) result_atoms = list(/obj/item/card/id/advanced/heretic) - next_knowledge = list(/datum/heretic_knowledge/limited_amount/concierge_rite) - cost = 1 - route = PATH_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 - name = "Concierge's Rite" - desc = "Allows you to transmute a white 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." - gain_text = "The Concierge scribbled my name into the Handbook. \"Welcome to your new home, fellow Steward.\"" - required_atoms = list( - /obj/item/toy/crayon/white = 1, - /obj/item/stack/sheet/mineral/wood = 1, - /obj/item/multitool = 1, + next_knowledge = list( + /datum/heretic_knowledge/mark/lock_mark, + /datum/heretic_knowledge/spell/mind_gate, ) - result_atoms = list(/obj/item/heretic_labyrinth_handbook) - next_knowledge = list(/datum/heretic_knowledge/mark/lock_mark) cost = 1 route = PATH_LOCK @@ -135,7 +120,22 @@ mark_type = /datum/status_effect/eldritch/lock /datum/heretic_knowledge/knowledge_ritual/lock + next_knowledge = list(/datum/heretic_knowledge/limited_amount/concierge_rite) + route = PATH_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 + name = "Concierge's Rite" + desc = "Allows you to transmute a white 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." + gain_text = "The Concierge scribbled my name into the Handbook. \"Welcome to your new home, fellow Steward.\"" + required_atoms = list( + /obj/item/toy/crayon/white = 1, + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/multitool = 1, + ) + result_atoms = list(/obj/item/heretic_labyrinth_handbook) next_knowledge = list(/datum/heretic_knowledge/spell/burglar_finesse) + cost = 1 route = PATH_LOCK /datum/heretic_knowledge/spell/burglar_finesse @@ -144,9 +144,11 @@ that puts a random item from the victims backpack into your hand." gain_text = "Consorting with Burglar spirits is frowned upon, but a Steward will always want to learn about new doors." next_knowledge = list( - /datum/heretic_knowledge/spell/apetra_vulnera, /datum/heretic_knowledge/spell/opening_blast, + /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/blade_upgrade/flesh/lock, + /datum/heretic_knowledge/unfathomable_curio, + /datum/heretic_knowledge/painting, ) spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse cost = 2 @@ -171,7 +173,10 @@ While in refuge, you cannot use your hands or spells, and you are immune to slowdown. \ 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." - next_knowledge = list(/datum/heretic_knowledge/ultimate/lock_final) + next_knowledge = list( + /datum/heretic_knowledge/ultimate/lock_final, + /datum/heretic_knowledge/spell/apetra_vulnera, + ) route = PATH_LOCK spell_to_add = /datum/action/cooldown/spell/caretaker cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm new file mode 100644 index 00000000000..a4c5bc57dfd --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -0,0 +1,280 @@ +/** + * # The path of Moon. + * + * Goes as follows: + * + * Moonlight Troupe + * Grasp of Lunacy + * Smile of the moon + * > Sidepaths: + * Mind Gate + * Ashen Eyes + * + * Mark of Moon + * Ritual of Knowledge + * Lunar Parade + * Moonlight Amulette + * > Sidepaths: + * Curse of Paralasys + * Unfathomable Curio + * Unsealed Arts + * + * Moonlight blade + * Ringleaders Rise + * > Sidepaths: + * Ashen Ritual + * + * Last Act + */ +/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. \ + You can only create two at a time." + gain_text = "Under the light of the moon the laughter echoes." + next_knowledge = list(/datum/heretic_knowledge/moon_grasp) + required_atoms = list( + /obj/item/knife = 1, + /obj/item/stack/sheet/iron = 2, + ) + result_atoms = list(/obj/item/melee/sickly_blade/moon) + route = PATH_MOON + +/datum/heretic_knowledge/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + add_traits(user ,TRAIT_EMPATH, REF(src)) + +/datum/heretic_knowledge/moon_grasp + name = "Grasp of Lunacy" + desc = "Your Mansus Grasp will cause them to hallucinate everyone as lunar mass, \ + and hides your identity for a short dur ation." + gain_text = "The troupe on the side of the moon showed me truth, and I took it." + next_knowledge = list(/datum/heretic_knowledge/spell/moon_smile) + cost = 1 + route = PATH_MOON + +/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 + source.apply_status_effect(/datum/status_effect/moon_grasp_hide) + + if(!iscarbon(target)) + return + var/mob/living/carbon/carbon_target = target + to_chat(carbon_target, span_danger("You hear echoing laughter from above")) + carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") + carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-20) + +/datum/heretic_knowledge/spell/moon_smile + name = "Smile of the moon" + desc = "Grants you Smile of the moon, a ranged spell muting, blinding and deafening 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." + next_knowledge = list( + /datum/heretic_knowledge/mark/moon_mark, + /datum/heretic_knowledge/medallion, + /datum/heretic_knowledge/spell/mind_gate, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/moon_smile + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/mark/moon_mark + name = "Mark of Moon" + desc = "Your Mansus Grasp now applies the Mark of Moon. The mark is triggered from an attack with your Moon Blade. \ + When triggered, the victim is confused, and when the mark is applied they are pacified \ + until attacked." + 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." + next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/moon) + route = PATH_MOON + mark_type = /datum/status_effect/eldritch/moon + +/datum/heretic_knowledge/mark/moon_mark/trigger_mark(mob/living/source, mob/living/target) + . = ..() + if(!.) + return + + // Also refunds 75% of charge! + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = locate() in source.actions + if(grasp) + grasp.next_use_time = min(round(grasp.next_use_time - grasp.cooldown_time * 0.75, 0), 0) + grasp.build_all_button_icons() + +/datum/heretic_knowledge/knowledge_ritual/moon + next_knowledge = list(/datum/heretic_knowledge/spell/moon_parade) + route = PATH_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" + next_knowledge = list( + /datum/heretic_knowledge/moon_amulette, + /datum/heretic_knowledge/reroll_targets, + /datum/heretic_knowledge/unfathomable_curio, + /datum/heretic_knowledge/curse/paralysis, + /datum/heretic_knowledge/painting, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade + cost = 1 + route = PATH_MOON + + +/datum/heretic_knowledge/moon_amulette + name = "Moonlight Amulette" + desc = "Allows you to transmute 2 sheets of glass, a pair of eyes, a brain and a tie \ + if the item is used on someone with low sanity they go berserk attacking everyone \ + , if their sanity isnt low enough it decreases their mood." + gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." + next_knowledge = list(/datum/heretic_knowledge/blade_upgrade/moon) + required_atoms = list( + /obj/item/organ/internal/eyes = 1, + /obj/item/organ/internal/heart = 1, + /obj/item/stack/sheet/glass = 2, + /obj/item/clothing/neck/tie = 1, + ) + result_atoms = list(/obj/item/clothing/neck/heretic_focus/moon_amulette) + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/blade_upgrade/moon + name = "Moonlight Blade" + desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage." + gain_text = "His wit was sharp as a blade, cutting through the lie to bring us joy." + next_knowledge = list(/datum/heretic_knowledge/spell/moon_ringleader) + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/blade_upgrade/moon/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + if(source == target) + 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.set_sanity(target.mob_mood.sanity - 10) + +/datum/heretic_knowledge/spell/moon_ringleader + name = "Ringleaders Rise" + desc = "Grants you Ringleaders Rise, an aoe spell that deals more brain damage the lower the sanity of everyone in the AoE,\ + causes hallucinations with those who have less sanity getting more. \ + If their sanity is low enough turns them insane, the spell then halves their sanity." + gain_text = "I grabbed his hand and we rose, those who saw the truth rose with us. \ + The ringleader pointed up and the dim light of truth illuminated us further." + next_knowledge = list( + /datum/heretic_knowledge/ultimate/moon_final, + /datum/heretic_knowledge/summon/ashy, + ) + spell_to_add = /datum/action/cooldown/spell/aoe/moon_ringleader + cost = 1 + route = PATH_MOON + +/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. \ + 1/5th of the crew will turn into acolytes and follow your command, they will all recieve moonlight amulettes." + 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 \ + WITNESS MY ASCENSION, THE MOON SMILES ONCE MORE AND FOREVER MORE IT SHALL!" + route = PATH_MOON + +/datum/heretic_knowledge/ultimate/moon_final/is_valid_sacrifice(mob/living/sacrifice) + + var/brain_damage = sacrifice.get_organ_loss(ORGAN_SLOT_BRAIN) + // Checks if our target has enough brain damage + if(brain_damage < 50) + return FALSE + + return ..() + +/datum/heretic_knowledge/ultimate/moon_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + priority_announce("[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ + The truth shall finally devour the lie! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) + + user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) + ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) + + RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + + // Roughly 1/5th of the station will rise up as lunatics to the heretic + for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list) + // How many lunatics we have + var/amount_of_lunatics = 0 + // Where the crewmate is, used to check their z-level + var/turf/crewmate_turf = get_turf(crewmate) + var/crewmate_z = crewmate_turf?.z + if(isnull(crewmate.mind)) + continue + if(crewmate.stat != CONSCIOUS) + continue + if(!is_station_level(crewmate_z)) + continue + // 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_TRAIT(crewmate, TRAIT_MINDSHIELD) || crewmate.can_block_magic(MAGIC_RESISTANCE)) + to_chat(crewmate, span_boldwarning("You feel shielded from something." )) + continue + if(amount_of_lunatics > length(GLOB.human_list) * 0.2) + 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_amulette/amulet = new(crewmate_turf) + var/static/list/slots = list( + "neck" = ITEM_SLOT_NECK, + "hands" = ITEM_SLOT_HANDS, + "backpack" = ITEM_SLOT_BACKPACK, + "right pocket" = ITEM_SLOT_RPOCKET, + "left pocket" = ITEM_SLOT_RPOCKET, + ) + crewmate.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) + crewmate.emote("laugh") + amount_of_lunatics += 1 + +/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)) + var/carbon_sanity = carbon_view.mob_mood.sanity + if(carbon_view.stat != CONSCIOUS) + continue + if(IS_HERETIC_OR_MONSTER(carbon_view)) + continue + carbon_view.adjust_confusion(2 SECONDS) + carbon_view.mob_mood.set_sanity(carbon_sanity - 5) + 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) + 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) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 6817dc9de44..8d577b1992a 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -161,10 +161,7 @@ Anyone overtop the wall will be throw aside (or upwards) and sustain damage." 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." - next_knowledge = list( - /datum/heretic_knowledge/spell/area_conversion, - /datum/heretic_knowledge/rifle, - ) + next_knowledge = list(/datum/heretic_knowledge/spell/area_conversion) spell_to_add = /datum/action/cooldown/spell/pointed/rust_construction cost = 1 route = PATH_RUST @@ -179,6 +176,7 @@ /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/curse/corrosion, /datum/heretic_knowledge/crucible, + /datum/heretic_knowledge/rifle, ) spell_to_add = /datum/action/cooldown/spell/aoe/rust_conversion cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm similarity index 95% rename from code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm rename to code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index bf840d6ed27..0e55ffa58ea 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -6,7 +6,7 @@ gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." next_knowledge = list( /datum/heretic_knowledge/spell/ash_passage, - /datum/heretic_knowledge/limited_amount/flesh_ghoul, + /datum/heretic_knowledge/spell/moon_smile, ) required_atoms = list( /obj/item/organ/internal/eyes = 1, @@ -25,7 +25,7 @@ gain_text = "The flesh of humanity is weak. Make them bleed. Show them their fragility." next_knowledge = list( /datum/heretic_knowledge/mad_mask, - /datum/heretic_knowledge/summon/raw_prophet, + /datum/heretic_knowledge/moon_amulette, ) required_atoms = list( /obj/item/bodypart/leg/left = 1, @@ -64,7 +64,7 @@ gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." next_knowledge = list( /datum/heretic_knowledge/summon/stalker, - /datum/heretic_knowledge/spell/flame_birth, + /datum/heretic_knowledge/spell/moon_ringleader, ) required_atoms = list( /obj/effect/decal/cleanable/ash = 1, diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index d7dfd75a144..e8c14d16abe 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -46,8 +46,8 @@ gain_text = "I met an old man in an anique 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." next_knowledge = list( - /datum/heretic_knowledge/spell/realignment, - /datum/heretic_knowledge/spell/rust_construction, + /datum/heretic_knowledge/duel_stance, + /datum/heretic_knowledge/spell/area_conversion, /datum/heretic_knowledge/rifle_ammo, ) required_atoms = list( diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm index 97218ce5e94..e2825c6db28 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm @@ -1,4 +1,16 @@ // 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." + gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." + next_knowledge = list( + /datum/heretic_knowledge/summon/raw_prophet, + /datum/heretic_knowledge/spell/burglar_finesse, + ) + spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation + cost = 1 + route = PATH_SIDE /datum/heretic_knowledge/spell/apetra_vulnera name = "Apetra Vulnera" @@ -7,22 +19,9 @@ 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." next_knowledge = list( - /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/void_cloak, + /datum/heretic_knowledge/summon/stalker, + /datum/heretic_knowledge/spell/caretaker_refuge, ) spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera cost = 1 route = PATH_SIDE - -/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." - gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." - next_knowledge = list( - /datum/heretic_knowledge/summon/ashy, - /datum/heretic_knowledge/void_cloak, - ) - spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation - cost = 1 - route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm new file mode 100644 index 00000000000..f24c4126eea --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -0,0 +1,100 @@ +// Sidepaths for knowledge between Knock and Moon. + +/datum/heretic_knowledge/spell/mind_gate + name = "Mind Gate" + desc = "Grants you Mind Gate, a spell \ + which deals you 20 brain damage but the target suffers a hallucination,\ + is left confused for 10 seconds, suffers oxygen loss and brain damage." + gain_text = "My mind swings open like a gate, and its insight will let me percieve the truth." + next_knowledge = list( + /datum/heretic_knowledge/key_ring, + /datum/heretic_knowledge/spell/moon_smile, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/mind_gate + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/unfathomable_curio + name = "Unfathomable Curio" + desc = "Allows you to transmute 3 rods, a brain and a belt into an Unfathomable Curio\ + , a belt that can hold blades and items for rituals. Whilst worn will also \ + veil you, allowing you to take 5 hits without suffering damage, this veil will recharge very slowly \ + outside of combat. When examined the examiner will suffer brain damage and blindness." + gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." + next_knowledge = list( + /datum/heretic_knowledge/spell/burglar_finesse, + /datum/heretic_knowledge/spell/moon_parade, + ) + required_atoms = list( + /obj/item/organ/internal/lungs = 1, + /obj/item/stack/rods = 3, + /obj/item/storage/belt = 1, + ) + result_atoms = list(/obj/item/storage/belt/unfathomable_curio) + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/painting + name = "Unsealed Arts" + desc = "Allows you to transmute a canvas and an additional item to create a piece of art, these paintings \ + have different effects depending on the additional item added. Possible paintings: \ + The sister and He Who Wept: Eyes. When a non-heretic looks at the painting they will begin to hallucinate everyone as heretics. \ + The First Desire: Any bodypart. Increases the hunger of non-heretics, when examined drops an organ or body part at your feet. \ + Great chaparral over rolling hills: Any grown food. Spreads kudzu when placed, when examined grants a flower. \ + Lady out of gates: Gloves. Causes non-heretics to scratch themselves, when examined removes all your mutations. \ + Climb over the rusted mountain: Trash. Causes non-heretics to rust the floor they walk on. \ + These effects are mitigated for a few minutes when a non-heretic suffering an effect examines the painting that caused the effect." + gain_text = "A wind of inspiration blows through me, past the walls and past the gate inspirations lie, yet to be depicted. \ + They yearn for mortal eyes again, and I shall grant that wish." + next_knowledge = list( + /datum/heretic_knowledge/spell/burglar_finesse, + /datum/heretic_knowledge/spell/moon_parade, + ) + required_atoms = list(/obj/item/canvas = 1) + result_atoms = list(/obj/item/canvas) + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + if(locate(/obj/item/organ/internal/eyes) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/weeping) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/organ/internal/eyes = 1, + ) + return TRUE + + if(locate(/obj/item/bodypart) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/desire) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/bodypart = 1, + ) + return TRUE + + if(locate(/obj/item/food/grown) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/vines) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/food/grown = 1, + ) + return TRUE + + if(locate(/obj/item/clothing/gloves) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/beauty) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/clothing/gloves = 1, + ) + return TRUE + + if(locate(/obj/item/trash) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/rust) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/trash = 1, + ) + return TRUE + + user.balloon_alert(user, "no additional atom present!") + return FALSE diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index eb766392290..f1b5f7f55ea 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -237,6 +237,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) cost = 1 route = PATH_START priority = MAX_KNOWLEDGE_PRIORITY - 3 // Least priority out of the starting knowledges, as it's an optional boon. + var/static/list/non_mob_bindings = typecacheof(list(/obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide)) /datum/heretic_knowledge/codex_cicatrix/parse_required_item(atom/item_path, number_of_things) if(item_path == /obj/item/pen) @@ -248,12 +249,16 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) if(!.) return FALSE - for(var/mob/living/body in atoms) - if(body.stat != DEAD) - continue - - selected_atoms += body - return TRUE + for(var/thingy in atoms) + if(is_type_in_typecache(thingy, non_mob_bindings)) + selected_atoms += thingy + return TRUE + else if(isliving(thingy)) + var/mob/living/body = thingy + if(body.stat != DEAD) + continue + selected_atoms += body + return TRUE return FALSE /datum/heretic_knowledge/codex_cicatrix/cleanup_atoms(list/selected_atoms) diff --git a/code/modules/antagonists/heretic/magic/lunatic_track.dm b/code/modules/antagonists/heretic/magic/lunatic_track.dm new file mode 100644 index 00000000000..ae41e77aabe --- /dev/null +++ b/code/modules/antagonists/heretic/magic/lunatic_track.dm @@ -0,0 +1,92 @@ +/datum/action/cooldown/lunatic_track + name = "Moonlight Echo" + desc = "Track your ringleader." + check_flags = AB_CHECK_CONSCIOUS + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_smile" + cooldown_time = 4 SECONDS + +/datum/action/cooldown/lunatic_track/Grant(mob/granted) + if(!IS_LUNATIC(granted)) + return + return ..() + +/datum/action/cooldown/lunatic_track/Activate(atom/target) + var/datum/antagonist/lunatic/lunatic_datum = IS_LUNATIC(owner) + var/mob/living/carbon/human/ascended_heretic = lunatic_datum.ascended_body + if(!(ascended_heretic)) + owner.balloon_alert(owner, "what cruel fate, your master is gone...") + StartCooldown(1 SECONDS) + return FALSE + playsound(owner, 'sound/effects/singlebeat.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + owner.balloon_alert(owner, get_balloon_message(ascended_heretic)) + + if(ascended_heretic.stat == DEAD) + to_chat(owner, span_hierophant("[ascended_heretic] is dead. Weep for the lie has struck out.")) + + StartCooldown() + return TRUE + + +/// Gets the balloon message for the heretic we are tracking. +/datum/action/cooldown/lunatic_track/proc/get_balloon_message(mob/living/carbon/human/tracked_mob) + var/balloon_message = generate_balloon_message(tracked_mob) + if(tracked_mob.stat == DEAD) + balloon_message = "they're dead, " + balloon_message + + return balloon_message + +/// Create the text for the balloon message +/datum/action/cooldown/lunatic_track/proc/generate_balloon_message(mob/living/carbon/human/tracked_mob) + var/balloon_message = "error text!" + var/turf/their_turf = get_turf(tracked_mob) + var/turf/our_turf = get_turf(owner) + var/their_z = their_turf?.z + var/our_z = our_turf?.z + + var/dist = get_dist(our_turf, their_turf) + var/dir = get_dir(our_turf, their_turf) + + switch(dist) + if(0 to 15) + balloon_message = "very near, [dir2text(dir)]!" + if(16 to 31) + balloon_message = "near, [dir2text(dir)]!" + if(32 to 127) + balloon_message = "far, [dir2text(dir)]!" + else + balloon_message = "very far!" + + // Early returns here if we don't need to tell them the z-levels + if(our_z == their_z) + return balloon_message + + if(is_mining_level(their_z)) + balloon_message = "on lavaland!" + return balloon_message + + if(is_away_level(their_z) || is_secret_level(their_z)) + balloon_message = "beyond the gateway!" + return balloon_message + + // We already checked if they are on lavaland or gateway, so if they arent there or on the station we can early return + if(!is_station_level(their_z)) + balloon_message = "on another plane!" + return balloon_message + + // They must be on station because we have checked every other z-level, and since we arent on station we should go there + if(!is_station_level(our_z)) + balloon_message = "on station!" + return balloon_message + + if(our_z > their_z) + balloon_message = "below you!" + return balloon_message + + if(our_z < their_z) + balloon_message = "above you!" + return balloon_message + + return balloon_message diff --git a/code/modules/antagonists/heretic/magic/madness_touch.dm b/code/modules/antagonists/heretic/magic/madness_touch.dm index 06db9f2464e..a5d075f3a14 100644 --- a/code/modules/antagonists/heretic/magic/madness_touch.dm +++ b/code/modules/antagonists/heretic/magic/madness_touch.dm @@ -1,7 +1,7 @@ -// Currently unused. +// Currently unused /datum/action/cooldown/spell/touch/mad_touch name = "Touch of Madness" - desc = "A touch spell that drains your enemy's sanity." + desc = "A touch spell that drains your enemy's sanity and knocks them down." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index dce84b93053..4ba6aceb200 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -21,7 +21,7 @@ return TRUE // This baby can hit anything /datum/action/cooldown/spell/touch/mansus_grasp/can_cast_spell(feedback = TRUE) - return ..() && !!IS_HERETIC(owner) + return ..() && (!!IS_HERETIC(owner) || !!IS_LUNATIC(owner)) /datum/action/cooldown/spell/touch/mansus_grasp/on_antimagic_triggered(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) victim.visible_message( diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm new file mode 100644 index 00000000000..eaf9e08b969 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -0,0 +1,39 @@ +/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." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "mind_gate" + + sound = 'sound/magic/curse.ogg' + school = SCHOOL_FORBIDDEN + cooldown_time = 20 SECONDS + + invocation = "Op' 'oY 'Mi'd" + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + cast_range = 6 + + active_msg = "You prepare to open your mind..." + +/datum/action/cooldown/spell/pointed/mind_gate/can_cast_spell(feedback = TRUE) + return ..() && isliving(owner) + +/datum/action/cooldown/spell/pointed/mind_gate/is_valid_target(atom/cast_on) + return ..() && ishuman(cast_on) + +/datum/action/cooldown/spell/pointed/mind_gate/cast(mob/living/carbon/human/cast_on, mob/living/carbon/human/owner) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("Your mind feels closed.")) + to_chat(owner, span_warning("Their mind doesn't swing open, but neither does yours.")) + return FALSE + + 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) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm new file mode 100644 index 00000000000..409e55bf926 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -0,0 +1,107 @@ +/datum/action/cooldown/spell/pointed/projectile/moon_parade + name = "Lunar parade" + desc = "This unleashes the parade towards a target." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_parade" + ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' + + sound = 'sound/magic/cosmic_energy.ogg' + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + + invocation = "L'N'R P'RAD" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + active_msg = "You prepare to make them join the parade!" + deactive_msg = "You stop the music and halt the parade... for now." + cast_range = 12 + projectile_type = /obj/projectile/moon_parade + + +/obj/projectile/moon_parade + name = "Lunar parade" + icon_state = "lunar_parade" + damage = 0 + damage_type = BURN + speed = 1 + range = 75 + ricochets_max = 40 + ricochet_chance = 500 + ricochet_incidence_leeway = 0 + pixel_speed_multiplier = 0.2 + projectile_piercing = PASSMOB|PASSVEHICLE + ///looping sound datum for our projectile. + var/datum/looping_sound/moon_parade/soundloop + // A list of the people we hit + var/list/mobs_hit = list() + +/obj/projectile/moon_parade/Initialize(mapload) + . = ..() + soundloop = new(src, TRUE) + +/obj/projectile/moon_parade/prehit_pierce(atom/A) + if(!isliving(firer) || !isliving(A)) + return ..() + + var/mob/living/caster = firer + var/mob/living/victim = A + + if(caster == victim) + return PROJECTILE_PIERCE_PHASE + + if(!caster.mind) + return PROJECTILE_PIERCE_HIT + + var/datum/antagonist/heretic_monster/monster = victim.mind?.has_antag_datum(/datum/antagonist/heretic_monster) + if(monster?.master == caster.mind) + return PROJECTILE_PIERCE_PHASE + + var/datum/antagonist/lunatic/lunatic = victim.mind?.has_antag_datum(/datum/antagonist/lunatic) + if(lunatic?.ascended_heretic == caster.mind) + return PROJECTILE_PIERCE_PHASE + + // Anti-magic destroys the projectile for consistency and counterplay + if(victim.can_block_magic(MAGIC_RESISTANCE)) + visible_message(span_warning("The parade hits [victim] and a sudden wave of clarity comes over you!")) + return PROJECTILE_DELETE_WITHOUT_HITTING + + return ..() + +/obj/projectile/moon_parade/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() + if(. == BULLET_ACT_BLOCK || !isliving(target)) + return + + 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 + + victim.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) + victim.cause_hallucination(/datum/hallucination/delusion/preset/moon, name) + victim.mob_mood.set_sanity(victim.mob_mood.sanity - 20) + +/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 + 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 new file mode 100644 index 00000000000..af753bba92f --- /dev/null +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -0,0 +1,63 @@ +/datum/action/cooldown/spell/aoe/moon_ringleader + name = "Ringleaders Rise" + desc = "Big AoE spell that deals more brain damage the lower the sanity of everyone in the AoE and it also causes hallucinations with those who have less sanity getting more. \ + If their sanity is low enough they snap and go insane, the spell then halves their sanity." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_ringleader" + sound = 'sound/effects/moon_parade.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 1 MINUTES + + invocation = "R''S 'E" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + aoe_radius = 5 + /// Effect for when the spell triggers + var/obj/effect/moon_effect = /obj/effect/temp_visual/moon_ringleader + +/datum/action/cooldown/spell/aoe/moon_ringleader/cast(mob/living/caster) + new moon_effect(get_turf(caster)) + return ..() + +/datum/action/cooldown/spell/aoe/moon_ringleader/get_things_to_cast_on(atom/center, radius_override) + var/list/stuff = list() + var/list/o_range = orange(center, radius_override || aoe_radius) - list(owner, center) + 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(nearby_mob.can_block_magic(antimagic_flags)) + continue + + stuff += nearby_mob + + 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 + + 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.set_sanity(victim_sanity * 0.5) + +/obj/effect/temp_visual/moon_ringleader + icon = 'icons/effects/eldritch.dmi' + icon_state = "ring_leader_effect" + alpha = 180 + duration = 6 + +/obj/effect/temp_visual/moon_ringleader/Initialize(mapload) + . = ..() + transform = transform.Scale(10) diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm new file mode 100644 index 00000000000..75aba2c2ced --- /dev/null +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -0,0 +1,49 @@ +/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 confusing a single target." + 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/magic/blind.ogg' + school = SCHOOL_FORBIDDEN + cooldown_time = 20 SECONDS + + invocation = "Mo'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/moon_smile_duration = (150 - cast_on.mob_mood.sanity) / 10 + 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/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 SECONDS) + cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) + + var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) + ears?.adjustEarDamage(0, moon_smile_duration) + + cast_on.adjust_silence(moon_smile_duration SECONDS) + cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) + //Lowers sanity + cast_on.mob_mood.set_sanity(cast_on.mob_mood.sanity - 20) + return TRUE diff --git a/code/modules/antagonists/heretic/moon_lunatic.dm b/code/modules/antagonists/heretic/moon_lunatic.dm new file mode 100644 index 00000000000..cc6a304e074 --- /dev/null +++ b/code/modules/antagonists/heretic/moon_lunatic.dm @@ -0,0 +1,58 @@ +// A type of antagonist created by the moon ascension +/datum/antagonist/lunatic + name = "\improper Lunatic" + hijack_speed = 0 + antagpanel_category = ANTAG_GROUP_HORRORS + show_in_antagpanel = FALSE + suicide_cry = "PRAISE THE RINGLEADER!!" + antag_moodlet = /datum/mood_event/heretics/lunatic + can_assign_self_objectives = FALSE + hardcore_random_bonus = FALSE + // The mind of the ascended heretic who created us + var/datum/mind/ascended_heretic + // The body of the ascended heretic who created us + var/mob/living/carbon/human/ascended_body + +/// Runs when the moon heretic creates us, used to give the lunatic a master +/datum/antagonist/lunatic/proc/set_master(datum/mind/heretic_master, mob/living/carbon/human/heretic_body) + src.ascended_heretic = heretic_master + src.ascended_body = heretic_body + + var/datum/objective/lunatic/lunatic_obj = new() + lunatic_obj.master = heretic_master + lunatic_obj.update_explanation_text() + objectives += lunatic_obj + + to_chat(owner, span_boldnotice("Ruin the lie, save the truth through obeying [heretic_master] the ringleader!")) + +/datum/antagonist/lunatic/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/effects/moon_parade.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + return ..() + +/datum/antagonist/lunatic/apply_innate_effects(mob/living/mob_override) + var/mob/living/our_mob = mob_override || owner.current + handle_clown_mutation(our_mob, "Ancient knowledge from the moon has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + our_mob.faction |= FACTION_HERETIC + + var/datum/action/cooldown/lunatic_track/moon_track = new /datum/action/cooldown/lunatic_track() + var/datum/action/cooldown/spell/touch/mansus_grasp/mad_touch = new /datum/action/cooldown/spell/touch/mansus_grasp() + mad_touch.Grant(our_mob) + moon_track.Grant(our_mob) + +/datum/antagonist/lunatic/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 + +// Mood event given to moon acolytes +/datum/mood_event/heretics/lunatic + description = "THE TRUTH REVEALED, THE LIE SLAIN." + mood_change = 10 + +/datum/objective/lunatic + explanation_text = "Assist your ringleader. If you are seeing this, scroll up in chat for who that is and report this" + var/datum/mind/master + +/datum/objective/lunatic/update_explanation_text() + . = ..() + explanation_text = "Assist your ringleader [master]" diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 4a5941fe55c..607f485ff64 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -237,6 +237,7 @@ addtimer(CALLBACK(src, PROC_REF(create_blade)), blade_recharge_time) + /datum/status_effect/caretaker_refuge id = "Caretaker’s Last Refuge" status_type = STATUS_EFFECT_REFRESH @@ -292,3 +293,22 @@ /datum/status_effect/caretaker_refuge/proc/prevent_cuff(datum/source, mob/attemptee) SIGNAL_HANDLER return COMSIG_CARBON_CUFF_PREVENT + +// Path Of Moon status effect which hides the identity of the heretic +/datum/status_effect/moon_grasp_hide + id = "Moon Grasp Hide Identity" + status_type = STATUS_EFFECT_REFRESH + duration = 15 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/moon_grasp_hide + +/datum/status_effect/moon_grasp_hide/on_apply() + owner.add_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + return TRUE + +/datum/status_effect/moon_grasp_hide/on_remove() + owner.remove_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + +/atom/movable/screen/alert/status_effect/moon_grasp_hide + name = "Blessing of The Moon" + desc = "The Moon clouds their vision, as the sun always has yours." + icon_state = "moon_hide" diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index c286c7b5092..7fffc4a5706 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -214,3 +214,82 @@ /datum/status_effect/heretic_lastresort/on_remove() REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) owner.AdjustUnconscious(20 SECONDS, ignore_canstun = TRUE) + + + +/// Used by moon heretics to make people mad +/datum/status_effect/moon_converted + id = "moon converted" + alert_type = /atom/movable/screen/alert/status_effect/moon_converted + duration = -1 + status_type = STATUS_EFFECT_REPLACE + ///used to track damage + var/damage_sustained = 0 + ///overlay used to indicate that someone is marked + var/mutable_appearance/moon_insanity_overlay + /// icon file for the overlay + var/effect_icon = 'icons/effects/eldritch.dmi' + /// icon state for the overlay + var/effect_icon_state = "moon_insanity_overlay" + +/atom/movable/screen/alert/status_effect/moon_converted + name = "Moon Converted" + desc = "THEY LIE, THEY ALL LIE!!! SLAY THEM!!! BURN THEM!!! MAKE THEM SEE THE TRUTH!!!" + icon_state = "lastresort" + +/datum/status_effect/moon_converted/on_creation() + . = ..() + moon_insanity_overlay = mutable_appearance(effect_icon, effect_icon_state, ABOVE_MOB_LAYER) + +/datum/status_effect/moon_converted/Destroy() + QDEL_NULL(moon_insanity_overlay) + return ..() + +/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.adjustFireLoss(-150 + owner.mob_mood.sanity) + + to_chat(owner, span_warning(("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) + ADD_TRAIT(owner, TRAIT_MUTE, REF(src)) + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) + owner.update_appearance(UPDATE_OVERLAYS) + owner.cause_hallucination(/datum/hallucination/delusion/preset/moon, "[id] status effect", duration = duration, affects_us = FALSE, affects_others = TRUE) + return TRUE + +/datum/status_effect/moon_converted/proc/on_damaged(datum/source, damage, damagetype) + SIGNAL_HANDLER + + // Stamina damage is funky so we will ignore it + if(damagetype == STAMINA) + return + + damage_sustained += damage + + if (damage_sustained < 75) + return + qdel(src) + +/datum/status_effect/moon_converted/proc/update_owner_overlay(atom/source, list/overlays) + SIGNAL_HANDLER + overlays += moon_insanity_overlay + +/datum/status_effect/moon_converted/on_remove() + // Span warning and unconscious so they realize they aren't evil anymore + to_chat(owner, span_warning("Your mind is cleared from the effect of the manus, your alligiences are as they were before")) + REMOVE_TRAIT(owner, TRAIT_MUTE, REF(src)) + owner.AdjustUnconscious(5 SECONDS, ignore_canstun = FALSE) + owner.log_message("[owner] is no longer insane.", LOG_GAME) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + owner.update_appearance(UPDATE_OVERLAYS) + return ..() + + +/atom/movable/screen/alert/status_effect/moon_converted + name = "Moon Converted" + desc = "They LIE, SLAY ALL OF THE THEM!!! THE LIARS OF THE SUN MUST FALL!!!" + icon_state = "moon_insanity" diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 4cdc29288c4..c8d2a04e64a 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -260,3 +260,48 @@ /datum/status_effect/eldritch/lock/on_remove() REMOVE_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT) return ..() + +// MARK OF MOON + +/datum/status_effect/eldritch/moon + effect_icon_state = "emark8" + ///Used for checking if the pacifism effect should end early + var/damage_sustained = 0 + +/datum/status_effect/eldritch/moon/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_PACIFISM, 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)) + return TRUE + +/// Checks for damage so the heretic can't just attack them with another weapon whilst they are unable to fight back +/datum/status_effect/eldritch/moon/proc/on_damaged(datum/source, damage, damagetype) + SIGNAL_HANDLER + + // The grasp itself deals stamina damage so we will ignore it + if(damagetype == STAMINA) + return + + damage_sustained += damage + + if(damage_sustained < 15) + return + + // Removes the trait in here since we don't wanna destroy the mark before its detonated or allow detonation triggers with other weapons + REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) + owner.balloon_alert(owner, "you feel able to once again strike!") + +/datum/status_effect/eldritch/moon/on_effect() + owner.adjust_confusion(30 SECONDS) + owner.emote(pick("giggle", "laugh")) + owner.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) + return ..() + +/datum/status_effect/eldritch/moon/on_remove() + . = ..() + UnregisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE) + + // Incase the trait was not removed earlier + REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) diff --git a/code/modules/antagonists/heretic/transmutation_rune.dm b/code/modules/antagonists/heretic/transmutation_rune.dm index 92f5334a076..8d5f08db749 100644 --- a/code/modules/antagonists/heretic/transmutation_rune.dm +++ b/code/modules/antagonists/heretic/transmutation_rune.dm @@ -120,7 +120,6 @@ if(length(banned_atom_types)) if(nearby_atom.type in banned_atom_types) continue - // This item is a valid type. Add it to our selected atoms list. selected_atoms |= nearby_atom // If it's a stack, we gotta see if it has more than one inside, @@ -182,6 +181,7 @@ // - If the ritual was success (Returned TRUE), proceede to clean up the atoms involved in the ritual. The result has already been spawned by this point. // - If the ritual failed for some reason (Returned FALSE), likely due to no ghosts taking a role or an error, we shouldn't clean up anything, and reset. var/ritual_result = ritual.on_finished_recipe(user, selected_atoms, loc) + if(ritual_result) ritual.cleanup_atoms(selected_atoms) @@ -204,8 +204,9 @@ /obj/effect/heretic_rune/big icon = 'icons/effects/96x96.dmi' icon_state = "transmutation_rune" - pixel_x = -33 //So the big ol' 96x96 sprite shows up right - pixel_y = -32 + pixel_x = -30 + pixel_y = 18 + pixel_z = -48 greyscale_config = /datum/greyscale_config/heretic_rune /obj/effect/heretic_rune/big/Initialize(mapload, path_colour) @@ -217,8 +218,9 @@ duration = 30 SECONDS icon = 'icons/effects/96x96.dmi' icon_state = "transmutation_rune" - pixel_x = -33 - pixel_y = -32 + pixel_x = -30 + pixel_y = 18 + pixel_z = -48 plane = GAME_PLANE layer = SIGIL_LAYER greyscale_config = /datum/greyscale_config/heretic_rune diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 530f39bea62..965b95ca6e8 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -18,6 +18,10 @@ hitsound = 'sound/weapons/bladeslice.ogg' wound_bonus = -30 bare_wound_bonus = 20 + ///If this is true, our next hit will be critcal, temporarily stunning our target + var/has_crit = FALSE + ///The timer which controls our next crit + var/crit_timer /obj/item/light_eater/Initialize(mapload) . = ..() @@ -27,3 +31,55 @@ effectiveness = 70, \ ) AddComponent(/datum/component/light_eater) + +/obj/item/light_eater/equipped(mob/user, slot, initial = FALSE) + . = ..() + if(!user?.mind?.has_antag_datum(/datum/antagonist/nightmare)) + return + RegisterSignal(user, COMSIG_MOB_ENTER_JAUNT, PROC_REF(prepare_crit_timer)) + RegisterSignal(user, COMSIG_MOB_AFTER_EXIT_JAUNT, PROC_REF(stop_crit_timer)) + +/obj/item/light_eater/dropped(mob/user, silent = FALSE) + . = ..() + if(!user?.mind?.has_antag_datum(/datum/antagonist/nightmare)) + return + UnregisterSignal(user, COMSIG_MOB_ENTER_JAUNT) + UnregisterSignal(user, COMSIG_MOB_AFTER_EXIT_JAUNT) + remove_crit() + +/obj/item/light_eater/attack(mob/living/target, mob/living/user, params) + . = ..() + if(!has_crit) + return + playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100, TRUE) + var/datum/dna/target_dna = target.has_dna() + if(target.stat == DEAD) + user.visible_message(span_warning("[user] gores [target] with [src]!"), span_warning("You gore [target] with [src], which doesn't accomplish much, but it does make you feel a little better.")) + else if(!target_dna?.check_mutation(/datum/mutation/human/hulk) && (iscarbon(target) || issilicon(target))) + user.visible_message(span_boldwarning("[user] gores [target] with [src], bringing them to a halt!"), span_userdanger("You gore [target] with [src], bringing them to a halt!")) + target.Paralyze(issilicon(target) ? 2 SECONDS : 1 SECONDS) + else + user.visible_message(span_boldwarning("[user] gores [target] with [src], ripping into them!"), span_userdanger("You gore [target] with [src], ripping into them!")) + target.apply_damage(damage = force, forced = TRUE) + remove_crit() + +/obj/item/light_eater/proc/prepare_crit_timer() + crit_timer = addtimer(CALLBACK(src, PROC_REF(add_crit)), 15 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) + +/obj/item/light_eater/proc/stop_crit_timer() + deltimer(crit_timer) + +/obj/item/light_eater/proc/add_crit() + if(has_crit) + return + has_crit = TRUE + add_filter("crit_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5)) + if(ismob(loc)) + loc.balloon_alert(loc, "critical strike ready") + +/obj/item/light_eater/proc/remove_crit() + if(!has_crit) + return + has_crit = FALSE + remove_filter("crit_glow") + stop_crit_timer() diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 68fe9b24778..3ed178e2413 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -92,20 +92,21 @@ add_team_hud(mob_override || owner.current, /datum/antagonist/nukeop) /datum/antagonist/nukeop/proc/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/syndicate) - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == NUKE_CODE_UNSET) - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - for(var/obj/machinery/nuclearbomb/beer/beernuke as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/beer)) - beernuke.r_code = nuke_team.memorized_code - else - stack_trace("Syndicate nuke not found during nuke team creation.") - nuke_team.memorized_code = null + if(!nuke_team || nuke_team.tracked_nuke) + return + nuke_team.memorized_code = random_nukecode() + var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/syndicate) + if(!nuke) + stack_trace("Syndicate nuke not found during nuke team creation.") + nuke_team.memorized_code = null + return + nuke_team.tracked_nuke = nuke + if(nuke.r_code == NUKE_CODE_UNSET) + nuke.r_code = nuke_team.memorized_code + else //Already set by admins/something else? + nuke_team.memorized_code = nuke.r_code + for(var/obj/machinery/nuclearbomb/beer/beernuke as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb/beer)) + beernuke.r_code = nuke_team.memorized_code /datum/antagonist/nukeop/proc/give_alias() if(nuke_team?.syndicate_name) @@ -596,7 +597,7 @@ break var/list/turf/options = list() - for(var/turf/open/open_turf in spawn_in?.get_contained_turfs()) + for(var/turf/open/open_turf in spawn_in?.get_turfs_from_all_zlevels()) if(open_turf.is_blocked_turf()) continue options += open_turf diff --git a/code/modules/antagonists/pirate/pirate_event.dm b/code/modules/antagonists/pirate/pirate_event.dm index bcee6f15675..f3c6655a275 100644 --- a/code/modules/antagonists/pirate/pirate_event.dm +++ b/code/modules/antagonists/pirate/pirate_event.dm @@ -15,7 +15,7 @@ map_flags = EVENT_SPACE_ONLY /datum/round_event_control/pirates/preRunEvent() - if (!SSmapping.is_planetary()) + if (SSmapping.is_planetary()) return EVENT_CANT_RUN return ..() @@ -81,8 +81,8 @@ if(!ship.load(T)) CRASH("Loading pirate ship failed!") - for(var/turf/A in ship.get_affected_turfs(T)) - for(var/obj/effect/mob_spawn/ghost_role/human/pirate/spawner in A) + for(var/turf/area_turf as anything in ship.get_affected_turfs(T)) + for(var/obj/effect/mob_spawn/ghost_role/human/pirate/spawner in area_turf) if(candidates.len > 0) var/mob/our_candidate = candidates[1] var/mob/spawned_mob = spawner.create_from_ghost(our_candidate) diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 3696b4ba976..84f3a151dd2 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -18,18 +18,17 @@ update_appearance() /obj/machinery/shuttle_scrambler/process() - if(active) - if(is_station_level(z)) - var/datum/bank_account/account = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(account) - var/siphoned = min(account.account_balance,siphon_per_tick) - account.adjust_money(-siphoned) - credits_stored += siphoned - interrupt_research() - else - return - else - STOP_PROCESSING(SSobj,src) + if(!active) + return PROCESS_KILL + + if(!is_station_level(z)) + return + + var/datum/bank_account/account = SSeconomy.get_dep_account(ACCOUNT_CAR) + var/siphoned = min(account.account_balance,siphon_per_tick) + account.adjust_money(-siphoned) + credits_stored += siphoned + interrupt_research() ///Turns on the siphoning, and its various side effects /obj/machinery/shuttle_scrambler/proc/toggle_on(mob/user) diff --git a/code/modules/antagonists/revenant/haunted_item.dm b/code/modules/antagonists/revenant/haunted_item.dm index 30116d6802b..642002976cb 100644 --- a/code/modules/antagonists/revenant/haunted_item.dm +++ b/code/modules/antagonists/revenant/haunted_item.dm @@ -113,8 +113,7 @@ */ /proc/haunt_outburst(epicenter, range, haunt_chance, duration = 1 MINUTES) - var/effect_area = range(range, epicenter) - for(var/obj/item/object_to_possess in effect_area) + for(var/obj/item/object_to_possess in range(range, epicenter)) if(!prob(haunt_chance)) continue object_to_possess.AddComponent(/datum/component/haunted_item, \ diff --git a/code/modules/antagonists/traitor/contractor/contract_teammate.dm b/code/modules/antagonists/traitor/contractor/contract_teammate.dm index 1aebd9fb951..54fc958c1f8 100644 --- a/code/modules/antagonists/traitor/contractor/contract_teammate.dm +++ b/code/modules/antagonists/traitor/contractor/contract_teammate.dm @@ -1,35 +1,8 @@ -///Spawns a contractor partner to a spawning user, with a given key to assign to the new player. -/proc/spawn_contractor_partner(mob/living/user, key) - var/mob/living/carbon/human/partner = new() - var/datum/outfit/contractor_partner/partner_outfit = new() - - partner_outfit.equip(partner) - - var/obj/structure/closet/supplypod/arrival_pod = new(null, STYLE_SYNDICATE) - arrival_pod.explosionSize = list(0,0,0,1) - arrival_pod.bluespace = TRUE - - var/turf/free_location = find_obstruction_free_location(2, user) - - // We really want to send them - if we can't find a nice location just land it on top of them. - if (!free_location) - free_location = get_turf(user) - - partner.forceMove(arrival_pod) - partner.ckey = key - - /// We give a reference to the mind that'll be the support unit - var/datum/antagonist/traitor/contractor_support/new_datum = partner.mind.add_antag_datum(/datum/antagonist/traitor/contractor_support) - - to_chat(partner, "\n[span_alertwarning("[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.")]") - to_chat(partner, "[span_alertwarning("Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.")]") - - new /obj/effect/pod_landingzone(free_location, arrival_pod) - return new_datum - /// Support unit gets it's own very basic antag datum for admin logging. /datum/antagonist/traitor/contractor_support name = "Contractor Support Unit" + job_rank = ROLE_CONTRACTOR_SUPPORT + employer = "Contractor Support Unit" show_in_roundend = FALSE give_objectives = TRUE give_uplink = FALSE diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index 3f7370031da..6af7a8d81d5 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -100,16 +100,15 @@ if(traitor_data.uplink_handler.contractor_hub.current_contract == src) traitor_data.uplink_handler.contractor_hub.current_contract = null - if(iscarbon(person_sent)) - for(var/obj/item/person_contents in person_sent.gather_belongings()) - if(ishuman(person_sent)) - var/mob/living/carbon/human/human_sent = person_sent - if(person_contents == human_sent.w_uniform) - continue //So all they're left with are shoes and uniform. - if(person_contents == human_sent.shoes) - continue - person_sent.transferItemToLoc(person_contents) - victim_belongings.Add(WEAKREF(person_contents)) + for(var/obj/item/person_contents as anything in person_sent.gather_belongings()) + if(ishuman(person_sent)) + var/mob/living/carbon/human/human_sent = person_sent + if(person_contents == human_sent.w_uniform) + continue //So all they're left with are shoes and uniform. + if(person_contents == human_sent.shoes) + continue + person_sent.transferItemToLoc(person_contents) + victim_belongings.Add(WEAKREF(person_contents)) var/obj/structure/closet/supplypod/extractionpod/pod = source // Handle the pod returning diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index d338abca641..ea88c7e4900 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -34,7 +34,7 @@ ///if TRUE, this traitor will always get hijacking as their final objective var/is_hijacker = FALSE - ///the name of the antag flavor this traitor has. + ///the name of the antag flavor this traitor has, set in Traitor's setup if not preset. var/employer ///assoc list of strings set up after employer is given @@ -188,22 +188,23 @@ return ..() /datum/antagonist/traitor/proc/pick_employer() - var/faction = prob(75) ? FLAVOR_FACTION_SYNDICATE : FLAVOR_FACTION_NANOTRASEN - var/list/possible_employers = list() + if(!employer) + var/faction = prob(75) ? FLAVOR_FACTION_SYNDICATE : FLAVOR_FACTION_NANOTRASEN + var/list/possible_employers = list() - possible_employers.Add(GLOB.syndicate_employers, GLOB.nanotrasen_employers) + possible_employers.Add(GLOB.syndicate_employers, GLOB.nanotrasen_employers) - if(istype(ending_objective, /datum/objective/hijack)) - possible_employers -= GLOB.normal_employers - else //escape or martyrdom - possible_employers -= GLOB.hijack_employers + if(istype(ending_objective, /datum/objective/hijack)) + possible_employers -= GLOB.normal_employers + else //escape or martyrdom + possible_employers -= GLOB.hijack_employers - switch(faction) - if(FLAVOR_FACTION_SYNDICATE) - possible_employers -= GLOB.nanotrasen_employers - if(FLAVOR_FACTION_NANOTRASEN) - possible_employers -= GLOB.syndicate_employers - employer = pick(possible_employers) + switch(faction) + if(FLAVOR_FACTION_SYNDICATE) + possible_employers -= GLOB.nanotrasen_employers + if(FLAVOR_FACTION_NANOTRASEN) + possible_employers -= GLOB.syndicate_employers + employer = pick(possible_employers) traitor_flavor = strings(TRAITOR_FLAVOR_FILE, employer) /// Generates a complete set of traitor objectives up to the traitor objective limit, including non-generic objectives such as martyr and hijack. @@ -308,6 +309,7 @@ data["allies"] = traitor_flavor["allies"] data["goal"] = traitor_flavor["goal"] data["has_uplink"] = uplink ? TRUE : FALSE + data["given_uplink"] = give_uplink if(uplink) data["uplink_intro"] = traitor_flavor["uplink"] data["uplink_unlock_info"] = uplink.unlock_text diff --git a/code/modules/antagonists/traitor/objectives/assassination.dm b/code/modules/antagonists/traitor/objectives/assassination.dm index 9fae7ed3352..5d5cdbd1981 100644 --- a/code/modules/antagonists/traitor/objectives/assassination.dm +++ b/code/modules/antagonists/traitor/objectives/assassination.dm @@ -2,14 +2,8 @@ name = "Assassination/Kidnap" objectives = list( list( - list( - /datum/traitor_objective/target_player/assassinate/calling_card = 1, - /datum/traitor_objective/target_player/assassinate/behead = 1, - ) = 1, - list( - /datum/traitor_objective/target_player/assassinate/calling_card/heads_of_staff = 1, - /datum/traitor_objective/target_player/assassinate/behead/heads_of_staff = 1, - ) = 1, + /datum/traitor_objective/target_player/assassinate/calling_card = 1, + /datum/traitor_objective/target_player/assassinate/calling_card/heads_of_staff = 1, ) = 1, list( list( @@ -58,24 +52,6 @@ heads_of_staff = TRUE -/datum/traitor_objective/target_player/assassinate/behead - name = "Behead %TARGET%, the %JOB TITLE%" - description = "Behead and hold %TARGET%'s head to succeed this objective. If the head gets destroyed before you can do this, you will fail this objective." - progression_reward = 2 MINUTES - telecrystal_reward = list(1, 2) - - ///the body who needs to hold the head - var/mob/living/needs_to_hold_head - ///the head that needs to be picked up - var/obj/item/bodypart/head/behead_goal - -/datum/traitor_objective/target_player/assassinate/behead/heads_of_staff - progression_reward = 4 MINUTES - telecrystal_reward = list(2, 3) - - heads_of_staff = TRUE - - /datum/traitor_objective/target_player/assassinate/calling_card/generate_ui_buttons(mob/user) var/list/buttons = list() if(!card) @@ -117,47 +93,6 @@ //you cannot plant anything on someone who is gone gone, so even if this happens after you're still liable to fail fail_objective(penalty_cost = telecrystal_penalty) -/datum/traitor_objective/target_player/assassinate/behead/special_target_filter(list/possible_targets) - for(var/datum/mind/possible_target as anything in possible_targets) - var/mob/living/carbon/possible_current = possible_target.current - var/obj/item/bodypart/head/behead_goal = possible_current.get_bodypart(BODY_ZONE_HEAD) - if(!behead_goal) - possible_targets -= possible_target //cannot be beheaded without a head - -/datum/traitor_objective/target_player/assassinate/behead/generate_objective(datum/mind/generating_for, list/possible_duplicates) - . = ..() - if(!.) //didn't generate - return FALSE - AddComponent(/datum/component/traitor_objective_register, behead_goal, fail_signals = list(COMSIG_QDELETING)) - RegisterSignal(target, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_target_dismembered)) - -/datum/traitor_objective/target_player/assassinate/behead/ungenerate_objective() - UnregisterSignal(target, COMSIG_CARBON_REMOVE_LIMB) - . = ..() //this unsets target - if(behead_goal) - UnregisterSignal(behead_goal, COMSIG_ITEM_PICKUP) - behead_goal = null - -/datum/traitor_objective/target_player/assassinate/behead/proc/on_head_pickup(datum/source, mob/taker) - SIGNAL_HANDLER - if(objective_state == OBJECTIVE_STATE_INACTIVE) //just in case- this shouldn't happen? - fail_objective() - return - if(taker == handler.owner.current) - taker.visible_message(span_notice("[taker] holds [behead_goal] into the air for a moment."), span_boldnotice("You lift [behead_goal] into the air for a moment.")) - succeed_objective() - -/datum/traitor_objective/target_player/assassinate/behead/proc/on_target_dismembered(datum/source, obj/item/bodypart/head/lost_head, special, dismembered) - SIGNAL_HANDLER - if(!istype(lost_head)) - return - if(objective_state == OBJECTIVE_STATE_INACTIVE) - //no longer can be beheaded - fail_objective() - else - behead_goal = lost_head - RegisterSignal(behead_goal, COMSIG_ITEM_PICKUP, PROC_REF(on_head_pickup)) - /datum/traitor_objective/target_player/assassinate/New(datum/uplink_handler/handler) . = ..() AddComponent(/datum/component/traitor_objective_limit_per_time, \ diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index 732230f9248..73a3fc3b3f0 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -274,22 +274,13 @@ if(!sent_mob || QDELETED(sent_mob)) //suicided and qdeleted themselves return - var/list/possible_turfs = list() - for(var/turf/open/open_turf in dropoff_area) - if(open_turf.is_blocked_turf() || isspaceturf(open_turf)) - continue - possible_turfs += open_turf - - if(!LAZYLEN(possible_turfs)) - var/turf/new_turf = get_safe_random_station_turf() - if(!new_turf) //SOMEHOW - to_chat(sent_mob, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Seems where you got sent here from won't \ - be able to handle our pod... You will die here instead.\"
"))) - if (sent_mob.can_heartattack()) - sent_mob.set_heartattack(TRUE) - return - - possible_turfs += new_turf + var/turf/return_turf = get_safe_random_station_turf() + if(!return_turf) //SOMEHOW + to_chat(sent_mob, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Seems where you got sent here from won't \ + be able to handle our pod... You will die here instead.\""))) + if (sent_mob.can_heartattack()) + sent_mob.set_heartattack(TRUE) + return var/obj/structure/closet/supplypod/return_pod = new() return_pod.bluespace = TRUE @@ -316,4 +307,4 @@ sent_mob.set_eye_blur_if_lower(100 SECONDS) sent_mob.dna.species.give_important_for_life(sent_mob) // so plasmamen do not get left for dead - new /obj/effect/pod_landingzone(pick(possible_turfs), return_pod) + new /obj/effect/pod_landingzone(return_turf, return_pod) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 4783daffb8b..44d00f3c170 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -60,6 +60,7 @@ spawn_amt_left-- if(spawn_amt_left <= 0) qdel(src) + return PROCESS_KILL /obj/effect/rend/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/nullrod)) diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm b/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm index 7dc514f2e18..1ceb21b72eb 100644 --- a/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm +++ b/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm @@ -28,7 +28,7 @@ return var/time_remaining_desc = "" if (minimum_time >= world.time - SSticker.round_start_time) - time_remaining_desc = "This ritual will be available to begin invoking in [DisplayTimeText(minimum_time - world.time - SSticker.round_start_time)]" + time_remaining_desc = " This ritual will be available to begin invoking in [DisplayTimeText(minimum_time - world.time - SSticker.round_start_time)]" var/datum/radial_menu_choice/choice = new() choice.name = name choice.image = image(icon = icon, icon_state = icon_state) diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm b/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm index b2e3329261f..98eb56fadac 100644 --- a/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm +++ b/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm @@ -39,8 +39,4 @@ addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator) /datum/grand_finale/midas/proc/transform_area(list/turfs) - for (var/turf/transform_turf as anything in turfs) - if (!chosen_theme.can_convert(transform_turf)) - continue - chosen_theme.apply_theme(transform_turf) - CHECK_TICK + chosen_theme.apply_theme_to_list_of_turfs(turfs) diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm b/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm index f3ac9b01071..a2f25863a4b 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_ritual.dm @@ -295,8 +295,9 @@ /obj/effect/temp_visual/wizard_rune icon = 'icons/effects/96x96.dmi' icon_state = null - pixel_x = -28 - pixel_y = -33 + pixel_x = -33 + pixel_y = 16 + pixel_z = -48 anchored = TRUE layer = SIGIL_LAYER plane = GAME_PLANE diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm index d1b01912ae9..f75da5f8557 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm @@ -15,8 +15,9 @@ desc = "A flowing circle of shapes and runes is etched into the floor, the lines twist and move before your eyes." icon = 'icons/effects/96x96.dmi' icon_state = "wizard_rune" - pixel_x = -28 - pixel_y = -33 + pixel_x = -33 + pixel_y = 16 + pixel_z = -48 anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm index 950390a7227..ffc2ea5d590 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm @@ -74,8 +74,7 @@ addtimer(CALLBACK(src, PROC_REF(staggered_transform), theme, range_turfs), (0.5 SECONDS) * iterator) /datum/grand_side_effect/transmogrify_area/proc/staggered_transform(datum/dimension_theme/theme, list/transform_turfs) - for (var/turf/target_turf as anything in transform_turfs) - theme.apply_theme(target_turf) + theme.apply_theme_to_list_of_turfs(transform_turfs) /// Minimum number of anomalies to create #define MIN_ANOMALIES_CREATED 1 @@ -110,7 +109,7 @@ if (can_create[create_path] == 0) continue can_create[create_path] = can_create[create_path] - 1 - new create_path(pick(anomaly_positions), new_lifespan = rand(150, 300), drops_core = FALSE) + new create_path(pick(anomaly_positions), /*new_lifespan = */rand(15 SECONDS, 30 SECONDS), /*drops_core = */FALSE) to_create-- #undef MIN_ANOMALIES_CREATED diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm deleted file mode 100644 index a40f3e3a659..00000000000 --- a/code/modules/assembly/bomb.dm +++ /dev/null @@ -1,155 +0,0 @@ -/obj/item/onetankbomb - name = "bomb" - icon = 'icons/obj/canisters.dmi' - inhand_icon_state = "assembly" - lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - throwforce = 5 - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 2 - throw_range = 4 - obj_flags = CONDUCTS_ELECTRICITY - var/status = FALSE //0 - not readied //1 - bomb finished with welder - var/obj/item/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device - var/obj/item/tank/bombtank = null //the second part of the bomb is a plasma tank - -/obj/item/onetankbomb/Destroy() - bombassembly = null - bombtank = null - return ..() - -/obj/item/onetankbomb/IsSpecialAssembly() - return TRUE - -/obj/item/onetankbomb/examine(mob/user) - return bombtank.examine(user) - -/obj/item/onetankbomb/update_icon(updates) - icon = bombtank?.icon || initial(icon) - return ..() - -/obj/item/onetankbomb/update_icon_state() - icon_state = bombtank?.icon_state || initial(icon_state) - return ..() - -/obj/item/onetankbomb/update_overlays() - . = ..() - if(bombassembly) - . += bombassembly.icon_state - . += bombassembly.overlays - . += "bomb_assembly" - -/obj/item/onetankbomb/wrench_act(mob/living/user, obj/item/I) - ..() - to_chat(user, span_notice("You disassemble [src]!")) - if(bombassembly) - bombassembly.forceMove(drop_location()) - bombassembly.master = null - bombassembly = null - if(bombtank) - bombtank.forceMove(drop_location()) - bombtank.master = null - bombtank = null - qdel(src) - return TRUE - -/obj/item/onetankbomb/welder_act(mob/living/user, obj/item/I) - ..() - . = FALSE - if(status) - to_chat(user, span_warning("[bombtank] already has a pressure hole!")) - return - if(!I.tool_start_check(user, amount=1)) - return - if(I.use_tool(src, user, 0, volume=40)) - status = TRUE - var/datum/gas_mixture/bomb_mix = bombtank.return_air() - log_bomber(user, "welded a single tank bomb,", src, "| Temp: [bomb_mix.temperature]") - to_chat(user, span_notice("A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.")) - add_fingerprint(user) - return TRUE - -/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly - bombassembly.attack_self(user, TRUE) - add_fingerprint(user) - return - -/obj/item/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. - audible_message(span_warning("[icon2html(src, hearers(src))] *beep* *beep* *beep*")) - playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - sleep(1 SECONDS) - if(QDELETED(src)) - return - if(status) - bombtank.ignite() //if its not a dud, boom (or not boom if you made shitty mix) the ignite proc is below, in this file - else - bombtank.release() - -/obj/item/onetankbomb/on_found(mob/finder) //for mousetraps - if(bombassembly) - bombassembly.on_found(finder) - -/obj/item/onetankbomb/attack_hand(mob/user, list/modifiers) //also for mousetraps - . = ..() - if(.) - return - if(bombassembly) - bombassembly.attack_hand() - -/obj/item/onetankbomb/Move() - . = ..() - if(bombassembly) - bombassembly.setDir(dir) - bombassembly.Move() - -/obj/item/onetankbomb/dropped() - . = ..() - if(bombassembly) - bombassembly.dropped() - - - - -// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ---------- - -//Bomb assembly proc. This turns assembly+tank into a bomb -/obj/item/tank/proc/bomb_assemble(obj/item/assembly_holder/assembly, mob/living/user) - //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it - var/igniter_count = 0 - for(var/obj/item/assembly/attached_assembly as anything in assembly.assemblies) - if(isigniter(attached_assembly)) - igniter_count += 1 - if(LAZYLEN(assembly.assemblies) == igniter_count) - return - - if((src in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src)) - to_chat(user, span_warning("[src] is stuck to you!")) - return - - if(!user.canUnEquip(assembly)) - to_chat(user, span_warning("[assembly] is stuck to your hand!")) - return - - var/obj/item/onetankbomb/bomb = new - user.transferItemToLoc(src, bomb) - user.transferItemToLoc(assembly, bomb) - - bomb.bombassembly = assembly //Tell the bomb about its assembly part - assembly.master = bomb //Tell the assembly about its new owner - assembly.on_attach() - - bomb.bombtank = src //Same for tank - master = bomb - - forceMove(bomb) - bomb.update_appearance() - - user.put_in_hands(bomb) //Equips the bomb if possible, or puts it on the floor. - to_chat(user, span_notice("You attach [assembly] to [src].")) - return - -/obj/item/onetankbomb/return_analyzable_air() - if(bombtank) - return bombtank.return_analyzable_air() - else - return null diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index e4518155153..6bb12f327ea 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -46,25 +46,30 @@ to_chat(user, span_notice("You toggle [src] to \"detect critical state\" mode.")) /obj/item/assembly/health/process() + //not ready yet if(!scanning || !secured) return - var/atom/A = src + //look for a mob in either our location or in the connected holder + var/atom/object = src if(connected?.holder) - A = connected.holder - for(A, A && !ismob(A), A=A.loc); - // like get_turf(), but for mobs. - var/mob/living/M = A + object = connected.holder + while(!ismob(object)) + object = object.loc + if(isnull(object)) //we went too far + return - if(M) - health_scan = M.health - if(health_scan <= alarm_health) - pulse() - audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*") - playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - toggle_scan() + //only do the pulse if we are within alarm thresholds + var/mob/living/target_mob = object + health_scan = target_mob.health + if(health_scan > alarm_health) return - return + + //do the pulse & the scan + pulse() + audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*") + playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + toggle_scan() /obj/item/assembly/health/proc/toggle_scan() if(!secured) diff --git a/code/modules/asset_cache/assets/tcomms.dm b/code/modules/asset_cache/assets/tcomms.dm new file mode 100644 index 00000000000..ecfdb4a498c --- /dev/null +++ b/code/modules/asset_cache/assets/tcomms.dm @@ -0,0 +1,12 @@ +/datum/asset/spritesheet/telecomms + name="tcomms" + +/datum/asset/spritesheet/telecomms/create_spritesheets() + var/list/inserted_states = list() // No need to send entire `telecomms.dmi`. + for(var/obj/machinery/telecomms/machine as anything in subtypesof(/obj/machinery/telecomms)) + var/icon_state = machine::icon_state + if(icon_state in inserted_states) + continue + + Insert(icon_state, machine::icon, icon_state) + inserted_states += icon_state diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 9a4623ef49a..a4910905049 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -4,28 +4,24 @@ /obj/machinery/atmospherics/components/binary/circulator name = "circulator/heat exchanger" desc = "A gas circulator pump and heat exchanger." - icon_state = "circ-off-0" - - var/active = FALSE - - var/last_pressure_delta = 0 + icon_state = "circ_base" pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - + vent_movement = VENTCRAWL_CAN_SEE density = TRUE - circuit = /obj/item/circuitboard/machine/circulator + var/active = FALSE + var/last_pressure_delta = 0 var/flipped = 0 + ///Which circulator mode we are on, the generator requires one of each to work. var/mode = CIRCULATOR_HOT - var/obj/machinery/power/generator/generator + ///The generator we are connected to. + var/obj/machinery/power/thermoelectric_generator/generator /obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/machinery/atmospherics/components/binary/circulator/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - //default cold circ for mappers /obj/machinery/atmospherics/components/binary/circulator/cold mode = CIRCULATOR_COLD @@ -49,50 +45,49 @@ return null //Calculate necessary moles to transfer using PV = nRT - if(air2.temperature>0) - var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 - - var/transfer_moles = (pressure_delta*air1.volume)/(air2.temperature * R_IDEAL_GAS_EQUATION) - - last_pressure_delta = pressure_delta - - //Actually transfer the gas - var/datum/gas_mixture/removed = air2.remove(transfer_moles) - - update_parents() - - return removed - - else + if(air2.temperature <= 0) last_pressure_delta = 0 + return + var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2 + var/transfer_moles = (pressure_delta*air1.volume)/(air2.temperature * R_IDEAL_GAS_EQUATION) + last_pressure_delta = pressure_delta + //Actually transfer the gas + var/datum/gas_mixture/removed = air2.remove(transfer_moles) + update_parents() + return removed /obj/machinery/atmospherics/components/binary/circulator/process_atmos() - ..() update_appearance() -/obj/machinery/atmospherics/components/binary/circulator/update_icon_state() - if(!is_operational) - icon_state = "circ-p-[flipped]" - return ..() - if(last_pressure_delta > 0) - if(last_pressure_delta > ONE_ATMOSPHERE) - icon_state = "circ-run-[flipped]" - else - icon_state = "circ-slow-[flipped]" - return ..() +/obj/machinery/atmospherics/components/binary/circulator/update_overlays() + . = ..() + cut_overlays() + if(anchored) + add_overlay("circ_anchor") + add_overlay("panel_[panel_open]") - icon_state = "circ-off-[flipped]" - return ..() + if(!is_operational) + add_overlay("fan_[mode]") + add_overlay("flow") + add_overlay("display") + return + + add_overlay("flow_on") + add_overlay("display_[mode]") + if(last_pressure_delta > 0) + add_overlay("fan_[mode]_[last_pressure_delta > ONE_ATMOSPHERE]") + else + add_overlay("fan_[mode]") /obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) if(!panel_open) + balloon_alert(user, "open the panel!") return set_anchored(!anchored) I.play_tool_sound(src) if(generator) disconnectFromGenerator() - to_chat(user, span_notice("You [anchored?"secure":"unsecure"] [src].")) - + balloon_alert(user, "[anchored ? "secure" : "unsecure"]") var/obj/machinery/atmospherics/node1 = nodes[1] var/obj/machinery/atmospherics/node2 = nodes[2] @@ -145,20 +140,22 @@ if(generator) disconnectFromGenerator() mode = !mode - to_chat(user, span_notice("You set [src] to [mode ? "cold" : "hot"] mode.")) + balloon_alert(user, "set to [mode ? "cold" : "hot"]") return TRUE /obj/machinery/atmospherics/components/binary/circulator/screwdriver_act(mob/user, obj/item/I) - if(..()) - return TRUE + if(!anchored) + balloon_alert(user, "anchor it down!") + return toggle_panel_open() I.play_tool_sound(src) - to_chat(user, span_notice("You [panel_open ? "open" : "close"] the panel on [src].")) + balloon_alert(user, "panel [panel_open ? "open" : "closed"]") return TRUE /obj/machinery/atmospherics/components/binary/circulator/crowbar_act(mob/user, obj/item/I) - default_deconstruction_crowbar(I) - return TRUE + if(default_deconstruction_crowbar(I)) + return TRUE + return ..() /obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() if(generator) @@ -176,19 +173,3 @@ ..() pixel_x = 0 pixel_y = 0 - -/obj/machinery/atmospherics/components/binary/circulator/verb/circulator_flip() - set name = "Flip" - set category = "Object" - set src in oview(1) - - if(!ishuman(usr)) - return - - if(anchored) - to_chat(usr, span_danger("[src] is anchored!")) - return - - flipped = !flipped - to_chat(usr, span_notice("You flip [src].")) - update_appearance() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index ab3d53adacf..8cc2105052f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -72,50 +72,37 @@ max_integrity = 350 armor_type = /datum/armor/unary_cryo_cell layer = MOB_LAYER - 0.2 //SKYRAT EDIT - Fixing the opacity of cryo cells - ORIGINAL: layer = MOB_LAYER - state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube occupant_typecache = list(/mob/living/carbon, /mob/living/simple_animal) processing_flags = NONE - + fair_market_price = 10 + payment_department = ACCOUNT_MED use_power = IDLE_POWER_USE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.75 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.5 flags_1 = PREVENT_CLICK_UNDER_1 + ///If TRUE will eject the mob once healing is complete var/autoeject = TRUE - var/volume = 100 - + ///Increased via upgraded parts, higher values will provide better healing and use smaller cryoxodane var/efficiency = 1 - var/sleep_factor = 0.00125 - var/unconscious_factor = 0.001 - /// Our approximation of a mob's heat capacity. + ///Our approximation of a mob's heat capacity. Higher tier parts will provide better cooling for mobs var/heat_capacity = 20000 + ///Works with heat capacity and is increased with higher tier parts. How quickly the mobs temperature changes in the chamber var/conduction_coefficient = 0.3 - + ///The beaker usually contains cryoxadone that is pumped into the mob var/obj/item/reagent_containers/cup/beaker = null - var/consume_gas = FALSE - + ///Inform medical about cryo status over this radio var/obj/item/radio/radio - var/radio_key = /obj/item/encryptionkey/headset_med - var/radio_channel = RADIO_CHANNEL_MEDICAL - /// Visual content - Occupant var/atom/movable/visual/cryo_occupant/occupant_vis - - var/message_cooldown ///Cryo will continue to treat people with 0 damage but existing wounds, but will sound off when damage healing is done in case doctors want to directly treat the wounds instead var/treating_wounds = FALSE - /// Cryo should notify doctors if the patient is dead, and eject them if autoeject is enabled - var/patient_dead = FALSE - fair_market_price = 10 - payment_department = ACCOUNT_MED - /// Reference to the datum connector we're using to interface with the pipe network var/datum/gas_machine_connector/internal_connector /// Check if the machine has been turned on var/on = FALSE - /datum/armor/unary_cryo_cell energy = 100 fire = 30 @@ -123,75 +110,39 @@ /obj/machinery/cryo_cell/Initialize(mapload) . = ..() - if(is_operational) - begin_processing() radio = new(src) - radio.keyslot = new radio_key + radio.keyslot = new /obj/item/encryptionkey/headset_med radio.subspace_transmission = TRUE radio.canhear_range = 0 radio.recalculateChannels() - occupant_vis = new(null, src) + occupant_vis = new(mapload, src) vis_contents += occupant_vis - register_context() internal_connector = new(loc, src, dir, CELL_VOLUME * 0.5) -/obj/machinery/cryo_cell/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - . = ..() - if(same_z_layer) - return - SET_PLANE(occupant_vis, PLANE_TO_TRUE(occupant_vis.plane), new_turf) - -/obj/machinery/cryo_cell/set_occupant(atom/movable/new_occupant) - . = ..() - update_appearance() - -/obj/machinery/cryo_cell/on_construction(mob/user) - ..(user, dir, dir) - -/obj/machinery/cryo_cell/RefreshParts() - . = ..() - var/C - for(var/datum/stock_part/matter_bin/M in component_parts) - C += M.tier - - efficiency = initial(efficiency) * C - sleep_factor = initial(sleep_factor) * C - unconscious_factor = initial(unconscious_factor) * C - heat_capacity = initial(heat_capacity) / C - conduction_coefficient = initial(conduction_coefficient) * C - -/obj/machinery/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better beaker, better results" - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Efficiency at [efficiency*100]%.") - -/obj/machinery/cryo_cell/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - context[SCREENTIP_CONTEXT_CTRL_LMB] = "Turn [on ? "off" : "on"]" - context[SCREENTIP_CONTEXT_ALT_LMB] = "[state_open ? "Close" : "Open"] door" - if(!held_item) - return CONTEXTUAL_SCREENTIP_SET - switch(held_item.tool_behaviour) - if(TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" - if(TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "Rotate" - return CONTEXTUAL_SCREENTIP_SET - + register_context() /obj/machinery/cryo_cell/Destroy() - vis_contents.Cut() + on = FALSE + vis_contents.Cut() QDEL_NULL(occupant_vis) QDEL_NULL(radio) QDEL_NULL(beaker) - QDEL_NULL(internal_connector) return ..() +/obj/machinery/cryo_cell/on_deconstruction() + if(occupant) + occupant.vis_flags &= ~VIS_INHERIT_PLANE + REMOVE_TRAIT(occupant, TRAIT_IMMOBILIZED, CRYO_TRAIT) + REMOVE_TRAIT(occupant, TRAIT_FORCED_STANDING, CRYO_TRAIT) + + if(beaker) + beaker.forceMove(drop_location()) + /obj/machinery/cryo_cell/contents_explosion(severity, target) . = ..() if(!beaker) @@ -205,28 +156,81 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/cryo_cell/Exited(atom/movable/gone, direction) +/obj/machinery/cryo_cell/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) . = ..() - if(gone == beaker) - beaker = null + if(same_z_layer) + return + SET_PLANE(occupant_vis, PLANE_TO_TRUE(occupant_vis.plane), new_turf) -/obj/machinery/cryo_cell/on_deconstruction() - if(occupant) - occupant.vis_flags &= ~VIS_INHERIT_PLANE - REMOVE_TRAIT(occupant, TRAIT_IMMOBILIZED, CRYO_TRAIT) - REMOVE_TRAIT(occupant, TRAIT_FORCED_STANDING, CRYO_TRAIT) +/obj/machinery/cryo_cell/set_occupant(atom/movable/new_occupant) + . = ..() + update_appearance() - if(beaker) - beaker.forceMove(drop_location()) - beaker = null +/obj/machinery/cryo_cell/RefreshParts() + . = ..() + var/C + for(var/datum/stock_part/matter_bin/M in component_parts) + C += M.tier -/obj/machinery/cryo_cell/update_icon_state() - icon_state = (state_open) ? "pod-open" : ((on && is_operational) ? "pod-on" : "pod-off") - return ..() + efficiency = initial(efficiency) * C + heat_capacity = initial(heat_capacity) / C + conduction_coefficient = initial(conduction_coefficient) * C + +/obj/machinery/cryo_cell/examine(mob/user) //this is leaving out everything but efficiency since they follow the same idea of "better beaker, better results" + . = ..() + if(in_range(user, src) || isobserver(user)) + . += span_notice("The status display reads: Efficiency at [efficiency * 100]%.") + if(occupant) + if(on) + . += span_notice("Someone's inside [src]!") + else + . += span_notice("You can barely make out a form floating in [src].") + else + . += span_notice("[src] seems empty.") + if(beaker) + . += span_notice("A beaker of [beaker.reagents.maximum_volume]u capacity is located inside.") + else + . += span_warning("Its missing a beaker.") + + . += span_notice("Use [EXAMINE_HINT("Alt-Click")] to [state_open ? "Close" : "Open"] the machine.") + . += span_notice("Use [EXAMINE_HINT("Ctrl-Click")] to turn [on ? "Off" : "On"] the machine.") + + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] open.") + if(panel_open) + . += span_notice("[src] can be [EXAMINE_HINT("pried")] apart.") + . += span_notice("[src] can be rotated with a [EXAMINE_HINT("wrench")].") + else if(machine_stat & NOPOWER) + . += span_notice("[src] can be [EXAMINE_HINT("pried")] open.") + +/obj/machinery/cryo_cell/add_context(atom/source, list/context, obj/item/held_item, mob/user) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Turn [on ? "off" : "on"]" + context[SCREENTIP_CONTEXT_ALT_LMB] = "[state_open ? "Close" : "Open"] door" + if(isnull(held_item)) + return CONTEXTUAL_SCREENTIP_SET + + if(QDELETED(beaker) && istype(held_item, /obj/item/reagent_containers/cup)) + context[SCREENTIP_CONTEXT_LMB] = "Insert beaker" + return CONTEXTUAL_SCREENTIP_SET + + switch(held_item.tool_behaviour) + if(TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" + if(TOOL_CROWBAR) + if(!state_open && !panel_open && !is_operational) + context[SCREENTIP_CONTEXT_LMB] = "Pry Open" + else if(panel_open) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + if(TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Rotate" : ""]" + return CONTEXTUAL_SCREENTIP_SET /obj/machinery/cryo_cell/update_icon() - . = ..() SET_PLANE_IMPLICIT(src, initial(plane)) + return ..() + +/obj/machinery/cryo_cell/update_icon_state() + icon_state = state_open ? "pod-open" : ((on && is_operational) ? "pod-on" : "pod-off") + return ..() /obj/machinery/cryo_cell/update_overlays() . = ..() @@ -234,117 +238,133 @@ . += "pod-panel" if(state_open) return - if(on && is_operational) - . += mutable_appearance('icons/obj/medical/cryogenics.dmi', "cover-on", ABOVE_ALL_MOB_LAYER, src, plane = ABOVE_GAME_PLANE) - else - . += mutable_appearance('icons/obj/medical/cryogenics.dmi', "cover-off", ABOVE_ALL_MOB_LAYER, src, plane = ABOVE_GAME_PLANE) + . += mutable_appearance('icons/obj/medical/cryogenics.dmi', "cover-[on && is_operational ? "on" : "off"]", ABOVE_ALL_MOB_LAYER, src, plane = ABOVE_GAME_PLANE) -/obj/machinery/cryo_cell/nap_violation(mob/violator) - open_machine() +/obj/machinery/cryo_cell/dump_inventory_contents(list/subset = list(occupant)) + //only drop the mob and nothing else by default when opening the machine + return ..(subset) +/obj/machinery/cryo_cell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) + beaker = null +/** + * Turns the machine on/off + * + * Arguments + * * active - TRUE to turn the machine on, FALSE to turn it off + */ /obj/machinery/cryo_cell/proc/set_on(active) + PRIVATE_PROC(TRUE) + if(on == active) return + SEND_SIGNAL(src, COMSIG_CRYO_SET_ON, active) . = on on = active - if(on) - update_use_power(ACTIVE_POWER_USE) - else - update_use_power(IDLE_POWER_USE) update_appearance() -/obj/machinery/cryo_cell/on_set_is_operational(old_value) - if(old_value) //Turned off - set_on(FALSE) - end_processing() - else //Turned on + update_use_power(on ? ACTIVE_POWER_USE : IDLE_POWER_USE) + if(on) //Turned on begin_processing() + else //Turned off + end_processing() +/obj/machinery/cryo_cell/begin_processing() + . = ..() + SSair.start_processing_machine(src) + +/obj/machinery/cryo_cell/end_processing() + . = ..() + SSair.stop_processing_machine(src) + +/obj/machinery/cryo_cell/on_set_is_operational(old_value) + //Turned off + if(old_value) + set_on(FALSE) /obj/machinery/cryo_cell/process(seconds_per_tick) - ..() - if(!occupant) - return + if(!on || QDELETED(occupant)) + //somehow an deleting mob is inside us. dump everything out + if(!isnull(occupant) && QDELING(occupant)) + open_machine() + on = FALSE //in case panel was open we need to set to FALSE explicitly - if(!on) - // Should turn on if set to auto - if(autoeject) - set_on(TRUE) - else - return + //if not on end processing + if(!on) + set_on(FALSE) //this explicitly disables processing so is nessassary + . = PROCESS_KILL + + return var/mob/living/mob_occupant = occupant if(mob_occupant.on_fire) mob_occupant.extinguish_mob() - if(!check_nap_violations()) - return if(mob_occupant.stat == DEAD) // Notify doctors and potentially eject if the patient is dead set_on(FALSE) var/msg = "Patient is deceased." if(autoeject) // Eject if configured. msg += " Auto ejecting patient now." open_machine() - // Only need to tell them once - if(!patient_dead) - playsound(src, 'sound/machines/cryo_warning.ogg', volume) - patient_dead = TRUE - radio.talk_into(src, msg, radio_channel) - return + playsound(src, 'sound/machines/cryo_warning.ogg', 100) + radio.talk_into(src, msg, RADIO_CHANNEL_MEDICAL) + return PROCESS_KILL - patient_dead = FALSE - - if(mob_occupant.get_organic_health() >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people. + // Don't bother with fully healed people. + if(mob_occupant.get_organic_health() >= mob_occupant.getMaxHealth()) if(iscarbon(mob_occupant)) var/mob/living/carbon/C = mob_occupant if(C.all_wounds) if(!treating_wounds) // if we have wounds and haven't already alerted the doctors we're only dealing with the wounds, let them know treating_wounds = TRUE - playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. - var/msg = "Patient vitals fully recovered, continuing automated wound treatment." - radio.talk_into(src, msg, radio_channel) + playsound(src, 'sound/machines/cryo_warning.ogg', 100) // Bug the doctors. + radio.talk_into(src, "Patient vitals fully recovered, continuing automated wound treatment.", RADIO_CHANNEL_MEDICAL) else // otherwise if we were only treating wounds and now we don't have any, turn off treating_wounds so we can boot 'em out treating_wounds = FALSE if(!treating_wounds) set_on(FALSE) - playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. + playsound(src, 'sound/machines/cryo_warning.ogg', 100) // Bug the doctors. var/msg = "Patient fully restored." if(autoeject) // Eject if configured. msg += " Auto ejecting patient now." open_machine() - radio.talk_into(src, msg, radio_channel) - return + radio.talk_into(src, msg, RADIO_CHANNEL_MEDICAL) + return PROCESS_KILL var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] - - if(air1.total_moles() > CRYO_MIN_GAS_MOLES) - if(beaker) - beaker.reagents.trans_to( - occupant, - (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * seconds_per_tick, - efficiency * CRYO_MULTIPLY_FACTOR, - methods = VAPOR - ) - consume_gas = TRUE - return TRUE + if(!QDELETED(beaker) && air1.total_moles() > CRYO_MIN_GAS_MOLES) + beaker.reagents.trans_to( + occupant, + (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * seconds_per_tick, + efficiency * CRYO_MULTIPLY_FACTOR, + methods = VAPOR + ) /obj/machinery/cryo_cell/process_atmos() - ..() - if(!on) - return + return PROCESS_KILL var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] - if(!internal_connector.gas_connector.nodes[1] || !internal_connector.gas_connector.airs[1] || !air1.gases.len || air1.total_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. - var/msg = "Insufficient cryogenic gas, shutting down." - radio.talk_into(src, msg, radio_channel) + //check for workable conditions + if(!internal_connector.gas_connector.nodes[1] || !air1 || !air1.gases.len || air1.total_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. set_on(FALSE) - return + var/msg = "Insufficient cryogenic gas, shutting down." + if(autoeject) // Eject if configured. + msg += " Auto ejecting patient now." + open_machine() + radio.talk_into(src, msg, RADIO_CHANNEL_MEDICAL) + return PROCESS_KILL - if(occupant) + //take damage from high temperatures + if(air1.temperature > 2000) + take_damage(clamp((air1.temperature) / 200, 10, 20), BURN) + + //adjust temperature of mob + if(!QDELETED(occupant)) var/mob/living/mob_occupant = occupant var/cold_protection = 0 var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant. @@ -355,7 +375,6 @@ if(abs(temperature_delta) > 1) var/air_heat_capacity = air1.heat_capacity() - var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * CALCULATE_CONDUCTION_ENERGY(temperature_delta, heat_capacity, air_heat_capacity) mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB) @@ -366,48 +385,42 @@ var/mob/living/carbon/human/humi = mob_occupant humi.adjust_coretemperature(humi.bodytemperature - humi.coretemperature) - - air1.garbage_collect() - - if(air1.temperature > 2000) - take_damage(clamp((air1.temperature)/200, 10, 20), BURN) - - internal_connector.gas_connector.update_parents() + //spread temperature changes throughout the pipenet + internal_connector.gas_connector.update_parents() /obj/machinery/cryo_cell/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) - if(breath_request <= 0) return null + + //return breathable air var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] var/breath_percentage = breath_request / air1.volume - return air1.remove(air1.total_moles() * breath_percentage) + . = air1.remove(air1.total_moles() * breath_percentage) + + //update molar changes throughout the pipenet + internal_connector.gas_connector.update_parents() /obj/machinery/cryo_cell/assume_air(datum/gas_mixture/giver) internal_connector.gas_connector.airs[1].merge(giver) -/obj/machinery/cryo_cell/relaymove(mob/living/user, direction) - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) +/obj/machinery/cryo_cell/return_temperature() + var/datum/gas_mixture/internal_air = internal_connector.gas_connector.airs[1] -/obj/machinery/cryo_cell/open_machine(drop = FALSE, density_to_set = FALSE) + return internal_air.total_moles() > CRYO_MIN_GAS_MOLES ? internal_air.temperature : ..() + +/obj/machinery/cryo_cell/open_machine(drop = TRUE, density_to_set = FALSE) if(!state_open && !panel_open) set_on(FALSE) - for(var/mob/M in contents) //only drop mobs - M.forceMove(get_turf(src)) - set_occupant(null) flick("pod-open-anim", src) return ..() /obj/machinery/cryo_cell/close_machine(mob/living/carbon/user, density_to_set = TRUE) treating_wounds = FALSE - if((isnull(user) || istype(user)) && state_open && !panel_open) - if(loc == user?.loc) - to_chat(user, span_warning("You can't close [src] on yourself!")) - return + if(state_open && !panel_open) flick("pod-close-anim", src) - ..(user) - return occupant + . = ..() + if(!QDELETED(occupant)) //auto on if an occupant is inside + set_on(TRUE) /obj/machinery/cryo_cell/container_resist_act(mob/living/user) user.changeNext_move(CLICK_CD_BREAKOUT) @@ -422,16 +435,6 @@ span_notice("You successfully break out of [src]!")) open_machine() -/obj/machinery/cryo_cell/examine(mob/user) - . = ..() - if(occupant) - if(on) - . += "Someone's inside [src]!" - else - . += "You can barely make out a form floating in [src]." - else - . += "[src] seems empty." - /obj/machinery/cryo_cell/MouseDrop_T(mob/target, mob/user) if(user.incapacitated() || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) return @@ -445,25 +448,32 @@ close_machine(target) /obj/machinery/cryo_cell/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(on) + balloon_alert(user, "turn off!") + return + if(occupant) + balloon_alert(user, "occupant inside!") + return - if(!on && !occupant && !state_open && (default_deconstruction_screwdriver(user, "pod-off", "pod-off", tool))) + if(default_deconstruction_screwdriver(user, "pod-off", "pod-off", tool)) update_appearance() - else - to_chat(user, "You can't access the maintenance panel while the pod is " \ - + (on ? "active" : (occupant ? "full" : "open")) + "!") - return ITEM_INTERACT_SUCCESS - -/obj/machinery/cryo_cell/crowbar_act(mob/living/user, obj/item/tool) - if(on || state_open) - return FALSE - if(!panel_open) - balloon_alert(user, "open panel!") return ITEM_INTERACT_SUCCESS - var/unsafe_wrenching = FALSE - var/filled_pipe = FALSE - var/datum/gas_mixture/environment_air = loc.return_air() - var/datum/gas_mixture/inside_air = internal_connector.gas_connector.airs[1] +/obj/machinery/cryo_cell/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(on) + balloon_alert(user, "turn off!") + return + + var/can_crowbar = FALSE + if(!state_open && !panel_open && !is_operational) //can pry open + can_crowbar = TRUE + else if(panel_open) //can deconstruct + can_crowbar = TRUE + if(!can_crowbar) + return + var/obj/machinery/atmospherics/node = internal_connector.gas_connector.nodes[1] var/internal_pressure = 0 @@ -471,165 +481,180 @@ var/obj/machinery/atmospherics/components/unary/portables_connector/portable_devices_connector = node internal_pressure = !portable_devices_connector.connected_device ? 1 : 0 + var/datum/gas_mixture/inside_air = internal_connector.gas_connector.airs[1] if(inside_air.total_moles() > 0) - filled_pipe = TRUE if(!node || internal_pressure > 0) + var/datum/gas_mixture/environment_air = loc.return_air() internal_pressure = inside_air.return_pressure() - environment_air.return_pressure() - if(!filled_pipe) - default_deconstruction_crowbar(tool) - return ITEM_INTERACT_SUCCESS - - to_chat(user, span_notice("You begin to unfasten \the [src]...")) - + var/unsafe_release = FALSE if(internal_pressure > 2 * ONE_ATMOSPHERE) - to_chat(user, span_warning("As you begin deconstructing \the [src] a gush of air blows in your face... maybe you should reconsider?")) - unsafe_wrenching = TRUE + to_chat(user, span_warning("As you begin prying \the [src] a gush of air blows in your face... maybe you should reconsider?")) + if(!do_after(user, 2 SECONDS, target = src)) + return + unsafe_release = TRUE - if(!do_after(user, 2 SECONDS, src)) - return - if(unsafe_wrenching) + var/deconstruct = FALSE + if(!default_pry_open(tool)) + if(!default_deconstruction_crowbar(tool, custom_deconstruct = TRUE)) + return + else + deconstruct = TRUE + + if(unsafe_release) internal_connector.gas_connector.unsafe_pressure_release(user, internal_pressure) tool.play_tool_sound(src, 50) - deconstruct(TRUE) + if(deconstruct) + deconstruct(TRUE) return ITEM_INTERACT_SUCCESS /obj/machinery/cryo_cell/wrench_act(mob/living/user, obj/item/tool) - if(on || occupant || state_open) - return FALSE + . = ITEM_INTERACT_BLOCKING + if(on) + balloon_alert(user, "turn off!") + return + if(occupant) + balloon_alert(user, "occupant inside!") + return + if(state_open) + balloon_alert(user, "close first!") + return + if(default_change_direction_wrench(user, tool)) update_appearance() return ITEM_INTERACT_SUCCESS /obj/machinery/cryo_cell/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/cup)) - . = 1 //no afterattack + . = TRUE //no afterattack if(beaker) - to_chat(user, span_warning("A beaker is already loaded into [src]!")) + balloon_alert(user, "beaker present!") return if(!user.transferItemToLoc(I, src)) return beaker = I - user.visible_message(span_notice("[user] places [I] in [src]."), \ - span_notice("You place [I] in [src].")) + balloon_alert(user, "beaker inserted") var/reagentlist = pretty_string_from_reagent_list(I.reagents.reagent_list) user.log_message("added an [I] to cryo containing [reagentlist].", LOG_GAME) return + return ..() /obj/machinery/cryo_cell/ui_state(mob/user) return GLOB.notcontained_state - /obj/machinery/cryo_cell/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Cryo", name) ui.open() +/obj/machinery/cryo_cell/ui_static_data(mob/user) + . = list() + .["T0C"] = T0C + /obj/machinery/cryo_cell/ui_data() - var/list/data = list() - data["isOperating"] = on - data["hasOccupant"] = occupant ? TRUE : FALSE - data["isOpen"] = state_open - data["autoEject"] = autoeject + . = list() + .["isOperating"] = on + .["isOpen"] = state_open + .["autoEject"] = autoeject - data["occupant"] = list() - if(occupant) + var/list/occupant_data = null + if(!QDELETED(occupant)) var/mob/living/mob_occupant = occupant - data["occupant"]["name"] = mob_occupant.name + occupant_data = list() + + occupant_data["name"] = mob_occupant.name if(mob_occupant.stat == DEAD) - data["occupant"]["stat"] = "Dead" - data["occupant"]["statstate"] = "bad" + occupant_data["stat"] = "Dead" else if (HAS_TRAIT(mob_occupant, TRAIT_KNOCKEDOUT)) - data["occupant"]["stat"] = "Unconscious" - data["occupant"]["statstate"] = "good" + occupant_data["stat"] = "Unconscious" else - data["occupant"]["stat"] = "Conscious" - data["occupant"]["statstate"] = "bad" + occupant_data["stat"] = "Conscious" - data["occupant"]["bodyTemperature"] = round(mob_occupant.bodytemperature, 1) - if(mob_occupant.bodytemperature < T0C) // Green if the mob can actually be healed by cryoxadone. - data["occupant"]["temperaturestatus"] = "good" - else - data["occupant"]["temperaturestatus"] = "bad" + occupant_data["bodyTemperature"] = round(mob_occupant.bodytemperature, 1) - data["occupant"]["health"] = round(mob_occupant.health, 1) - data["occupant"]["maxHealth"] = mob_occupant.maxHealth - data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD - data["occupant"]["bruteLoss"] = round(mob_occupant.getBruteLoss(), 1) - data["occupant"]["oxyLoss"] = round(mob_occupant.getOxyLoss(), 1) - data["occupant"]["toxLoss"] = round(mob_occupant.getToxLoss(), 1) - data["occupant"]["fireLoss"] = round(mob_occupant.getFireLoss(), 1) + occupant_data["health"] = mob_occupant.health + occupant_data["maxHealth"] = mob_occupant.maxHealth + occupant_data["bruteLoss"] = mob_occupant.getBruteLoss() + occupant_data["oxyLoss"] = mob_occupant.getOxyLoss() + occupant_data["toxLoss"] = mob_occupant.getToxLoss() + occupant_data["fireLoss"] = mob_occupant.getFireLoss() + .["occupant"] = occupant_data var/datum/gas_mixture/air1 = internal_connector.gas_connector.airs[1] - data["cellTemperature"] = round(air1.temperature, 1) + .["cellTemperature"] = air1.temperature - data["isBeakerLoaded"] = beaker ? TRUE : FALSE - var/beakerContents = list() - if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) - for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents += list(list("name" = R.name, "volume" = R.volume)) - data["beakerContents"] = beakerContents - return data + var/list/beaker_data = null + if(!QDELETED(beaker)) + beaker_data = list() + beaker_data["maxVolume"] = beaker.volume + beaker_data["currentVolume"] = round(beaker.reagents.total_volume, 0.01) + var/list/beakerContents = list() + if(length(beaker.reagents.reagent_list)) + for(var/datum/reagent/reagent in beaker.reagents.reagent_list) + beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) // list in a list because Byond merges the first list... + beaker_data["contents"] = beakerContents + .["beaker"] = beaker_data -/obj/machinery/cryo_cell/ui_act(action, params) +/obj/machinery/cryo_cell/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + switch(action) if("power") if(on) set_on(FALSE) else if(!state_open) set_on(TRUE) - . = TRUE + return TRUE + if("door") - if(state_open) + if(state_open && get_turf(ui.user) != get_turf(src)) close_machine() else open_machine() - . = TRUE + return TRUE + if("autoeject") autoeject = !autoeject - . = TRUE - if("ejectbeaker") - if(beaker) - beaker.forceMove(drop_location()) - if(Adjacent(usr) && !issilicon(usr)) - usr.put_in_hands(beaker) - beaker = null - . = TRUE + return TRUE + + if("eject") + if(!QDELETED(beaker)) + var/mob/living/user = ui.user + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(beaker) + else + beaker.forceMove(drop_location()) + return TRUE /obj/machinery/cryo_cell/can_interact(mob/user) - return ..() && user.loc != src + //must not be in the machine or on its turf to interact + if(get_turf(user) == get_turf(src)) + return FALSE + return ..() /obj/machinery/cryo_cell/CtrlClick(mob/user) if(can_interact(user) && !state_open) - if(set_on(!on)) - balloon_alert(user, "turned [on ? "on" : "off"]") + set_on(!on) + balloon_alert(user, "turned [on ? "on" : "off"]") return ..() /obj/machinery/cryo_cell/AltClick(mob/user) if(can_interact(user)) - balloon_alert(user, "[state_open ? "closing" : "opening"] door") if(state_open) close_machine() else open_machine() + balloon_alert(user, "door [state_open ? "opened" : "closed"]") return ..() /obj/machinery/cryo_cell/get_remote_view_fullscreens(mob/user) user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) -/obj/machinery/cryo_cell/return_temperature() - var/datum/gas_mixture/G = internal_connector.gas_connector.airs[1] - - if(G.total_moles() > 10) - return G.temperature - return ..() - #undef MAX_TEMPERATURE #undef CRYO_MULTIPLY_FACTOR #undef CRYO_TX_QTY diff --git a/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm index b1e2567f82f..dc1c2d6282f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/machine_connector.dm @@ -21,12 +21,19 @@ gas_connector.set_init_directions() gas_connector.atmos_init() SSair.add_to_rebuild_queue(gas_connector) + RegisterSignal(gas_connector, COMSIG_QDELETING, PROC_REF(connector_deleted)) /datum/gas_machine_connector/Destroy() connected_machine = null QDEL_NULL(gas_connector) return ..() +/datum/gas_machine_connector/proc/connector_deleted() + SIGNAL_HANDLER + gas_connector = null + if(!QDELETED(connected_machine)) + qdel(connected_machine) + /** * Register various signals that are required for the proper work of the connector */ diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 741d6cb5eb5..3f55a3b0f9d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -203,12 +203,14 @@ return if(pump_direction & ATMOS_DIRECTION_RELEASING) - icon_state = "vent_out-off" + icon_state = "vent_off" + flick("vent_out-shutdown", src) else // pump_direction == SIPHONING - icon_state = "vent_in-off" + icon_state = "vent_off" + flick("vent_in-shutdown", src) return - if(icon_state == ("vent_out-off" || "vent_in-off" || "vent_off")) + if(icon_state == "vent_off") if(pump_direction & ATMOS_DIRECTION_RELEASING) icon_state = "vent_out" flick("vent_out-starting", src) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 09c8a3a9367..730e193671d 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -99,7 +99,7 @@ normalize_cardinal_directions() find_all_connections() -/obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer() +/obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer(new_layer) piping_layer = PIPING_LAYER_DEFAULT /obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion() diff --git a/code/modules/awaymissions/mission_code/murderdome.dm b/code/modules/awaymissions/mission_code/murderdome.dm index 2e1154d29cf..520372e68ac 100644 --- a/code/modules/awaymissions/mission_code/murderdome.dm +++ b/code/modules/awaymissions/mission_code/murderdome.dm @@ -1,7 +1,7 @@ /obj/structure/window/reinforced/fulltile/indestructible name = "robust window" - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION flags_1 = PREVENT_CLICK_UNDER_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index c46b0b9aa3c..864b4fa03f8 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -46,9 +46,6 @@ if (Adjacent(user)) return interact(user) -/obj/structure/signpost/attack_slime(mob/user, list/modifiers) - return interact(user) - /obj/structure/signpost/attack_animal(mob/user, list/modifiers) return interact(user) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 556a9fd63ad..d7ecda85018 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -105,8 +105,6 @@ /obj/structure/speaking_tile/attack_ai(mob/user) return interact(user) -/obj/structure/speaking_tile/attack_slime(mob/user, list/modifiers) - return interact(user) /obj/structure/speaking_tile/attack_animal(mob/user, list/modifiers) return interact(user) diff --git a/code/modules/basketball/basketball.dm b/code/modules/basketball/basketball.dm index 9fe176715db..77c3214fe56 100644 --- a/code/modules/basketball/basketball.dm +++ b/code/modules/basketball/basketball.dm @@ -48,7 +48,7 @@ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(movement_effect)) RegisterSignal(user, COMSIG_MOB_EMOTED("spin"), PROC_REF(on_spin)) - RegisterSignal(user, COMSIG_HUMAN_DISARM_HIT, PROC_REF(on_equipped_mob_disarm)) + RegisterSignal(user, COMSIG_LIVING_DISARM_HIT, PROC_REF(on_equipped_mob_disarm)) RegisterSignal(user, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(on_equipped_mob_knockdown)) /obj/item/toy/basketball/proc/remove_ball_effects() @@ -57,7 +57,7 @@ // unlike on_equip, this signal is triggered after the ball is removed from hands // so we can just use is_holding_item_of_type() proc to check for multiple balls if(!wielder.is_holding_item_of_type(/obj/item/toy/basketball)) - UnregisterSignal(wielder, list(COMSIG_MOVABLE_MOVED, COMSIG_MOB_EMOTED("spin"), COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOB_THROW)) + UnregisterSignal(wielder, list(COMSIG_MOVABLE_MOVED, COMSIG_MOB_EMOTED("spin"), COMSIG_LIVING_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOB_THROW)) wielder = null @@ -99,12 +99,9 @@ /// Used to calculate our disarm chance based on stamina, direction, and spinning /// Note - monkeys use attack_paw() and never trigger this signal (so they always have 100% disarm) -/obj/item/toy/basketball/proc/on_equipped_mob_disarm(mob/living/baller, mob/living/stealer, zone) +/obj/item/toy/basketball/proc/on_equipped_mob_disarm(mob/living/baller, mob/living/stealer, zone, obj/item/weapon) SIGNAL_HANDLER - if(!istype(baller)) - return - // spinning gives you a lower disarm chance but it drains stamina var/disarm_chance = HAS_TRAIT(baller, TRAIT_SPINNING) ? 35 : 50 // ballers stamina results in lower disarm, stealer stamina results in higher disarm diff --git a/code/modules/bitrunning/components/netpod_healing.dm b/code/modules/bitrunning/components/netpod_healing.dm index 03cdbc000be..86f80e854e0 100644 --- a/code/modules/bitrunning/components/netpod_healing.dm +++ b/code/modules/bitrunning/components/netpod_healing.dm @@ -6,7 +6,13 @@ if (!iscarbon(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(pod, COMSIG_BITRUNNER_NETPOD_OPENED, PROC_REF(on_opened)) + RegisterSignals( + pod, + list(COMSIG_MACHINERY_BROKEN, COMSIG_QDELETING, COMSIG_BITRUNNER_NETPOD_OPENED), + PROC_REF(on_remove), + ) + + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_remove)) var/mob/living/carbon/player = parent player.apply_status_effect(/datum/status_effect/embryonic, STASIS_NETPOD_EFFECT) @@ -39,7 +45,7 @@ owner.updatehealth() /// Deletes itself when the machine was opened -/datum/component/netpod_healing/proc/on_opened() +/datum/component/netpod_healing/proc/on_remove() SIGNAL_HANDLER qdel(src) diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index 0eb26b9c588..3a90939dae1 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -39,14 +39,15 @@ var/obj/structure/closet/crate/secure/bitrunning/encrypted/encrypted_crate var/area/my_area = get_area(src) - for(var/turf/area_turf as anything in my_area.get_contained_turfs()) - for(var/obj/structure/closet/crate/crate_to_check in area_turf) - if(istype(crate_to_check, /obj/structure/closet/crate/secure/bitrunning/encrypted)) - encrypted_crate = crate_to_check - crate_to_check.desc += span_hypnophrase(" This feels like the crate we're looking for!") - else - crate_list += crate_to_check - crate_to_check.name = "Unidentified Crate" + for (var/list/zlevel_turfs as anything in my_area.get_zlevel_turf_lists()) + for (var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/structure/closet/crate/crate_to_check in area_turf) + if(istype(crate_to_check, /obj/structure/closet/crate/secure/bitrunning/encrypted)) + encrypted_crate = crate_to_check + crate_to_check.desc += span_hypnophrase(" This feels like the crate we're looking for!") + else + crate_list += crate_to_check + crate_to_check.name = "Unidentified Crate" if(!encrypted_crate) stack_trace("Bitrunning Goal Crate Randomizer failed to find an encrypted crate to swap positions for.") diff --git a/code/modules/bitrunning/objects/loot_crate.dm b/code/modules/bitrunning/objects/loot_crate.dm index 539f977c778..a0a74ecb4b9 100644 --- a/code/modules/bitrunning/objects/loot_crate.dm +++ b/code/modules/bitrunning/objects/loot_crate.dm @@ -20,6 +20,7 @@ desc = "Needs to be decrypted at the safehouse to be opened." locked = TRUE damage_deflection = 30 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /obj/structure/closet/crate/secure/bitrunning/encrypted/can_unlock(mob/living/user, obj/item/card/id/player_id, obj/item/card/id/registered_id) return FALSE diff --git a/code/modules/buildmode/submodes/map_export.dm b/code/modules/buildmode/submodes/map_export.dm new file mode 100644 index 00000000000..e0cb6629e19 --- /dev/null +++ b/code/modules/buildmode/submodes/map_export.dm @@ -0,0 +1,91 @@ +/datum/buildmode_mode/map_export + key = "mapexport" + use_corner_selection = TRUE + /// Variable with the flag value to understand how to treat the shuttle zones. + var/shuttle_flag = SAVE_SHUTTLEAREA_DONTCARE + /// Variable with a flag value to indicate what should be saved (for example, only objects or only mobs). + var/save_flag = ALL + +/datum/buildmode_mode/map_export/change_settings(client/builder) + var/static/list/options = list( + "Object Saving" = SAVE_OBJECTS, + "Mob Saving" = SAVE_MOBS, + "Turf Saving" = SAVE_TURFS, + "Area Saving" = SAVE_AREAS, + "Space Turf Saving" = SAVE_SPACE, + "Object Property Saving" = SAVE_OBJECT_PROPERTIES, + ) + var/what_to_change = tgui_input_list(builder, "What export setting would you like to toggle?", "Map Exporter", options) + if (!what_to_change) + return + save_flag ^= options[what_to_change] + to_chat(builder, "[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"].") + +/datum/buildmode_mode/map_export/show_help(client/builder) + to_chat(builder, span_purple(examine_block( + "[span_bold("Select corner")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Set export options")] -> Right Mouse Button on buildmode button")) + ) + +/datum/buildmode_mode/map_export/handle_selected_area(client/builder, params) + var/list/listed_params = params2list(params) + var/left_click = listed_params.Find("left") + + //Ensure the selection is actually done + if(!left_click) + to_chat(builder, span_warning("Invalid selection.")) + return + + //If someone somehow gets build mode, stop them from using this. + if(!check_rights(R_DEBUG)) + message_admins("[ckey(builder)] tried to run the map save generator but was rejected due to insufficient perms.") + to_chat(builder, span_warning("You must have +ADMIN rights to use this.")) + return + //Emergency check + if(get_dist(cornerA, cornerB) > 60 || cornerA.z != cornerB.z) + var/confirm = tgui_alert(builder, "Are you sure about this? Exporting large maps may take quite a while.", "Map Exporter", list("Yes", "No")) + if(confirm != "Yes") + return + + if(cornerA == cornerB) + return + + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(_save_map), cornerA, cornerB, save_flag, shuttle_flag) + +/// A guard variable to prevent more than one map export process from occurring at the same time. +GLOBAL_VAR_INIT(map_writing_running, FALSE) +/// Hey bud don't call this directly, it exists so we can invoke async and prevent the buildmode datum being qdel'd from halting this proc +/proc/_save_map(turf/cornerA, turf/cornerB, save_flag, shuttle_flag) + if(!check_rights(R_DEBUG)) + message_admins("[ckey(usr)] tried to run the map save generator but was rejected due to insufficient perms.") + to_chat(usr, span_warning("You must have +ADMIN rights to use this.")) + return + if(GLOB.map_writing_running) + to_chat(usr, span_warning("Someone is already running the generator! Try again in a little bit.")) + return + + to_chat(usr, span_warning("Saving, please wait...")) + GLOB.map_writing_running = TRUE + + //I put this before the actual saving of the map because it likely won't log if it crashes the fucking server + log_admin("Build Mode: [key_name(usr)] is exporting the map area from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") + + //oversimplified for readability and understandibility + + var/minx = min(cornerA.x, cornerB.x) + var/miny = min(cornerA.y, cornerB.y) + var/minz = min(cornerA.z, cornerB.z) + + var/maxx = max(cornerA.x, cornerB.x) + var/maxy = max(cornerA.y, cornerB.y) + var/maxz = max(cornerA.z, cornerB.z) + + //Step 1: Get the data (This can take a while) + var/dat = write_map(minx, miny, minz, maxx, maxy, maxz, save_flag, shuttle_flag) + + //Step 2: Write the data to a file and give map to client + var/date = time2text(world.timeofday, "YYYY-MM-DD_hh-mm-ss") + var/file_name = sanitize_filename(tgui_input_text(usr, "Filename?", "Map Exporter", "exported_map_[date]")) + send_exported_map(usr, file_name, dat) + to_chat(usr, span_green("The map was successfully saved!")) + GLOB.map_writing_running = FALSE diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index f333b370d48..e3b9fb37869 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -464,7 +464,7 @@ /obj/structure/table/reinforced/ctf resistance_flags = INDESTRUCTIBLE - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION #define CTF_LOADING_UNLOADED 0 #define CTF_LOADING_LOADING 1 @@ -510,8 +510,9 @@ var/ctf_enabled = FALSE ctf_enabled = ctf_controller.toggle_ctf() - for(var/obj/machinery/power/emitter/emitter in ctf_area) - emitter.active = ctf_enabled + for(var/turf/ctf_turf as anything in get_area_turfs(ctf_area)) + for(var/obj/machinery/power/emitter/emitter in ctf_turf) + emitter.active = ctf_enabled if(user) message_admins("[key_name_admin(user)] has [ctf_enabled ? "enabled" : "disabled"] CTF!") else if(automated) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 5885ad58252..7d345802eef 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -215,7 +215,7 @@ description = "We need fish to populate our aquariums with. Fishes that are dead or bought from cargo will only be paid half as much." reward = CARGO_CRATE_VALUE * 9 required_count = 4 - wanted_types = list(/obj/item/fish = TRUE) + wanted_types = list(/obj/item/fish = TRUE, /obj/item/storage/fish_case = TRUE) ///the penalty for shipping dead/bought fish, which can subtract up to half the reward in total. var/shipping_penalty @@ -223,11 +223,27 @@ ..() shipping_penalty = reward * 0.5 / required_count +/datum/bounty/item/assistant/fish/applies_to(obj/shipped) + . = ..() + if(!.) + return + var/obj/item/fish/fishie = shipped + if(istype(shipped, /obj/item/storage/fish_case)) + fishie = locate() in shipped + if(!fishie || !is_type_in_typecache(fishie, wanted_types)) + return FALSE + return can_ship_fish(fishie) + +/datum/bounty/item/assistant/fish/proc/can_ship_fish(obj/item/fish/fishie) + return TRUE + /datum/bounty/item/assistant/fish/ship(obj/shipped) . = ..() if(!.) return var/obj/item/fish/fishie = shipped + if(istype(shipped, /obj/item/storage/fish_case)) + fishie = locate() in shipped if(fishie.status == FISH_DEAD || HAS_TRAIT(fishie, TRAIT_FISH_FROM_CASE)) reward -= shipping_penalty @@ -243,11 +259,7 @@ name = "[fluid_type] Fish" description = "We need [lowertext(fluid_type)] fish to populate our aquariums with. Fishes that are dead or bought from cargo will only be paid half as much." -/datum/bounty/item/assistant/fish/fluid/applies_to(obj/shipped) - . = ..() - if(!.) - return - var/obj/item/fish/fishie = shipped +/datum/bounty/item/assistant/fish/fluid/can_ship_fish(obj/item/fish/fishie) return compatible_fluid_type(fishie.required_fluid_type, fluid_type) ///A subtype of the fish bounty that requires specific fish types. The higher their rarity, the better the pay. @@ -255,7 +267,7 @@ description = "Our prestigious fish collection is currently lacking a few specific species. Fishes that are dead or bought from cargo will only be paid half as much." reward = CARGO_CRATE_VALUE * 16 required_count = 3 - wanted_types = list() + wanted_types = list(/obj/item/storage/fish_case = TRUE) /datum/bounty/item/assistant/fish/specific/New() var/static/list/choosable_fishes diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index e56544a1864..f654db44887 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -56,6 +56,12 @@ var/discount_pct_off = 0.05 var/obj/machinery/computer/cargo/inserted_console +/obj/item/coupon/Initialize(mapload) + . = ..() + + if(discounted_pack) + update_name() + /// Choose what our prize is :D /obj/item/coupon/proc/generate(discount, datum/supply_pack/discounted_pack) src.discounted_pack = discounted_pack || pick(GLOB.discountable_packs[pick_weight(GLOB.pack_discount_odds)]) @@ -65,11 +71,12 @@ if(discount_pct_off != COUPON_OMEN) if(!discount) // the discount arg should be a number already, while the keys in the chances list cannot be numbers discount_pct_off = text2num(discount_pct_off) - name = "coupon - [round(discount_pct_off * 100)]% off [initial(src.discounted_pack.name)]" + update_name() return name = "coupon - fuck you" desc = "The small text reads, 'You will be slaughtered'... That doesn't sound right, does it?" + if(!ismob(loc)) return FALSE @@ -83,6 +90,10 @@ to_chat(cursed, span_warning("What a horrible night... To have a curse!")) addtimer(CALLBACK(src, PROC_REF(curse_heart), cursed), 5 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE) +/obj/item/coupon/update_name() + name = "coupon - [round(discount_pct_off * 100)]% off [initial(discounted_pack.name)]" + return ..() + /// Play stupid games, win stupid prizes /obj/item/coupon/proc/curse_heart(mob/living/cursed) if(!iscarbon(cursed)) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 622ab5ef9b0..fd6e91a8580 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -115,7 +115,6 @@ Then the player gets the profit from selling his own wasted time. return ..() /datum/export/process() - ..() cost *= NUM_E**(k_elasticity * (1/30)) if(cost > init_cost) cost = init_cost diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 6babda045e0..79ae0b0fbf8 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -185,7 +185,7 @@ if (!landingzone) WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.get_contained_turfs())//uses default landing zone + for(var/turf/open/floor/T in landingzone.get_turfs_from_all_zlevels())//uses default landing zone if(T.is_blocked_turf()) continue LAZYADD(empty_turfs, T) @@ -204,7 +204,7 @@ else if(SO.pack.get_cost() * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^) landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone - for(var/turf/open/floor/T in landingzone.get_contained_turfs()) + for(var/turf/open/floor/T in landingzone.get_turfs_from_all_zlevels()) if(T.is_blocked_turf()) continue LAZYADD(empty_turfs, T) diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index 5480ba145c9..a7bb93f9c3a 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -50,6 +50,14 @@ stock_max = 2 availability_prob = 30 +/datum/market_item/misc/shove_blocker + name = "MOD Bulwark Module" + desc = "You have no idea how much effort it took us to extract this module from that damn safeguard MODsuit last shift." + price_min = CARGO_CRATE_VALUE * 4 + price_max = CARGO_CRATE_VALUE * 5.75 + stock_max = 1 + availability_prob = 25 + /datum/market_item/misc/holywater name = "Flask of holy water" desc = "Father Lootius' own brand of ready-made holy water." diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm index 21540e75908..92d83d5d0a1 100644 --- a/code/modules/cargo/materials_market.dm +++ b/code/modules/cargo/materials_market.dm @@ -131,6 +131,7 @@ var/color_string var/sheet_to_buy var/requested_amount + var/minimum_value_threshold = 0 for(var/datum/material/traded_mat as anything in SSstock_market.materials_prices) //convert trend into text switch(SSstock_market.materials_trends[traded_mat]) @@ -162,10 +163,16 @@ if(!isnull(current_order)) requested_amount = current_order.pack.contains[sheet_to_buy] + var/min_value_override = initial(traded_mat.minimum_value_override) + if(min_value_override) + minimum_value_threshold = min_value_override + + //send data material_data += list(list( "name" = initial(traded_mat.name), "price" = SSstock_market.materials_prices[traded_mat], + "threshold" = minimum_value_threshold, "quantity" = SSstock_market.materials_quantity[traded_mat], "trend" = trend_string, "color" = color_string, diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index 9c57a4d6d7f..b48ef268da6 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -4,13 +4,15 @@ /datum/supply_pack/emergency/bio name = "Biological Emergency Crate" - desc = "This crate holds 2 full bio suits which will protect you from viruses." + desc = "This crate includes 2 complete bio suits, along with a box containing sterile masks and latex gloves, providing effective protection against viruses." cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/clothing/head/bio_hood = 2, /obj/item/clothing/suit/bio_suit = 2, /obj/item/storage/bag/bio, /obj/item/reagent_containers/syringe/antiviral = 2, /obj/item/clothing/gloves/latex/nitrile = 2, + /obj/item/storage/box/masks, + /obj/item/storage/box/gloves, ) crate_name = "bio suit crate" diff --git a/code/modules/cargo/packs/stock_market_items.dm b/code/modules/cargo/packs/stock_market_items.dm index 9744bdf7400..6206e8d0f4c 100644 --- a/code/modules/cargo/packs/stock_market_items.dm +++ b/code/modules/cargo/packs/stock_market_items.dm @@ -1,11 +1,10 @@ /** - * todo: make this a supply_pack/custom. Drop pog? ohoho yes. Would be VERY fun. + * todo: make this a supply_pack/custom. Drop pod? ohoho yes. Would be VERY fun. */ /datum/supply_pack/market_materials name = "A Single Sheet of Bananium" desc = "Going market price for this kind of sheet, by Australicus Industrial Mining." cost = CARGO_CRATE_VALUE * 2 - // contains = list(/obj/item/stack/sheet/mineral/bananium) crate_name = "mineral stock sheet crate" group = "Canisters & Materials" /// What material we are trying to buy sheets of? diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index a4bacea8082..68fe533959a 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -5,6 +5,7 @@ desc = "A device used to check objects against Nanotrasen exports database, assign price tags, or ready an item for a custom vending machine." icon = 'icons/obj/devices/scanner.dmi' icon_state = "export scanner" + worn_icon_state = "electronic" inhand_icon_state = "export_scanner" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index ca35d6cc833..2eb271b8108 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -108,6 +108,18 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (href_list["player_ticket_panel"]) view_latest_ticket() return + // Admin message + if(href_list["messageread"]) + var/message_id = round(text2num(href_list["messageread"]), 1) + if(!isnum(message_id)) + return + var/datum/db_query/query_message_read = SSdbcore.NewQuery( + "UPDATE [format_table_name("messages")] SET type = 'message sent' WHERE targetckey = :player_key AND id = :id", + list("id" = message_id, "player_key" = usr.ckey) + ) + query_message_read.warn_execute() + return + // TGUIless adminhelp if(href_list["tguiless_adminhelp"]) no_tgui_adminhelp(input(src, "Enter your ahelp", "Ahelp") as null|message) @@ -441,9 +453,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(holder) add_admin_verbs() - var/memo_message = get_message_output("memo") - if(memo_message) - to_chat(src, memo_message) + display_admin_memos(src) adminGreet() if (mob && reconnecting) var/stealth_admin = mob.client?.holder?.fakekey @@ -460,9 +470,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(query_last_connected.warn_execute() && length(query_last_connected.rows)) query_last_connected.NextRow() var/time_stamp = query_last_connected.item[1] - var/unread_notes = get_message_output("note", ckey, FALSE, time_stamp) - if(unread_notes) - to_chat(src, unread_notes) + display_unread_notes(src, time_stamp) qdel(query_last_connected) var/cached_player_age = set_client_age_from_db(tdata) //we have to cache this because other shit may change it and we need it's current value now down below. @@ -491,7 +499,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age == 1?"":"s")] old, created on [account_join_date].[new_player_alert_role ? " <@&[new_player_alert_role]>" : ""]" ) - get_message_output("watchlist entry", ckey) + scream_about_watchlists(src) check_ip_intel() validate_key_in_db() // If we aren't already generating a ban cache, fire off a build request @@ -517,9 +525,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(CONFIG_GET(flag/autoconvert_notes)) convert_notes_sql(ckey) - var/user_messages = get_message_output("message", ckey) - if(user_messages) - to_chat(src, user_messages) + display_admin_messages(src) if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. to_chat(src, span_warning("Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.")) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ba610c347f3..f65964cd802 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -540,6 +540,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) .++ /datum/preferences/proc/validate_quirks() + if(CONFIG_GET(flag/disable_quirk_points)) + return if(GetQuirkBalance() < 0) all_quirks = list() diff --git a/code/modules/client/preferences/language.dm b/code/modules/client/preferences/language.dm index f602d6b3a66..8d4c7917630 100644 --- a/code/modules/client/preferences/language.dm +++ b/code/modules/client/preferences/language.dm @@ -20,6 +20,7 @@ //we add uncommon as it's foreigner-only. var/datum/language/uncommon/uncommon_language = /datum/language/uncommon values += initial(uncommon_language.name) + values += /datum/language/common::name // SKYRAT EDIT ADDITION START - Let's you select common for(var/datum/language/language_type as anything in GLOB.uncommon_roundstart_languages) if(initial(language_type.name) in values) diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm index 267c1036125..ed5ba9ed37d 100644 --- a/code/modules/client/preferences/middleware/quirks.dm +++ b/code/modules/client/preferences/middleware/quirks.dm @@ -31,8 +31,13 @@ var/list/quirks = SSquirks.get_quirks() + var/max_positive_quirks = CONFIG_GET(number/max_positive_quirks) + var/positive_quirks_disabled = max_positive_quirks == 0 for (var/quirk_name in quirks) var/datum/quirk/quirk = quirks[quirk_name] + if(positive_quirks_disabled && initial(quirk.value) > 0) + continue + var/datum/quirk_constant_data/constant_data = GLOB.all_quirk_constant_data[quirk] var/list/datum/preference/customization_options = constant_data?.get_customization_data() @@ -47,9 +52,10 @@ ) return list( - "max_positive_quirks" = MAX_QUIRKS, + "max_positive_quirks" = max_positive_quirks, "quirk_info" = quirk_info, "quirk_blacklist" = GLOB.quirk_string_blacklist, + "points_enabled" = !CONFIG_GET(flag/disable_quirk_points), "quirk_species_whitelist" = SSquirks.quirk_species_whitelist, //BUBBER EDIT - Species quirks ) diff --git a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm index f619a429269..c4ee98acd51 100644 --- a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm +++ b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm @@ -103,14 +103,14 @@ . = ..() chameleon_blacklist |= typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE) -/datum/action/item_action/chameleon/change/suit/apply_outfit(mob/user, datum/outfit/applying_from, list/all_items_to_apply) +/datum/action/item_action/chameleon/change/suit/apply_outfit(datum/outfit/applying_from, list/all_items_to_apply) . = ..() if(!. || !ispath(applying_from.suit, /obj/item/clothing/suit/hooded)) return // If we're appling a hooded suit, and wearing a cham hat, make it a hood var/obj/item/clothing/suit/hooded/hooded = applying_from.suit - var/datum/action/item_action/chameleon/change/hat/hood_action = locate() in user.actions - hood_action?.update_look(user, initial(hooded.hoodtype)) + var/datum/action/item_action/chameleon/change/hat/hood_action = locate() in owner?.actions + hood_action?.update_look(initial(hooded.hoodtype)) /datum/action/item_action/chameleon/change/jumpsuit chameleon_type = /obj/item/clothing/under diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm index 492008d5348..f73b5b13da7 100644 --- a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -108,6 +108,7 @@ do { \ resistance_flags = NONE armor_type = /datum/armor/gloves_chameleon actions_types = list(/datum/action/item_action/chameleon/change/gloves) + clothing_traits = list(TRAIT_FAST_CUFFING) /obj/item/clothing/gloves/chameleon/broken diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 486f44f3504..107e13c2970 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -315,6 +315,9 @@ if (1601 to 35000) . += "[src] offers the wearer robust protection from fire." + if(TRAIT_FAST_CUFFING in clothing_traits) + . += "[src] increase the speed that you handcuff others." + for(var/zone in damage_by_parts) var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100 var/zone_name = parse_zone(zone) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index d91a5c3bb4a..c9fbb159126 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -97,15 +97,16 @@ return var/list/shuttle_areas = port.shuttle_areas for(var/area/region as anything in shuttle_areas) - for(var/turf/place as anything in region.get_contained_turfs()) - if(get_dist(user, place) > 7) - continue - var/image/pic - if(isshuttleturf(place)) - pic = new('icons/turf/overlays.dmi', place, "greenOverlay", AREA_LAYER) - else - pic = new('icons/turf/overlays.dmi', place, "redOverlay", AREA_LAYER) - flick_overlay_global(pic, list(user.client), 8) + for (var/list/zlevel_turfs as anything in region.get_zlevel_turf_lists()) + for (var/turf/place as anything in zlevel_turfs) + if(get_dist(user, place) > 7) + continue + var/image/pic + if(isshuttleturf(place)) + pic = new('icons/turf/overlays.dmi', place, "greenOverlay", AREA_LAYER) + else + pic = new('icons/turf/overlays.dmi', place, "redOverlay", AREA_LAYER) + flick_overlay_global(pic, list(user.client), 8) /obj/item/clothing/glasses/meson/engine/proc/show_connections() var/mob/living/carbon/human/user = loc diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index f77f6cc2c67..11230d18d37 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -9,6 +9,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE cut_type = /obj/item/clothing/gloves/fingerless + clothing_traits = list(TRAIT_FAST_CUFFING) // SKYRAT EDIT ADDITION START uses_advanced_reskins = TRUE unique_reskin = list( diff --git a/code/modules/clothing/gloves/combat.dm b/code/modules/clothing/gloves/combat.dm index e69813272d7..77030822716 100644 --- a/code/modules/clothing/gloves/combat.dm +++ b/code/modules/clothing/gloves/combat.dm @@ -11,6 +11,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE armor_type = /datum/armor/gloves_combat + clothing_traits = list(TRAIT_FAST_CUFFING) /datum/armor/gloves_combat bio = 90 diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 74de42937e1..d7fb34ae7c7 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -88,6 +88,7 @@ strip_delay = 60 armor_type = /datum/armor/captain_gloves resistance_flags = NONE + clothing_traits = list(TRAIT_FAST_CUFFING) /datum/armor/captain_gloves bio = 90 @@ -102,7 +103,7 @@ greyscale_colors = null siemens_coefficient = 0.3 armor_type = /datum/armor/latex_gloves - clothing_traits = list(TRAIT_QUICK_CARRY, TRAIT_FINGERPRINT_PASSTHROUGH) + clothing_traits = list(TRAIT_QUICK_CARRY) resistance_flags = NONE /datum/armor/latex_gloves diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 986d8356b1a..a904cd0dd90 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -7,7 +7,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT resistance_flags = NONE custom_premium_price = PAYCHECK_COMMAND * 3.5 - clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) + clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH,TRAIT_FAST_CUFFING) /// For storing our tackler datum so we can remove it after var/datum/component/tackler /// See: [/datum/component/tackler/var/stamina_cost] diff --git a/code/modules/clothing/head/cone.dm b/code/modules/clothing/head/cone.dm index 0bd60b633da..9cfcacda685 100644 --- a/code/modules/clothing/head/cone.dm +++ b/code/modules/clothing/head/cone.dm @@ -5,6 +5,7 @@ worn_icon = 'icons/mob/clothing/head/utility.dmi' icon_state = "cone" inhand_icon_state = null + worn_y_offset = 1 force = 1 throwforce = 3 throw_speed = 2 diff --git a/code/modules/clothing/head/moth.dm b/code/modules/clothing/head/moth.dm index fe5f04f0a4c..961de9e3a75 100644 --- a/code/modules/clothing/head/moth.dm +++ b/code/modules/clothing/head/moth.dm @@ -7,4 +7,14 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT flags_cover = HEADCOVERSEYES - flags_inv = HIDEHAIR|SHOWSPRITEEARS + flags_inv = HIDEHAIR|SHOWSPRITEEARS // SKYRAT EDIT CHANGE + +/obj/item/clothing/head/mothcap/original + desc = "An authentic, padded leather cap with magnifying goggles, standard issue aboard the moth fleet. Keeps your head warm and debris away from those big eyes." + +/obj/item/clothing/head/mothcap/original/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 1.2, zoom_method = ZOOM_METHOD_ITEM_ACTION, item_action_type = /datum/action/item_action/hands_free/moth_googles) + +/obj/item/clothing/head/mothcap/original/item_action_slot_check(slot, mob/user, datum/action/action) + return (slot & ITEM_SLOT_HEAD) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index ddce653aee5..a22691495cc 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -113,6 +113,16 @@ r_hand = /obj/item/gun/energy/recharge/ebow shoes = /obj/item/clothing/shoes/magboots/advance +/datum/outfit/heretic_hallucination + name = "Heretic Hallucination" + + uniform = /obj/item/clothing/under/color/grey + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + neck = /obj/item/clothing/neck/heretic_focus + r_hand = /obj/item/melee/touch_attack/mansus_fist + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + shoes = /obj/item/clothing/shoes/sneakers/black + /datum/outfit/rev_cutout name = "Revolutionary Cutout" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 296ac44503d..bcfe4776b76 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -304,9 +304,9 @@ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor_type = /datum/armor/armor_riot - clothing_flags = BLOCKS_SHOVE_KNOCKDOWN strip_delay = 80 equip_delay_other = 60 + clothing_traits = list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED) /datum/armor/armor_riot melee = 50 @@ -403,13 +403,15 @@ armor_type = /datum/armor/armor_swat strip_delay = 120 resistance_flags = FIRE_PROOF | ACID_PROOF - clothing_flags = BLOCKS_SHOVE_KNOCKDOWN | THICKMATERIAL + clothing_flags = THICKMATERIAL cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF heat_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT slowdown = 0.7 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + clothing_traits = list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED) + //All of the armor below is mostly unused diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 3a480ae1fa6..8c1815f3a01 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -27,7 +27,13 @@ icon_state = "pirate" inhand_icon_state = null body_parts_covered = CHEST|GROIN|ARMS - allowed = list(/obj/item/melee/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/cup/glass/bottle/rum) + allowed = list( + /obj/item/melee/energy/sword/pirate, + /obj/item/clothing/glasses/eyepatch, + /obj/item/reagent_containers/cup/glass/bottle/rum, + /obj/item/gun/energy/laser/musket, + /obj/item/gun/energy/disabler/smoothbore, + ) species_exception = list(/datum/species/golem) /obj/item/clothing/suit/costume/pirate/armored diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 69f2d31d0d8..eba2dd29ce8 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -8,7 +8,7 @@ . = ..() if(prob(1)) user.say("The testimony contradicts the evidence!", forced = "[src]") - user.visible_message(span_notice("[user] shows [user.p_their()] attorney's badge."), span_notice("You show your attorney's badge.")) + user.point_at(src) /obj/item/clothing/accessory/lawyers_badge/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) RegisterSignal(user, COMSIG_LIVING_SLAM_TABLE, PROC_REF(table_slam)) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 8efe01169ce..34681825502 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -52,7 +52,7 @@ set_starlight(aurora_color) for(var/area/station/service/kitchen/affected_area in GLOB.areas) - for(var/turf/open/kitchen_floor in affected_area.get_contained_turfs()) + for(var/turf/open/kitchen_floor in affected_area.get_turfs_from_all_zlevels()) kitchen_floor.set_light(l_color = aurora_color) /datum/round_event/aurora_caelus/end() @@ -108,9 +108,9 @@ var/walked_range = LERP(start_range, end_range, i/5) var/walked_power = LERP(start_power, end_power, i/5) for(var/area/station/service/kitchen/affected_area in GLOB.areas) - for(var/turf/open/kitchen_floor in affected_area.get_contained_turfs()) + for(var/turf/open/kitchen_floor in affected_area.get_turfs_from_all_zlevels()) kitchen_floor.set_light(walked_range, walked_power, walked_color) sleep(8 SECONDS) for(var/area/station/service/kitchen/affected_area in GLOB.areas) - for(var/turf/open/kitchen_floor in affected_area.get_contained_turfs()) + for(var/turf/open/kitchen_floor in affected_area.get_turfs_from_all_zlevels()) kitchen_floor.set_light(end_range, end_power, end_color) diff --git a/code/modules/events/shuttle_loan/shuttle_loan_event.dm b/code/modules/events/shuttle_loan/shuttle_loan_event.dm index 99e70e39495..ac5faa6971f 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_event.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_event.dm @@ -80,7 +80,7 @@ var/list/blocked_shutte_turfs = list() var/list/area/shuttle/shuttle_areas = SSshuttle.supply.shuttle_areas for(var/area/shuttle/shuttle_area as anything in shuttle_areas) - for(var/turf/open/floor/shuttle_turf in shuttle_area) + for(var/turf/open/floor/shuttle_turf in shuttle_area.get_turfs_from_all_zlevels()) if(shuttle_turf.is_blocked_turf()) blocked_shutte_turfs += shuttle_turf continue diff --git a/code/modules/events/space_vines/vine_event.dm b/code/modules/events/space_vines/vine_event.dm index 46cf91a33e6..03350abdb09 100644 --- a/code/modules/events/space_vines/vine_event.dm +++ b/code/modules/events/space_vines/vine_event.dm @@ -38,7 +38,7 @@ var/obj/structure/spacevine/vine = new() for(var/area/station/hallway/area in GLOB.areas) - for(var/turf/open/floor in area.get_contained_turfs()) + for(var/turf/open/floor in area.get_turfs_from_all_zlevels()) if(floor.Enter(vine)) turfs += floor diff --git a/code/modules/events/wizard/rpgtitles.dm b/code/modules/events/wizard/rpgtitles.dm index d503892dc57..9512c298dea 100644 --- a/code/modules/events/wizard/rpgtitles.dm +++ b/code/modules/events/wizard/rpgtitles.dm @@ -43,7 +43,7 @@ GLOBAL_DATUM(rpgtitle_controller, /datum/rpgtitle_controller) //we must prepare for the mother of all strings new_crewmember.maptext_height = max(new_crewmember.maptext_height, 32) new_crewmember.maptext_width = max(new_crewmember.maptext_width, 112) - new_crewmember.maptext_x = -24 - new_crewmember.base_pixel_x + new_crewmember.maptext_x = -38 - new_crewmember.base_pixel_x new_crewmember.maptext_y = -32 //list of lists involving strings related to a biotype flag, their position in the list equal to the position they were defined as bitflags. diff --git a/code/modules/fishing/admin.dm b/code/modules/fishing/admin.dm index ad97ab890b4..d1d2c0ae2c5 100644 --- a/code/modules/fishing/admin.dm +++ b/code/modules/fishing/admin.dm @@ -28,10 +28,7 @@ .["rod_types"] = typesof(/obj/item/fishing_rod) .["hook_types"] = typesof(/obj/item/fishing_hook) .["line_types"] = typesof(/obj/item/fishing_line) - var/list/spot_keys = list() - for(var/key in GLOB.preset_fish_sources) - spot_keys += key - .["spot_types"] = subtypesof(/datum/fish_source) + spot_keys + .["spot_types"] = subtypesof(/datum/fish_source) /datum/fishing_calculator/ui_data(mob/user) return list("info" = current_table) @@ -45,22 +42,20 @@ var/bait_type = text2path(params["bait"]) var/hook_type = text2path(params["hook"]) var/line_type = text2path(params["line"]) - var/spot_type = text2path(params["spot"]) || params["spot"] //can be also key from presets - - //validate here against nonsense values - var/datum/fish_source/spot - if(ispath(spot_type)) - spot = new spot_type - else - spot = GLOB.preset_fish_sources[spot_type] + var/datum/fish_source/spot = GLOB.preset_fish_sources[text2path(params["spot"])] var/obj/item/fishing_rod/temporary_rod = new rod_type + qdel(temporary_rod.bait) + qdel(temporary_rod.line) + qdel(temporary_rod.hook) + if(bait_type) - temporary_rod.bait = new bait_type + temporary_rod.set_slot(new bait_type(temporary_rod), ROD_SLOT_BAIT) if(hook_type) - temporary_rod.hook = new hook_type + temporary_rod.set_slot(new hook_type(temporary_rod), ROD_SLOT_HOOK) if(line_type) - temporary_rod.line = new line_type + temporary_rod.set_slot(new line_type(temporary_rod), ROD_SLOT_HOOK) + var/result_table = list() var/modified_table = spot.get_modified_fish_table(temporary_rod,user) for(var/result_type in spot.fish_table) // through this not modified to display 0 chance ones too @@ -71,5 +66,6 @@ info["count"] = spot.fish_counts[result_type] || "Infinite" result_table += list(info) current_table = result_table + qdel(temporary_rod) return TRUE diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index 88d0791acdf..48c7b8e24e9 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -1,7 +1,13 @@ #define AQUARIUM_LAYER_STEP 0.01 /// Aquarium content layer offsets -#define AQUARIUM_MIN_OFFSET 0.01 +#define AQUARIUM_MIN_OFFSET 0.02 #define AQUARIUM_MAX_OFFSET 1 +/// The layer of the glass overlay +#define AQUARIUM_GLASS_LAYER 0.01 +/// The layer of the aquarium pane borders +#define AQUARIUM_BORDERS_LAYER AQUARIUM_MAX_OFFSET + AQUARIUM_LAYER_STEP +/// Layer for stuff rendered below the glass overlay +#define AQUARIUM_BELOW_GLASS_LAYER 0.01 /obj/structure/aquarium name = "aquarium" @@ -10,7 +16,7 @@ anchored = TRUE icon = 'icons/obj/aquarium.dmi' - icon_state = "aquarium_base" + icon_state = "aquarium_map" integrity_failure = 0.3 @@ -27,9 +33,6 @@ /// Can fish reproduce in this quarium. var/allow_breeding = FALSE - var/glass_icon_state = "aquarium_glass" - var/broken_glass_icon_state = "aquarium_glass_broken" - //This is the area where fish can swim var/aquarium_zone_min_px = 2 var/aquarium_zone_max_px = 31 @@ -55,6 +58,7 @@ create_reagents(6, SEALED_CONTAINER) RegisterSignal(reagents, COMSIG_REAGENTS_NEW_REAGENT, PROC_REF(start_autofeed)) AddComponent(/datum/component/plumbing/aquarium) + ADD_KEEP_TOGETHER(src, INNATE_TRAIT) /obj/structure/aquarium/proc/track_if_fish(atom/source, atom/initialized) SIGNAL_HANDLER @@ -108,16 +112,18 @@ */ //optional todo: hook up sending surface changed on aquarium changing layers switch(layer_type) + if(AQUARIUM_LAYER_MODE_BEHIND_GLASS) + return layer + AQUARIUM_BELOW_GLASS_LAYER if(AQUARIUM_LAYER_MODE_BOTTOM) return layer + AQUARIUM_MIN_OFFSET if(AQUARIUM_LAYER_MODE_TOP) return layer + AQUARIUM_MAX_OFFSET if(AQUARIUM_LAYER_MODE_AUTO) - var/chosen_layer = layer + AQUARIUM_MIN_OFFSET + AQUARIUM_LAYER_STEP - while((chosen_layer in used_layers) && (chosen_layer <= layer + AQUARIUM_MAX_OFFSET)) + var/chosen_layer = AQUARIUM_MIN_OFFSET + AQUARIUM_LAYER_STEP + while((chosen_layer in used_layers) && (chosen_layer <= AQUARIUM_MAX_OFFSET)) chosen_layer += AQUARIUM_LAYER_STEP used_layers += chosen_layer - return chosen_layer + return layer + chosen_layer /obj/structure/aquarium/proc/free_layer(value) used_layers -= value @@ -129,14 +135,23 @@ .[AQUARIUM_PROPERTIES_PY_MIN] = aquarium_zone_min_py .[AQUARIUM_PROPERTIES_PY_MAX] = aquarium_zone_max_py +/obj/structure/aquarium/update_icon() + . = ..() + ///"aquarium_map" is used for mapping, so mappers can tell what it's. + icon_state = "aquarium_base" + /obj/structure/aquarium/update_overlays() . = ..() if(panel_open) . += "panel" - //Glass overlay goes on top of everything else. - var/mutable_appearance/glass_overlay = mutable_appearance(icon,broken ? broken_glass_icon_state : glass_icon_state,layer=AQUARIUM_MAX_OFFSET-1) - . += glass_overlay + ///The glass overlay + var/suffix = fluid_type == AQUARIUM_FLUID_AIR ? "air" : "water" + if(broken) + suffix += "_broken" + . += mutable_appearance(icon, "aquarium_glass_cracks", layer = layer + AQUARIUM_BORDERS_LAYER) + . += mutable_appearance(icon, "aquarium_glass_[suffix]", layer = layer + AQUARIUM_GLASS_LAYER) + . += mutable_appearance(icon, "aquarium_borders", layer = layer + AQUARIUM_BORDERS_LAYER) /obj/structure/aquarium/examine(mob/user) . = ..() @@ -338,11 +353,14 @@ #undef AQUARIUM_LAYER_STEP #undef AQUARIUM_MIN_OFFSET #undef AQUARIUM_MAX_OFFSET +#undef AQUARIUM_GLASS_LAYER +#undef AQUARIUM_BORDERS_LAYER +#undef AQUARIUM_BELOW_GLASS_LAYER /obj/structure/aquarium/prefilled/Initialize(mapload) . = ..() - new /obj/item/aquarium_prop/rocks(src) + new /obj/item/aquarium_prop/sand(src) new /obj/item/aquarium_prop/seaweed(src) new /obj/item/fish/goldfish(src) diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index d7547e92ef6..3aafa178f26 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -127,10 +127,10 @@ icon_state = "seaweeds_back" layer_mode = AQUARIUM_LAYER_MODE_BOTTOM -/obj/item/aquarium_prop/rockfloor - name = "rock floor" - icon_state = "rockfloor" - layer_mode = AQUARIUM_LAYER_MODE_BOTTOM +/obj/item/aquarium_prop/sand + name = "aquarium sand" + icon_state = "sand" + layer_mode = AQUARIUM_LAYER_MODE_BEHIND_GLASS /obj/item/aquarium_prop/treasure name = "tiny treasure chest" diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index 5ff62266ad9..51fcf61307a 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -203,6 +203,8 @@ name = "needlefish" desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." icon_state = "needlefish" + dedicated_in_aquarium_icon_state = "needlefish_small" + sprite_width = 7 required_fluid_type = AQUARIUM_FLUID_SALTWATER stable_population = 12 fillet_type = null @@ -216,6 +218,9 @@ name = "armorfish" desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." icon_state = "armorfish" + dedicated_in_aquarium_icon_state = "armorfish_small" + sprite_height = 5 + sprite_width = 6 required_fluid_type = AQUARIUM_FLUID_SALTWATER stable_population = 10 fillet_type = /obj/item/food/fishmeat/armorfish @@ -231,8 +236,6 @@ dedicated_in_aquarium_icon_state = "chrab_small" sprite_height = 9 sprite_width = 8 - source_height = 9 - source_width = 8 stable_population = 4 feeding_frequency = 15 MINUTES random_case_rarity = FISH_RARITY_RARE diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 3f34222ad87..2a18b1c46e8 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -8,9 +8,10 @@ /obj/item/fishing_line name = "fishing line reel" - desc = "Simple fishing line." + desc = "A fishing line. In spite of its simplicity, the added length will make fishing a speck easier." icon = 'icons/obj/fishing.dmi' icon_state = "reel_blue" + w_class = WEIGHT_CLASS_SMALL ///A list of traits that this fishing line has, checked by fish traits and the minigame. var/list/fishing_line_traits /// Color of the fishing line @@ -39,23 +40,18 @@ /obj/item/fishing_line/sinew name = "fishing sinew" - desc = "An all-natural fishing line made of stretched out sinew." + desc = "An all-natural fishing line made of stretched out sinew. A bit stiff, but usable to fish in extreme enviroments." icon = 'icons/obj/fishing.dmi' icon_state = "reel_sinew" + icon_state = "reel_green" + fishing_line_traits = FISHING_LINE_REINFORCED|FISHING_LINE_STIFF line_color = "#d1cca3" -/datum/crafting_recipe/sinew_line - name = "Sinew Fishing Line Reel" - result = /obj/item/fishing_line/sinew - reqs = list(/obj/item/stack/sheet/sinew = 2) - time = 2 SECONDS - category = CAT_TOOLS - // Hooks /obj/item/fishing_hook name = "simple fishing hook" - desc = "A simple fishing hook." + desc = "A simple fishing hook. Don't expect to hook onto anything without one." icon = 'icons/obj/fishing.dmi' icon_state = "hook" w_class = WEIGHT_CLASS_TINY @@ -85,6 +81,13 @@ /obj/item/fishing_hook/proc/get_hook_bonus_multiplicative(fish_type) return FISHING_DEFAULT_HOOK_BONUS_MULTIPLICATIVE +///Check if tha target can be caught by the hook +/obj/item/fishing_hook/proc/can_be_hooked(atom/target) + return isitem(target) + +///Any special effect when hooking a target that's not managed by the fishing rod. +/obj/item/fishing_hook/proc/hook_attached(atom/target, obj/item/fishing_rod/rod) + return /** * Is there a reason why this hook couldn't fish in target_fish_source? @@ -133,6 +136,13 @@ rod_overlay_icon_state = "hook_rescue_overlay" chasm_detritus_type = /datum/chasm_detritus/restricted/bodies +/obj/item/fishing_hook/rescue/can_be_hooked(atom/target) + return ..() || isliving(target) + +/obj/item/fishing_hook/rescue/hook_attached(atom/target, obj/item/fishing_rod/rod) + if(isliving(target)) + var/mob/living/living_target = target + living_target.apply_status_effect(/datum/status_effect/grouped/hooked, rod.fishing_line) // This hook can only fish in chasms. /obj/item/fishing_hook/rescue/reason_we_cant_fish(datum/fish_source/target_fish_source) @@ -155,13 +165,6 @@ desc = "A simple hook carved from sharpened bone" icon_state = "hook_bone" -/datum/crafting_recipe/bone_hook - name = "Goliath Bone Hook" - result = /obj/item/fishing_hook/bone - reqs = list(/obj/item/stack/sheet/bone = 1) - time = 2 SECONDS - category = CAT_TOOLS - /obj/item/fishing_hook/stabilized name = "gyro-stabilized hook" desc = "A quirky hook that grants the user a better control of the tool, allowing them to move the bait both and up and down when reeling in, otherwise keeping it in place." @@ -177,9 +180,18 @@ name = "jawed hook" desc = "Despite hints of rust, this gritty beartrap-like hook hybrid manages to look even more threating than the real thing. May neptune have mercy of whatever gets caught in its jaws." icon_state = "jaws" + w_class = WEIGHT_CLASS_NORMAL fishing_hook_traits = FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_KILL rod_overlay_icon_state = "hook_jaws_overlay" +/obj/item/fishing_hook/jaws/can_be_hooked(atom/target) + return ..() || isliving(target) + +/obj/item/fishing_hook/jaws/hook_attached(atom/target, obj/item/fishing_rod/rod) + if(isliving(target)) + var/mob/living/living_target = target + living_target.apply_status_effect(/datum/status_effect/grouped/hooked/jaws, rod.fishing_line) + /obj/item/storage/toolbox/fishing name = "fishing toolbox" desc = "Contains everything you need for your fishing trip." @@ -198,7 +210,7 @@ /obj/item/storage/toolbox/fishing/PopulateContents() new /obj/item/bait_can/worm(src) - new /obj/item/fishing_rod(src) + new /obj/item/fishing_rod/unslotted(src) new /obj/item/fishing_hook(src) new /obj/item/fishing_line(src) @@ -214,7 +226,7 @@ atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL //It can still hold a fishing rod /obj/item/storage/toolbox/fishing/small/PopulateContents() - new /obj/item/fishing_rod(src) + new /obj/item/fishing_rod/unslotted(src) new /obj/item/fishing_hook(src) new /obj/item/fishing_line(src) diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 81e8b3a6943..a5e1dd142b1 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -156,8 +156,12 @@ trait.minigame_mod(rod, user, src) /// Enable special parameters if(rod.line) + completion_gain += 1 // Any fishing line will provide a small boost by default if(rod.line.fishing_line_traits & FISHING_LINE_BOUNCY) completion_loss -= 2 + if(rod.line.fishing_line_traits & FISHING_LINE_STIFF) + completion_loss += 1 + completion_gain -= 1 if(rod.hook) if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) bait_bounce_mult = 0.1 diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 1abba8e414c..8a3035a9cc9 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -1,6 +1,4 @@ -#define ROD_SLOT_BAIT "bait" -#define ROD_SLOT_LINE "line" -#define ROD_SLOT_HOOK "hook" +#define FISHING_ROD_REEL_CAST_RANGE 2 /obj/item/fishing_rod name = "fishing rod" @@ -16,18 +14,18 @@ w_class = WEIGHT_CLASS_HUGE /// How far can you cast this - var/cast_range = 5 + var/cast_range = 3 /// Fishing minigame difficulty modifier (additive) var/difficulty_modifier = 0 /// Explaination of rod functionality shown in the ui var/ui_description = "A classic fishing rod, with no special qualities." var/obj/item/bait - var/obj/item/fishing_line/line - var/obj/item/fishing_hook/hook + var/obj/item/fishing_line/line = /obj/item/fishing_line + var/obj/item/fishing_hook/hook = /obj/item/fishing_hook /// Currently hooked item for item reeling - var/obj/item/currently_hooked_item + var/atom/movable/currently_hooked /// Fishing line visual for the hooked item var/datum/beam/fishing_line/fishing_line @@ -45,11 +43,19 @@ . = ..() register_context() register_item_context() + + if(ispath(bait)) + set_slot(new bait(src), ROD_SLOT_BAIT) + if(ispath(hook)) + set_slot(new hook(src), ROD_SLOT_HOOK) + if(ispath(line)) + set_slot(new line(src), ROD_SLOT_LINE) + update_appearance() /obj/item/fishing_rod/add_context(atom/source, list/context, obj/item/held_item, mob/user) if(src == held_item) - if(currently_hooked_item) + if(currently_hooked) context[SCREENTIP_CONTEXT_LMB] = "Reel in" context[SCREENTIP_CONTEXT_RMB] = "Modify" return CONTEXTUAL_SCREENTIP_SET @@ -57,14 +63,11 @@ /obj/item/fishing_rod/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) . = ..() - if(currently_hooked_item) + if(currently_hooked) context[SCREENTIP_CONTEXT_LMB] = "Reel in" return CONTEXTUAL_SCREENTIP_SET return NONE -/obj/item/fishing_rod/Destroy(force) - return ..() - /obj/item/fishing_rod/examine(mob/user) . = ..() var/list/equipped_stuff = list() @@ -72,35 +75,12 @@ equipped_stuff += "[icon2html(line, user)] [line.name]" if(hook) equipped_stuff += "[icon2html(hook, user)] [hook.name]" + if(bait) + equipped_stuff += "[icon2html(bait, user)] [bait] as bait." if(length(equipped_stuff)) . += span_notice("It has \a [english_list(equipped_stuff)] equipped.") - if(bait) - . += span_notice("\a [icon2html(bait, user)] [bait] is being used as bait.") - else - . += span_warning("It doesn't have any bait attached. Fishing will be more tedious!") - . += span_notice("Right-Click in your active hand to access its slots UI") - -/** - * Catch weight modifier for the given fish_type (or FISHING_DUD) - * and source, multiplicative. Called before `additive_fish_bonus()`. - */ -/obj/item/fishing_rod/proc/multiplicative_fish_bonus(fish_type, datum/fish_source/source) - if(!hook) - return FISHING_DEFAULT_HOOK_BONUS_MULTIPLICATIVE - - return hook.get_hook_bonus_multiplicative(fish_type) - - -/** - * Catch weight modifier for the given fish_type (or FISHING_DUD) - * and source, additive. Called after `multiplicative_fish_bonus()`. - */ -/obj/item/fishing_rod/proc/additive_fish_bonus(fish_type, datum/fish_source/source) - if(!hook) - return FISHING_DEFAULT_HOOK_BONUS_ADDITIVE - - return hook.get_hook_bonus_additive(fish_type) - + if(!bait) + . += span_warning("It doesn't have a bait attached to it. Fishing will be more tedious!") /** * Is there a reason why this fishing rod couldn't fish in target_fish_source? @@ -126,16 +106,34 @@ update_icon() /obj/item/fishing_rod/interact(mob/user) - if(currently_hooked_item) + if(currently_hooked) reel(user) /obj/item/fishing_rod/proc/reel(mob/user) - //Could use sound here for feedback - if(do_after(user, 1 SECONDS, currently_hooked_item)) - // Should probably respect and used force move later - step_towards(currently_hooked_item, get_turf(src)) - if(get_dist(currently_hooked_item,get_turf(src)) < 1) + if(DOING_INTERACTION_WITH_TARGET(user, currently_hooked)) + return + playsound(src, SFX_REEL, 50, vary = FALSE) + if(!do_after(user, 0.8 SECONDS, currently_hooked, timed_action_flags = IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(fishing_line_check)))) + return + if(currently_hooked.anchored || currently_hooked.move_resist >= MOVE_FORCE_STRONG) + balloon_alert(user, "[currently_hooked.p_they()] won't budge!") + return + //Try to move it 'till it's under the user's feet, then try to pick it up + if(isitem(currently_hooked)) + step_towards(currently_hooked, get_turf(src)) + if(currently_hooked.loc == user.loc) + user.put_in_inactive_hand(currently_hooked) QDEL_NULL(fishing_line) + //Not an item, so just delete the line if it's adjacent to the user. + else if(get_dist(currently_hooked,get_turf(src)) > 1) + step_towards(currently_hooked, get_turf(src)) + if(get_dist(currently_hooked,get_turf(src)) <= 1) + QDEL_NULL(fishing_line) + else + QDEL_NULL(fishing_line) + +/obj/item/fishing_rod/proc/fishing_line_check() + return !QDELETED(fishing_line) /obj/item/fishing_rod/attack_self_secondary(mob/user, modifiers) . = ..() @@ -144,9 +142,11 @@ /obj/item/fishing_rod/pre_attack(atom/targeted_atom, mob/living/user, params) . = ..() /// Reel in if able - if(currently_hooked_item) + if(currently_hooked) reel(user) return TRUE + if(!hook) + balloon_alert(user, "install a hook first!") SEND_SIGNAL(targeted_atom, COMSIG_PRE_FISHING) /// Generates the fishing line visual from the current user to the target and updates inhands @@ -171,7 +171,7 @@ var/mob/user = loc user.update_held_items() fishing_line = null - currently_hooked_item = null + currently_hooked = null /obj/item/fishing_rod/dropped(mob/user, silent) . = ..() @@ -179,19 +179,15 @@ /// Hooks the item /obj/item/fishing_rod/proc/hook_item(mob/user, atom/target_atom) - if(currently_hooked_item) + if(currently_hooked) return - if(!can_be_hooked(target_atom)) + if(!hook.can_be_hooked(target_atom)) return - currently_hooked_item = target_atom + currently_hooked = target_atom create_fishing_line(target_atom) + hook.hook_attached(target_atom, src) SEND_SIGNAL(src, COMSIG_FISHING_ROD_HOOKED_ITEM, target_atom, user) -/// Checks what can be hooked -/obj/item/fishing_rod/proc/can_be_hooked(atom/movable/target) - // Could be made dependent on actual hook, ie magnet to hook metallic items - return isitem(target) - // Checks fishing line for interruptions and range /obj/item/fishing_rod/proc/check_los(datum/beam/source) SIGNAL_HANDLER @@ -206,7 +202,7 @@ . |= AFTERATTACK_PROCESSED_ITEM /// Reel in if able - if(currently_hooked_item) + if(currently_hooked) reel(user) return . @@ -216,7 +212,13 @@ ///Called by afterattack(). If the line to whatever that is is clear and we're not already busy, try fishing in it /obj/item/fishing_rod/proc/cast_line(atom/target, mob/user, proximity_flag) - if(casting || currently_hooked_item || proximity_flag || !CheckToolReach(user, target, cast_range)) + if(casting || currently_hooked || proximity_flag) + return + if(!hook) + balloon_alert(user, "install a hook first!") + return + if(!CheckToolReach(user, target, cast_range)) + balloon_alert(user, "cannot reach there!") return /// Annoyingly pre attack is only called in melee SEND_SIGNAL(target, COMSIG_PRE_FISHING) @@ -234,7 +236,7 @@ /// Called by hook projectile when hitting things /obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) var/mob/user = loc - if(!istype(user)) + if(!hook || !istype(user)) return if(SEND_SIGNAL(atom_hit_by_hook_projectile, COMSIG_FISHING_ROD_CAST, src, user) & FISHING_ROD_CAST_HANDLED) return @@ -328,6 +330,8 @@ data["hook_name"] = format_text(hook?.name) data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state)) : null + data["busy"] = fishing_line + data["description"] = ui_description return data @@ -377,23 +381,16 @@ // Trying to remove the item if(!new_item && current_item) user.put_in_hands(current_item) - update_icon() - return + balloon_alert(user, "[slot] removed") // Trying to insert item into empty slot - if(new_item && !current_item) + else if(new_item && !current_item) if(!slot_check(new_item, slot)) return if(user.transferItemToLoc(new_item,src)) - switch(slot) - if(ROD_SLOT_BAIT) - bait = new_item - if(ROD_SLOT_HOOK) - hook = new_item - if(ROD_SLOT_LINE) - line = new_item - update_icon() + set_slot(new_item, slot) + balloon_alert(user, "[slot] installed") /// Trying to swap item - if(new_item && current_item) + else if(new_item && current_item) if(!slot_check(new_item,slot)) return if(user.transferItemToLoc(new_item,src)) @@ -405,33 +402,46 @@ if(ROD_SLOT_LINE) line = new_item user.put_in_hands(current_item) - update_icon() + balloon_alert(user, "[slot] swapped") + update_icon() + playsound(src, 'sound/items/click.ogg', 50, TRUE) + +///assign an item to the given slot and its standard effects, while Exited() should handle unsetting the slot. +/obj/item/fishing_rod/proc/set_slot(obj/item/equipment, slot) + switch(slot) + if(ROD_SLOT_BAIT) + bait = equipment + if(ROD_SLOT_HOOK) + hook = equipment + if(ROD_SLOT_LINE) + line = equipment + cast_range += FISHING_ROD_REEL_CAST_RANGE /obj/item/fishing_rod/Exited(atom/movable/gone, direction) . = ..() if(gone == bait) bait = null if(gone == line) + cast_range -= FISHING_ROD_REEL_CAST_RANGE line = null if(gone == hook) + QDEL_NULL(fishing_line) hook = null +///Found in the fishing toolbox (the hook and line are separate items) +/obj/item/fishing_rod/unslotted + hook = null + line = null + /obj/item/fishing_rod/bone name = "bone fishing rod" desc = "A humble rod, made with whatever happened to be on hand." icon_state = "fishing_rod_bone" reel_overlay = "reel_bone" default_line_color = "red" - -/datum/crafting_recipe/bone_rod - name = "Bone Fishing Rod" - result = /obj/item/fishing_rod/bone - time = 5 SECONDS - reqs = list(/obj/item/stack/sheet/leather = 1, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/bone = 2) - category = CAT_TOOLS + line = null //sinew line (usable to fish in lava) not included + hook = /obj/item/fishing_hook/bone /obj/item/fishing_rod/telescopic name = "telescopic fishing rod" @@ -442,8 +452,6 @@ w_class = WEIGHT_CLASS_NORMAL ui_description = "A collapsible fishing rod that can fit within a backpack." reel_overlay = "reel_telescopic" - ///Whether the rod is exteded or not. Tied to the transforming element. - var/active = FALSE ///The force of the item when extended. var/active_force = 8 @@ -454,30 +462,31 @@ RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/fishing_rod/telescopic/reason_we_cant_fish(datum/fish_source/target_fish_source) - if(!active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return "You need to extend your fishing rod before you can cast the line." return ..() /obj/item/fishing_rod/telescopic/cast_line(atom/target, mob/user, proximity_flag) - if(!active) - to_chat(user, "You need to extend your fishing rod before you can cast the line.") + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + if(!proximity_flag) + balloon_alert(user, "extend the rod first!") return return ..() /obj/item/fishing_rod/telescopic/get_fishing_overlays() - if(!active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return list() return ..() /obj/item/fishing_rod/telescopic/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file) - if(!active) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return list() return ..() ///Stops the fishing rod from being collapsed while fishing. /obj/item/fishing_rod/telescopic/proc/pre_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - if(active) + if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return //the fishing minigame uses the attack_self signal to let the user end it early without having to drop the rod. if(HAS_TRAIT(user, TRAIT_GONE_FISHING)) @@ -487,14 +496,12 @@ /obj/item/fishing_rod/telescopic/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - src.active = active inhand_icon_state = active ? "rod" : null // When inactive, there is no inhand icon_state. if(user) balloon_alert(user, active ? "extended" : "collapsed") playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) update_appearance(UPDATE_OVERLAYS) - if(fishing_line) - QDEL_NULL(fishing_line) + QDEL_NULL(fishing_line) return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/fishing_rod/telescopic/master @@ -505,6 +512,9 @@ icon_state = "fishing_rod_master" reel_overlay = "reel_master" active_force = 13 //It's that sturdy + cast_range = 5 + line = /obj/item/fishing_line/bouncy + hook = /obj/item/fishing_hook/weighted /obj/item/fishing_rod/tech name = "advanced fishing rod" @@ -512,6 +522,7 @@ ui_description = "This rod has an infinite supply of synth-bait. Also doubles as an Experi-Scanner for fish." icon_state = "fishing_rod_science" reel_overlay = "reel_science" + bait = /obj/item/food/bait/doughball/synthetic /obj/item/fishing_rod/tech/Initialize(mapload) . = ..() @@ -529,10 +540,6 @@ experiment_signals = fishing_signals, \ ) - var/obj/item/food/bait/doughball/synthetic/infinite_supply_of_bait = new(src) - bait = infinite_supply_of_bait - update_icon() - /obj/item/fishing_rod/tech/examine(mob/user) . = ..() . += span_notice("Alt-Click to access the Experiment Configuration UI") @@ -561,6 +568,12 @@ var/obj/item/fishing_rod/owner var/datum/beam/our_line +/obj/projectile/fishing_cast/fire(angle, atom/direct_target) + if(owner.hook) + icon_state = owner.hook.icon_state + transform = transform.Scale(1, -1) + return ..() + /obj/projectile/fishing_cast/Impact(atom/hit_atom) . = ..() owner.hook_hit(hit_atom) @@ -634,3 +647,5 @@ if(NORTH) override_origin_pixel_x = lefthand ? lefthand_n_px : righthand_n_px override_origin_pixel_y = lefthand ? lefthand_n_py : righthand_n_py + +#undef FISHING_ROD_REEL_CAST_RANGE diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 120348038f1..887b8f3a2a3 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -240,8 +240,8 @@ GLOBAL_LIST(fishing_property_cache) var/list/final_table = fish_table.Copy() for(var/result in final_table) - final_table[result] *= rod.multiplicative_fish_bonus(result, src) - final_table[result] += rod.additive_fish_bonus(result, src) //Decide on order here so it can be multiplicative + final_table[result] *= rod.hook?.get_hook_bonus_multiplicative(result) + final_table[result] += rod.hook?.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative if(ispath(result, /obj/item/fish)) //Modify fish roll chance var/obj/item/fish/caught_fish = result diff --git a/code/modules/food_and_drinks/machinery/food_cart.dm b/code/modules/food_and_drinks/machinery/food_cart.dm index da92d040f27..e068b7b8ce2 100644 --- a/code/modules/food_and_drinks/machinery/food_cart.dm +++ b/code/modules/food_and_drinks/machinery/food_cart.dm @@ -8,7 +8,7 @@ anchored = FALSE use_power = NO_POWER_USE req_access = list(ACCESS_KITCHEN) - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION var/unpacked = FALSE var/obj/machinery/griddle/stand/cart_griddle var/obj/machinery/smartfridge/food/cart_smartfridge diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index af5dbc5528d..e3abf6bf9de 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -1,4 +1,10 @@ -#define PREFILL_AMOUNT 5 +///How many units of a reagent is needed to make a cone. +#define CONE_REAGENET_NEEDED 1 + +///The vat is set to dispense ice cream. +#define VAT_MODE_ICECREAM "ice cream" +///The vat is set to dispense cones. +#define VAT_MODE_CONES "cones" /obj/machinery/icecream_vat name = "ice cream vat" @@ -10,12 +16,20 @@ use_power = NO_POWER_USE layer = BELOW_OBJ_LAYER max_integrity = 300 - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE - var/list/product_types = list() + + ///Which mode the icecream vat is set to dispense, VAT_MODE_ICECREAM or VAT_MODE_CONES + var/vat_mode = VAT_MODE_ICECREAM + ///Boolean on whether or not to add 'icecream_vat_reagents' into the icecream vat on Initialize. + var/preinstall_reagents = TRUE + ///The selected flavor of ice cream that we'll dispense when hit with an ice cream cone. var/selected_flavour = ICE_CREAM_VANILLA - var/obj/item/reagent_containers/beaker + ///The beaker inside of the vat used to make custom ice cream. + var/obj/item/reagent_containers/custom_ice_cream_beaker + ///List of ice creams as icons used for the radial menu. + var/static/list/ice_cream_icons /// List of prototypes of dispensable ice cream cones. path as key, instance as assoc. var/static/list/obj/item/food/icecream/cone_prototypes + ///List of all reagenets the icecream vat will spawn with, if preinstall_reagents is TRUE. var/static/list/icecream_vat_reagents = list( /datum/reagent/consumable/milk = 6, /datum/reagent/consumable/korta_milk = 6, @@ -36,6 +50,9 @@ /datum/reagent/consumable/cherryjelly = 6, ) +/obj/machinery/icecream_vat/no_preinstalled_reagents + preinstall_reagents = FALSE + /obj/machinery/icecream_vat/Initialize(mapload) . = ..() @@ -45,169 +62,212 @@ var/obj/item/food/icecream/cone = new cone_path if(cone.ingredients) cone_prototypes[cone_path] = cone - cone.ingredients_text = "(Ingredients: [reagent_paths_list_to_text(cone.ingredients)])" else + stack_trace("Ice cream cone [cone] (TYPE: [cone_path]) has been found without ingredients, please make a bug report about this.") qdel(cone) + if(!ice_cream_icons) + ice_cream_icons = list() + for(var/flavor in GLOB.ice_cream_flavours) + var/datum/ice_cream_flavour/flavor_datum = GLOB.ice_cream_flavours[flavor] + if(flavor_datum.hidden) + continue + ice_cream_icons[flavor] = make_ice_cream_color(flavor_datum) - create_reagents(300, NO_REACT | OPENCONTAINER) + RegisterSignal(src, COMSIG_ATOM_REAGENT_EXAMINE, PROC_REF(allow_reagent_scan)) + + create_reagents(300, NO_REACT|TRANSPARENT) reagents.chem_temp = T0C //So ice doesn't melt - for(var/flavour in GLOB.ice_cream_flavours) - if(GLOB.ice_cream_flavours[flavour].hidden) - continue - product_types[flavour] = PREFILL_AMOUNT - for(var/cone in cone_prototypes) - product_types[cone] = PREFILL_AMOUNT + register_context() - for(var/reagent in icecream_vat_reagents) - reagents.add_reagent(reagent, icecream_vat_reagents[reagent], reagtemp = T0C) + if(preinstall_reagents) + for(var/reagent in icecream_vat_reagents) + reagents.add_reagent(reagent, icecream_vat_reagents[reagent], reagtemp = T0C) -/obj/machinery/icecream_vat/ui_interact(mob/user) +/obj/machinery/icecream_vat/Exited(atom/movable/gone, direction) . = ..() - var/dat - dat += "ICE CREAM
" - dat += "Dispensing: [selected_flavour] icecream

" - for(var/flavour in GLOB.ice_cream_flavours) - if(GLOB.ice_cream_flavours[flavour].hidden) - continue - dat += "[capitalize(flavour)] ice cream: Select Make x5 [product_types[flavour]] scoops left[GLOB.ice_cream_flavours[flavour].ingredients_text].
" - dat += "
CONES
" - for(var/cone in cone_prototypes) - dat += "[capitalize(cone_prototypes[cone].name)]s: Dispense Make x5 [product_types[cone]] cones left[cone_prototypes[cone].ingredients_text].
" - dat += "
" - if(beaker) - dat += "BEAKER CONTENT
" - for(var/datum/reagent/R in beaker.reagents.reagent_list) - dat += "[R.name]: [R.volume]u
" - dat += "Refill from beaker
" - dat += "
" - dat += "VAT CONTENT
" - for(var/datum/reagent/R in reagents.reagent_list) - dat += "[R.name]: [R.volume]" - dat += "Purge
" - dat += "Refresh Close" + if(gone == custom_ice_cream_beaker) + custom_ice_cream_beaker = null - var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src) - popup.set_content(dat) - popup.open() +/obj/machinery/icecream_vat/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item) + if(is_reagent_container(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Insert beaker" + context[SCREENTIP_CONTEXT_RMB] = "Transfer beaker reagents" + else if(istype(held_item, /obj/item/food/icecream)) + context[SCREENTIP_CONTEXT_LMB] = "Take scoop of [selected_flavour] ice cream" + return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/icecream_vat/attackby(obj/item/O, mob/user, params) - if(is_reagent_container(O) && !(O.item_flags & ABSTRACT) && O.is_open_container()) - . = TRUE //no afterattack - var/obj/item/reagent_containers/B = O - if(!user.transferItemToLoc(B, src)) - return - replace_beaker(user, B) - to_chat(user, span_notice("You add [B] to [src].")) - updateUsrDialog() - update_appearance() + switch(vat_mode) + if(VAT_MODE_ICECREAM) + context[SCREENTIP_CONTEXT_LMB] = "Select flavor" + context[SCREENTIP_CONTEXT_RMB] = "Change mode to cones" + if(VAT_MODE_CONES) + context[SCREENTIP_CONTEXT_LMB] = "Make cone" + context[SCREENTIP_CONTEXT_RMB] = "Change mode to flavors" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/icecream_vat/attackby(obj/item/reagent_containers/beaker, mob/user, params) + . = ..() + if(.) return - else if(O.is_drainable()) + if(!beaker || !istype(beaker) || !beaker.reagents || (beaker.item_flags & ABSTRACT) || !beaker.is_open_container()) return - else - return ..() -/obj/machinery/icecream_vat/proc/RefillFromBeaker() - if(!beaker || !beaker.reagents) - return - for(var/datum/reagent/R in beaker.reagents.reagent_list) - if(R.type in icecream_vat_reagents) - beaker.reagents.trans_to(src, R.volume, target_id = R.type) - say("Internalizing reagent.") - playsound(src, 'sound/items/drink.ogg', 25, TRUE) - return - -/obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount, list/ingredients) - var/recipe_amount = amount * 3 //prevents reagent duping by requring roughly the amount of reagenst you gain back by grinding. - for(var/R in ingredients) - if(!reagents.has_reagent(R, recipe_amount)) - amount = 0 - break - if(amount) - for(var/R in ingredients) - reagents.remove_reagent(R, recipe_amount) - product_types[make_type] += amount - var/obj/item/food/icecream/cone = cone_prototypes[make_type] - if(cone) - visible_message(span_info("[user] cooks up some [cone.name]s.")) + if(custom_ice_cream_beaker) + if(beaker.forceMove(src)) + try_put_in_hand(custom_ice_cream_beaker, user) + balloon_alert(user, "beakers swapped") + custom_ice_cream_beaker = beaker else - visible_message(span_info("[user] whips up some [make_type] icecream.")) - else - to_chat(user, span_warning("You don't have the ingredients to make this!")) - -/obj/machinery/icecream_vat/Topic(href, href_list) - if(..()) + balloon_alert(user, "beaker slot full!") return - var/mob/user = usr - if(href_list["select"]) - var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[href_list["select"]] - if(!flavour || flavour.hidden) //Nice try, tex. - return - visible_message(span_notice("[user] sets [src] to dispense [href_list["select"]] flavoured ice cream.")) - selected_flavour = flavour.name + if(beaker.forceMove(src)) + balloon_alert(user, "beaker inserted") + custom_ice_cream_beaker = beaker - if(href_list["cone"]) - var/obj/item/food/icecream/cone_path = text2path(href_list["cone"]) - if(!cone_path) - return - if(product_types[cone_path] >= 1) - product_types[cone_path]-- - var/obj/item/food/icecream/cone = new cone_path(get_turf(src)) - if(!user.put_in_hands(cone)) - cone.forceMove(drop_location()) - visible_message(span_info("[user] dispenses a crunchy [cone.name] from [src].")) - else - to_chat(user, span_warning("There are no [initial(cone_path.name)]s left!")) +/obj/machinery/icecream_vat/attackby_secondary(obj/item/reagent_containers/beaker, mob/user, params) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!beaker || !istype(beaker) || !beaker.reagents || (beaker.item_flags & ABSTRACT) || !beaker.is_open_container()) + return SECONDARY_ATTACK_CONTINUE_CHAIN + var/added_reagents = FALSE + for(var/datum/reagent/beaker_reagents in beaker.reagents.reagent_list) + if(beaker_reagents.type in icecream_vat_reagents) + added_reagents = TRUE + beaker.reagents.trans_to(src, beaker_reagents.volume, target_id = beaker_reagents.type) - if(href_list["make"]) - var/datum/ice_cream_flavour/flavour = GLOB.ice_cream_flavours[href_list["make"]] - if(!flavour || flavour.hidden) //Nice try, tex. - return - var/amount = (text2num(href_list["amount"])) - make(user, href_list["make"], amount, flavour.ingredients) + if(added_reagents) + balloon_alert(user, "refilling reagents") + playsound(src, 'sound/items/drink.ogg', 25, TRUE) + else + balloon_alert(user, "no reagents to transfer!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(href_list["make_cone"]) - var/path = text2path(href_list["make_cone"]) - var/obj/item/food/icecream/cone = cone_prototypes[path] - if(!cone) //Nice try, tex. - return - var/amount = (text2num(href_list["amount"])) - make(user, path, amount, cone.ingredients) +/obj/machinery/icecream_vat/attack_hand_secondary(mob/user, list/modifiers) + if(swap_modes(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ..() - if(href_list["disposeI"]) - reagents.del_reagent(text2path(href_list["disposeI"])) +/obj/machinery/icecream_vat/attack_robot_secondary(mob/living/silicon/robot/user) + if(swap_modes(user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ..() - if(href_list["refill"]) - RefillFromBeaker() +/obj/machinery/icecream_vat/AltClick(mob/user) + if(!user.can_interact_with(src)) + return FALSE + if(custom_ice_cream_beaker) + balloon_alert(user, "removed beaker") + try_put_in_hand(custom_ice_cream_beaker, user) + return ..() - updateDialog() +/obj/machinery/icecream_vat/interact(mob/living/user) + . = ..() + if (.) + return - if(href_list["refresh"]) - updateDialog() + var/list/choices = list() - if(href_list["close"]) - user.unset_machine() - user << browse(null,"window=icecreamvat") - return + switch(vat_mode) + if(VAT_MODE_ICECREAM) + for(var/flavor_key in ice_cream_icons) + var/datum/ice_cream_flavour/flavor_datum = GLOB.ice_cream_flavours[flavor_key] + var/datum/radial_menu_choice/option = new + option.image = ice_cream_icons[flavor_key] + option.info = span_boldnotice("[flavor_datum.ingredients_text]") + choices[flavor_key] = option + if(VAT_MODE_CONES) + for(var/cone_key in cone_prototypes) + var/obj/item/food/icecream/cone_item = cone_prototypes[cone_key] + var/datum/radial_menu_choice/option = new + option.image = cone_prototypes[cone_key] + option.info = span_boldnotice("[cone_item.ingredients_text]") + choices[cone_key] = option + + var/choice = show_radial_menu( + user, + src, + choices, + require_near = TRUE, + tooltips = TRUE, + autopick_single_option = FALSE, + ) + + if(!choice) + return + var/datum/ice_cream_flavour/flavor = GLOB.ice_cream_flavours[choice] + if(flavor) + selected_flavour = flavor.name + balloon_alert(user, "making [selected_flavour]") + var/obj/item/food/icecream/cone = cone_prototypes[choice] + if(cone) + make_cone(user, choice, cone.ingredients) + +/obj/machinery/icecream_vat/proc/make_ice_cream_color(datum/ice_cream_flavour/flavor) + if(!flavor.color) + return + var/image/ice_cream_icon = image('icons/obj/service/kitchen.dmi', "icecream_custom") + ice_cream_icon.color = flavor.color + return ice_cream_icon /obj/machinery/icecream_vat/deconstruct(disassembled = TRUE) if(!(obj_flags & NO_DECONSTRUCTION)) new /obj/item/stack/sheet/iron(loc, 4) + if(custom_ice_cream_beaker) + custom_ice_cream_beaker.forceMove(loc) qdel(src) -/obj/machinery/icecream_vat/AltClick(mob/living/user) - . = ..() - if(!can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) +///Makes an ice cream cone of the make_type, using ingredients list as reagents used to make it. Puts in user's hand if possible. +/obj/machinery/icecream_vat/proc/make_cone(mob/user, make_type, list/ingredients) + for(var/reagents_needed in ingredients) + if(!reagents.has_reagent(reagents_needed, CONE_REAGENET_NEEDED)) + balloon_alert(user, "not enough ingredients!") + return + var/cone_type = cone_prototypes[make_type].type + if(!cone_type) return - replace_beaker(user) + var/obj/item/food/icecream/cone = new cone_type(src) -/obj/machinery/icecream_vat/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) - if(!user) + for(var/reagents_used in ingredients) + reagents.remove_reagent(reagents_used, CONE_REAGENET_NEEDED) + balloon_alert_to_viewers("cooks up [cone.name]", "cooks up [cone.name]") + try_put_in_hand(cone, user) + +///Makes ice cream if it can, then puts it in the ice cream cone we're being attacked with. +/obj/machinery/icecream_vat/proc/add_flavor_to_cone(datum/component/ice_cream_holder/source, mob/user, obj/item/food/icecream/cone) + var/datum/ice_cream_flavour/flavor = GLOB.ice_cream_flavours[selected_flavour] + if(!flavor) + CRASH("[user] was making ice cream of [selected_flavour] but had no flavor datum for it!") + + for(var/reagents_needed in flavor.ingredients) + if(!reagents.has_reagent(reagents_needed, CONE_REAGENET_NEEDED)) + balloon_alert(user, "not enough ingredients!") + return + + var/should_use_custom_ingredients = (flavor.takes_custom_ingredients && custom_ice_cream_beaker && custom_ice_cream_beaker.reagents.total_volume) + if(flavor.add_flavour(source, should_use_custom_ingredients ? custom_ice_cream_beaker.reagents : null)) + for(var/reagents_used in flavor.ingredients) + reagents.remove_reagent(reagents_used, CONE_REAGENET_NEEDED) + balloon_alert_to_viewers("scoops [selected_flavour]", "scoops [selected_flavour]") + +///Swaps the mode to the next one meant to be selected, then tells the user who changed it. +/obj/machinery/icecream_vat/proc/swap_modes(mob/user) + if(!user.can_perform_action(src)) return FALSE - if(beaker) - user.put_in_hands(beaker) - beaker = null - if(new_beaker) - beaker = new_beaker + switch(vat_mode) + if(VAT_MODE_ICECREAM) + vat_mode = VAT_MODE_CONES + if(VAT_MODE_CONES) + vat_mode = VAT_MODE_ICECREAM + balloon_alert(user, "dispensing [vat_mode]") return TRUE -#undef PREFILL_AMOUNT +///Allows any user to see what reagents are in the ice cream vat regardless of special gear. +/obj/machinery/icecream_vat/proc/allow_reagent_scan(datum/source, mob/user, list/examine_list, can_see_insides = FALSE) + SIGNAL_HANDLER + return ALLOW_GENERIC_REAGENT_EXAMINE + +#undef VAT_MODE_ICECREAM +#undef VAT_MODE_CONES +#undef CONE_REAGENET_NEEDED diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 0471f5e92ef..c4cc6d378e3 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -486,7 +486,7 @@ /obj/machinery/microwave/CtrlClick(mob/user) . = ..() - if(cell_powered && !isnull(cell) && anchored) + if(user.can_perform_action(src) && cell_powered && !isnull(cell) && anchored) user.put_in_hands(cell) balloon_alert(user, "removed cell") cell = null diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 8dbc90e80d1..ba66eebe2fb 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -6,6 +6,7 @@ desc = "Keeps cold things cold and hot things cold." icon = 'icons/obj/machines/smartfridge.dmi' icon_state = "smartfridge" + base_icon_state = "plant" layer = BELOW_OBJ_LAYER density = TRUE circuit = /obj/item/circuitboard/machine/smartfridge @@ -17,8 +18,6 @@ var/base_build_path = /obj/machinery/smartfridge /// Maximum number of items that can be loaded into the machine var/max_n_of_items = 1500 - /// The overlay for this fridge when it is filled with stuff - var/contents_icon_state = "plant" /// List of items that the machine starts with upon spawn var/list/initial_contents /// If the machine shows an approximate number of its contents on its sprite @@ -226,9 +225,10 @@ /obj/machinery/smartfridge/update_overlays() . = ..() + var/initial_icon_state = initial(icon_state) var/shown_contents_length = visible_items() if(visible_contents && shown_contents_length) - var/content_level = "[initial(icon_state)]-[contents_icon_state]" + var/content_level = "[initial_icon_state]-[base_icon_state]" switch(shown_contents_length) if(1 to 25) content_level += "-1" @@ -238,10 +238,10 @@ content_level += "-3" . += mutable_appearance(icon, content_level) - . += mutable_appearance(icon, "[initial(icon_state)]-glass[(machine_stat & BROKEN) ? "-broken" : ""]") + . += mutable_appearance(icon, "[initial_icon_state]-glass[(machine_stat & BROKEN) ? "-broken" : ""]") if(!machine_stat && has_emissive) - . += emissive_appearance(icon, "[initial(icon_state)]-light-mask", src, alpha = src.alpha) + . += emissive_appearance(icon, "[initial_icon_state]-light-mask", src, alpha = src.alpha) /obj/machinery/smartfridge/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -265,7 +265,7 @@ !(weapon.flags_1 & HOLOGRAM_1) && \ accept_check(weapon) \ ) - load(weapon) + load(weapon, user) user.visible_message(span_notice("[user] adds \the [weapon] to \the [src]."), span_notice("You add \the [weapon] to \the [src].")) SStgui.update_uis(src) if(visible_contents) @@ -282,7 +282,7 @@ !(object.flags_1 & HOLOGRAM_1) && \ accept_check(object) \ ) - load(object) + load(object, user) loaded++ SStgui.update_uis(src) @@ -328,7 +328,7 @@ * Arguments * * [weapon][obj/item] - the item to load. If the item is being held by a mo it will transfer it from hand else directly force move */ -/obj/machinery/smartfridge/proc/load(obj/item/weapon) +/obj/machinery/smartfridge/proc/load(obj/item/weapon, mob/user) if(ismob(weapon.loc)) var/mob/owner = weapon.loc if(!owner.transferItemToLoc(weapon, src)) @@ -437,6 +437,8 @@ can_atmos_pass = ATMOS_PASS_YES /// Is the rack currently drying stuff var/drying = FALSE + /// The reference to the last user's mind. Needed for the chef made trait to be properly applied correctly to dried food. + var/datum/weakref/current_user /obj/machinery/smartfridge/drying_rack/Initialize(mapload) . = ..() @@ -447,6 +449,10 @@ //so we don't drop any of the parent smart fridge parts upon deconstruction clear_components() +/obj/machinery/smartfridge/drying_rack/Destroy() + current_user = null + return ..() + /// We cleared out the components in initialize so we can optimize this /obj/machinery/smartfridge/drying_rack/visible_items() return contents.len @@ -505,7 +511,7 @@ switch(action) if("Dry") - toggle_drying(FALSE) + toggle_drying(FALSE, usr) return TRUE /obj/machinery/smartfridge/drying_rack/powered() @@ -516,9 +522,13 @@ if(!powered()) toggle_drying(TRUE) -/obj/machinery/smartfridge/drying_rack/load(obj/item/dried_object) //For updating the filled overlay +/obj/machinery/smartfridge/drying_rack/load(obj/item/dried_object, mob/user) //For updating the filled overlay . = ..() + if(!.) + return update_appearance() + if(drying && user?.mind) + current_user = WEAKREF(user.mind) /obj/machinery/smartfridge/drying_rack/update_overlays() . = ..() @@ -546,17 +556,20 @@ * Arguments * * forceoff - if TRUE will force the dryer off always */ -/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff) +/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff, mob/user) if(drying || forceoff) drying = FALSE + current_user = FALSE update_use_power(IDLE_POWER_USE) else drying = TRUE + if(user?.mind) + current_user = WEAKREF(user.mind) update_use_power(ACTIVE_POWER_USE) update_appearance() /obj/machinery/smartfridge/drying_rack/proc/rack_dry(obj/item/target) - SEND_SIGNAL(target, COMSIG_ITEM_DRIED) + SEND_SIGNAL(target, COMSIG_ITEM_DRIED, current_user) /obj/machinery/smartfridge/drying_rack/emp_act(severity) . = ..() @@ -571,7 +584,7 @@ name = "drink showcase" desc = "A refrigerated storage unit for tasty tasty alcohol." base_build_path = /obj/machinery/smartfridge/drinks - contents_icon_state = "drink" + base_icon_state = "drink" /obj/machinery/smartfridge/drinks/accept_check(obj/item/weapon) //not an item or valid container @@ -591,7 +604,7 @@ /obj/machinery/smartfridge/food desc = "A refrigerated storage unit for food." base_build_path = /obj/machinery/smartfridge/food - contents_icon_state = "food" + base_icon_state = "food" /obj/machinery/smartfridge/food/accept_check(obj/item/weapon) if(weapon.w_class >= WEIGHT_CLASS_BULKY) @@ -609,7 +622,7 @@ name = "smart slime extract storage" desc = "A refrigerated storage unit for slime extracts." base_build_path = /obj/machinery/smartfridge/extract - contents_icon_state = "slime" + base_icon_state = "slime" /obj/machinery/smartfridge/extract/accept_check(obj/item/weapon) return (istype(weapon, /obj/item/slime_extract) || istype(weapon, /obj/item/slime_scanner)) @@ -624,7 +637,7 @@ name = "smart petri dish storage" desc = "A refrigerated storage unit for petri dishes." base_build_path = /obj/machinery/smartfridge/petri - contents_icon_state = "petri" + base_icon_state = "petri" /obj/machinery/smartfridge/petri/accept_check(obj/item/weapon) return istype(weapon, /obj/item/petri_dish) @@ -640,24 +653,24 @@ desc = "A refrigerated storage unit for organ storage." max_n_of_items = 20 //vastly lower to prevent processing too long base_build_path = /obj/machinery/smartfridge/organ - contents_icon_state = "organ" + base_icon_state = "organ" /// The rate at which this fridge will repair damaged organs var/repair_rate = 0 /obj/machinery/smartfridge/organ/accept_check(obj/item/O) return (isorgan(O) || isbodypart(O)) -/obj/machinery/smartfridge/organ/load(obj/item/O) +/obj/machinery/smartfridge/organ/load(obj/item/item, mob/user) . = ..() if(!.) //if the item loads, clear can_decompose return - if(isorgan(O)) - var/obj/item/organ/organ = O + if(isorgan(item)) + var/obj/item/organ/organ = item organ.organ_flags |= ORGAN_FROZEN - if(isbodypart(O)) - var/obj/item/bodypart/bodypart = O + if(isbodypart(item)) + var/obj/item/bodypart/bodypart = item for(var/obj/item/organ/stored in bodypart.contents) stored.organ_flags |= ORGAN_FROZEN @@ -693,7 +706,7 @@ name = "smart chemical storage" desc = "A refrigerated storage unit for medicine storage." base_build_path = /obj/machinery/smartfridge/chemistry - contents_icon_state = "chem" + base_icon_state = "chem" /obj/machinery/smartfridge/chemistry/accept_check(obj/item/weapon) // not an item or reagent container @@ -744,7 +757,7 @@ name = "smart virus storage" desc = "A refrigerated storage unit for volatile sample storage." base_build_path = /obj/machinery/smartfridge/chemistry/virology - contents_icon_state = "viro" + base_icon_state = "viro" /obj/machinery/smartfridge/chemistry/virology/preloaded initial_contents = list( diff --git a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm index 3703a29cd93..77606f5e372 100644 --- a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm +++ b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm @@ -31,11 +31,6 @@ required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/drink/wine - results = list(/datum/reagent/consumable/ethanol/wine = 10) - required_reagents = list(/datum/reagent/consumable/grapejuice = 10) - required_catalysts = list(/datum/reagent/consumable/enzyme = 5) - /datum/chemical_reaction/drink/spacebeer results = list(/datum/reagent/consumable/ethanol/beer = 10) required_reagents = list(/datum/reagent/consumable/flour = 10) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 3b6092917b4..c557f75a631 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -284,3 +284,9 @@ required_reagents = list(/datum/reagent/consumable/flour = 1, /datum/reagent/consumable/nutriment/soup/dashi = 1) mix_message = "A smooth batter forms." reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/vinegar + results = list(/datum/reagent/consumable/vinegar = 5) + required_reagents = list(/datum/reagent/consumable/grapejuice = 5) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) + mix_message = "The smell of the mixture reminds you of how you lost access to the country club..." diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index ab6006631b7..db1d1ab9ddc 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -1228,7 +1228,6 @@ ) results = list( /datum/reagent/consumable/nutriment/soup/oatmeal = 20, - /datum/reagent/consumable/milk = 12, /datum/reagent/consumable/nutriment/vitamin = 8, ) percentage_of_nutriment_converted = 0 // Oats have barely any nutrients @@ -1484,12 +1483,15 @@ drink_type = MEAT | VEGETABLES /datum/chemical_reaction/food/soup/rootbread_soup - required_reagents = list(/datum/reagent/water = 50) + required_reagents = list( + /datum/reagent/water = 50, + /datum/reagent/consumable/eggyolk = 2, + /datum/reagent/consumable/eggwhite = 4 + ) required_ingredients = list( /obj/item/food/breadslice/root = 2, /obj/item/food/grown/garlic = 1, - /obj/item/food/grown/chili = 1, - /obj/item/food/egg = 1 + /obj/item/food/grown/chili = 1 ) results = list( /datum/reagent/consumable/nutriment/soup/rootbread = 30, diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 06b5e8952ed..4e7c63413ec 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -397,3 +397,71 @@ ) result = /obj/item/food/burger/sloppy_moe category = CAT_BURGER + +/datum/crafting_recipe/food/kortaburger + name = "Plain Rootburger" + reqs = list( + /obj/item/food/patty/plain = 1, + /obj/item/food/rootroll = 1 + ) + result = /obj/item/food/burger/plain/korta + category = CAT_BURGER + +/datum/crafting_recipe/food/ratkorta + name = "Rat Rootburger" + reqs = list( + /obj/item/food/deadmouse = 1, + /obj/item/food/rootroll = 1 + ) + result = /obj/item/food/burger/rat/korta + category = CAT_BURGER + +/datum/crafting_recipe/food/rootguffin + name = "Root-Guffin" + reqs = list( + /obj/item/food/friedegg = 1, + /obj/item/food/meat/bacon = 2, + /obj/item/food/rootroll = 1 + ) + result = /obj/item/food/burger/rootguffin + category = CAT_BURGER + +/datum/crafting_recipe/food/rootrib + name = "RootRib" + reqs = list( + /obj/item/food/bbqribs = 1, //The sauce is already included in the ribs + /obj/item/food/onion_slice = 1, //feel free to remove if too burdensome. + /obj/item/food/rootroll = 1 + ) + result = /obj/item/food/burger/rootrib + category = CAT_BURGER + +/datum/crafting_recipe/food/rootchicken + name = "Chicken Rootwich" + reqs = list( + /obj/item/food/patty/chicken = 1, + /datum/reagent/consumable/mayonnaise = 5, + /obj/item/food/rootroll = 1 + ) + result = /obj/item/food/burger/rootchicken + category = CAT_BURGER + +/datum/crafting_recipe/food/rootfish + name = "Fish rootburger" + reqs = list( + /obj/item/food/fishmeat = 1, + /obj/item/food/rootroll = 1 + ) + result = /obj/item/food/burger/rootfish + category = CAT_BURGER + +/datum/crafting_recipe/food/sloppyroot + name = "Sssloppy moe" + reqs = list( + /obj/item/food/rootroll = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/bbqsauce = 5, + ) + result = /obj/item/food/burger/sloppyroot + category = CAT_BURGER diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index c260f5b4d1b..0e71758b063 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -310,3 +310,14 @@ ) result = /obj/item/food/popsicle/licorice_creamsicle category = CAT_ICE + +/datum/crafting_recipe/food/meatsicle + name = "Meatsicle" + reqs = list( + /obj/item/popsicle_stick = 1, + /obj/item/food/meat/slab = 1, + /datum/reagent/consumable/ice = 2, + /datum/reagent/consumable/sugar = 2 + ) + result = /obj/item/food/popsicle/meatsicle + category = CAT_ICE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 419546a4784..98eafb66823 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -262,6 +262,21 @@ result = /obj/item/food/beef_wellington category = CAT_MEAT +/datum/crafting_recipe/food/korta_wellington + name = "Korta Wellington" + reqs = list( + /obj/item/food/meat/steak = 1, + /obj/item/food/grown/mushroom = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/meat/bacon = 1, + /obj/item/food/flatrootdough = 1, + /datum/reagent/consumable/korta_milk = 5, + /datum/reagent/consumable/salt = 2, + /datum/reagent/consumable/blackpepper = 2 + ) + result = /obj/item/food/korta_wellington + category = CAT_MEAT + /datum/crafting_recipe/food/full_roast name = "Roast Chicken Dinner" reqs = list( diff --git a/code/modules/hallucination/delusions.dm b/code/modules/hallucination/delusions.dm index 312972f5c9a..106988f7327 100644 --- a/code/modules/hallucination/delusions.dm +++ b/code/modules/hallucination/delusions.dm @@ -18,8 +18,13 @@ var/delusion_icon_file /// The icon state of the delusion image var/delusion_icon_state - /// Do we use a generated icon? If yes no icon file or state needed. - var/dynamic_icon = FALSE + + /// Do we use an appearance/generated icon? If yes no icon file or state needed. + var/dynamic_delusion = FALSE + /// Appearance to use as a source for our image + /// If this exists we'll ignore the icon/state from above + var/mutable_appearance/delusion_appearance + /// The name of the delusion image var/delusion_name @@ -56,7 +61,7 @@ return ..() /datum/hallucination/delusion/start() - if(!hallucinator.client || !delusion_icon_file) + if(!hallucinator.client) return FALSE feedback_details += "Delusion: [delusion_name]" @@ -96,7 +101,11 @@ return TRUE /datum/hallucination/delusion/proc/make_delusion_image(mob/over_who) - var/image/funny_image = image(delusion_icon_file, over_who, dynamic_icon ? "" : delusion_icon_state) + var/image/funny_image + if(delusion_appearance) + funny_image = image(delusion_appearance, over_who) + else + funny_image = image(delusion_icon_file, over_who, delusion_icon_state) funny_image.name = delusion_name funny_image.override = TRUE return funny_image @@ -197,14 +206,14 @@ return funny_image /datum/hallucination/delusion/preset/syndies + dynamic_delusion = TRUE random_hallucination_weight = 1 - dynamic_icon = TRUE delusion_name = "Syndicate" affects_others = TRUE affects_us = FALSE /datum/hallucination/delusion/preset/syndies/make_delusion_image(mob/over_who) - delusion_icon_file = getFlatIcon(get_dynamic_human_appearance( + delusion_appearance = get_dynamic_human_appearance( mob_spawn_path = pick( /obj/effect/mob_spawn/corpse/human/syndicatesoldier, /obj/effect/mob_spawn/corpse/human/syndicatecommando, @@ -217,7 +226,7 @@ /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/shotgun/bulldog, ), - )) + ) return ..() @@ -229,3 +238,34 @@ affects_us = FALSE affects_others = TRUE random_hallucination_weight = 0 + +/// Hallucination used by the path of moon heretic to turn everyone into a lunar mass +/datum/hallucination/delusion/preset/moon + delusion_icon_file = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' + delusion_icon_state = "moon_mass" + delusion_name = "moon" + duration = 15 SECONDS + affects_others = TRUE + random_hallucination_weight = 0 + +// Hallucination used by heretic paintings +/datum/hallucination/delusion/preset/heretic + dynamic_delusion = TRUE + random_hallucination_weight = 0 + delusion_name = "Heretic" + affects_others = TRUE + affects_us = FALSE + duration = 11 SECONDS + +/datum/hallucination/delusion/preset/heretic/make_delusion_image(mob/over_who) + // This code is dummy hot for DUMB reasons so let's not make a mob constantly yeah? + var/static/mutable_appearance/heretic_appearance + if(isnull(heretic_appearance)) + heretic_appearance = get_dynamic_human_appearance(/datum/outfit/heretic, r_hand = NO_REPLACE) + delusion_appearance = heretic_appearance + return ..() + +/datum/hallucination/delusion/preset/heretic/gate + delusion_name = "Mind Gate" + duration = 60 SECONDS + affects_us = TRUE diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index b9155f3c3b6..f41f607dabe 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -519,7 +519,7 @@ return pick("Tizira", "Lizard", "Imperial") /datum/holiday/ianbirthday - name = "Ian's Birthday" //github.com/tgstation/tgstation/commit/de7e4f0de0d568cd6e1f0d7bcc3fd34700598acb + name = IAN_HOLIDAY //github.com/tgstation/tgstation/commit/de7e4f0de0d568cd6e1f0d7bcc3fd34700598acb begin_month = SEPTEMBER begin_day = 9 end_day = 10 diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 8d0a5ab33c5..eb0261739ad 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -100,13 +100,14 @@ . = ..() if(.) return - if(user.stat || machine_stat & (NOPOWER|BROKEN)) + if(machine_stat & (NOPOWER|BROKEN)) to_chat(user, span_warning("This device is not powered!")) return - currentarea = get_area(src.loc) - if(!currentarea) + currentarea = get_area(src) + if(isnull(currentarea)) qdel(src) + return if(eventstarted) to_chat(usr, span_warning("The event has already begun!")) @@ -118,10 +119,12 @@ var/numbuttons = 0 var/numready = 0 - for(var/obj/machinery/readybutton/button in currentarea) - numbuttons++ - if (button.ready) - numready++ + for (var/list/zlevel_turfs as anything in currentarea.get_zlevel_turf_lists()) + for (var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/readybutton/button in area_turf) + numbuttons++ + if(button.ready) + numready++ if(numbuttons == numready) begin_event() @@ -134,12 +137,14 @@ eventstarted = TRUE - for(var/obj/structure/window/W in currentarea) - if(W.obj_flags & NO_DECONSTRUCTION) // Just in case: only holo-windows - qdel(W) + for (var/list/zlevel_turfs as anything in currentarea.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/structure/window/barrier in area_turf) + if((barrier.obj_flags & NO_DECONSTRUCTION) || (barrier.flags_1 & HOLOGRAM_1))// Just in case: only holo-windows + qdel(barrier) - for(var/mob/M in currentarea) - to_chat(M, span_userdanger("FIGHT!")) + for(var/mob/contestant in area_turf) + to_chat(contestant, span_userdanger("FIGHT!")) /obj/machinery/conveyor/holodeck diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index d1eb12a4ea9..932c0910b73 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1159,7 +1159,7 @@ circuit = null density = FALSE use_power = NO_POWER_USE - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION unwrenchable = FALSE self_sustaining_overlay_icon_state = null maxnutri = 15 diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index e206fe136ac..e5b8cc307fc 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -178,6 +178,10 @@ for(var/i in roundstart_experience) spawned_human.mind.adjust_experience(i, roundstart_experience[i], TRUE) +/// Return the outfit to use +/datum/job/proc/get_outfit() + return outfit + /// Announce that this job as joined the round to all crew members. /// Note the joining mob has no client at this point. /datum/job/proc/announce_job(mob/living/joining_mob, job_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - Original: /datum/job/proc/announce_job(mob/living/joining_mob) @@ -220,10 +224,10 @@ /mob/living/carbon/human/dress_up_as_job(datum/job/equipping, visual_only = FALSE, datum/preferences/used_pref) //SKYRAT EDIT CHANGE dna.species.pre_equip_species_outfit(equipping, src, visual_only) - equip_outfit_and_loadout(equipping.outfit, used_pref, visual_only, equipping) //SKYRAT EDIT CHANGE + equip_outfit_and_loadout(equipping.get_outfit(), used_pref, visual_only, equipping) //SKYRAT EDIT CHANGE -/// tells the given channel that the given mob is the new department head. See communications.dm for valid channels. -/datum/job/proc/announce_head(mob/living/carbon/human/H, channels, job_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - Original: /datum/job/proc/announce_head(mob/living/carbon/human/H, channels) +// Original: /datum/job/proc/announce_head(mob/living/carbon/human/H, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. +/datum/job/proc/announce_head(mob/living/carbon/human/H, channels, job_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES if(H && GLOB.announcement_systems.len) //timer because these should come after the captain announcement SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, job_title, channels), 1)) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - Original: SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, H.job, channels), 1)) diff --git a/code/modules/jobs/job_types/assistant/assistant.dm b/code/modules/jobs/job_types/assistant/assistant.dm new file mode 100644 index 00000000000..45c439c1957 --- /dev/null +++ b/code/modules/jobs/job_types/assistant/assistant.dm @@ -0,0 +1,101 @@ +GLOBAL_DATUM(colored_assistant, /datum/colored_assistant) + +/* +Assistant +*/ +/datum/job/assistant + title = JOB_ASSISTANT + description = "Get your space legs, assist people, ask the HoP to give you a job." + faction = FACTION_STATION + total_positions = 5 + spawn_positions = 5 + supervisors = "absolutely everyone" + exp_granted_type = EXP_TYPE_CREW + outfit = /datum/outfit/job/assistant + plasmaman_outfit = /datum/outfit/plasmaman + paycheck = PAYCHECK_LOWER // Get a job. Job reassignment changes your paycheck now. Get over it. + + paycheck_department = ACCOUNT_CIV + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + liver_traits = list(TRAIT_MAINTENANCE_METABOLISM) + + department_for_prefs = /datum/job_department/assistant + + family_heirlooms = list(/obj/item/storage/toolbox/mechanical/old/heirloom, /obj/item/clothing/gloves/cut/heirloom) + + mail_goodies = list( + /obj/effect/spawner/random/food_or_drink/donkpockets = 10, + /obj/item/clothing/mask/gas = 10, + /obj/item/clothing/gloves/color/fyellow = 7, + /obj/item/choice_beacon/music = 5, + /obj/item/toy/sprayoncan = 3, + /obj/item/crowbar/large = 1 + ) + + job_flags = STATION_JOB_FLAGS + rpg_title = "Lout" + config_tag = "ASSISTANT" + +/datum/job/assistant/get_outfit() + if(!HAS_TRAIT(SSstation, STATION_TRAIT_ASSISTANT_GIMMICKS)) + return ..() + + var/static/list/gimmicks = list() + if(!length(gimmicks)) + for(var/datum/outfit/job/assistant/gimmick/gimmick_outfit as anything in subtypesof(/datum/outfit/job/assistant/gimmick)) + gimmicks[gimmick_outfit] = gimmick_outfit::outfit_weight + + return pick_weight(gimmicks) + +/datum/outfit/job/assistant + name = JOB_ASSISTANT + jobtype = /datum/job/assistant + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + +/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/target) + ..() + for(var/holidayname in GLOB.holidays) + var/datum/holiday/holiday_today = GLOB.holidays[holidayname] + var/obj/item/special_hat = holiday_today.holiday_hat + if(prob(HOLIDAY_HAT_CHANCE) && !isnull(special_hat) && isnull(head)) + head = special_hat + + give_jumpsuit(target) + +/datum/outfit/job/assistant/proc/give_jumpsuit(mob/living/carbon/human/target) + var/static/jumpsuit_number = 0 + jumpsuit_number += 1 + + if (isnull(GLOB.colored_assistant)) + var/configured_type = get_configured_colored_assistant_type() + GLOB.colored_assistant = new configured_type + + var/index = (jumpsuit_number % GLOB.colored_assistant.jumpsuits.len) + 1 + + // SKYRAT EDIT - Loadouts (we don't want jumpsuits to override the person's loadout item) + if(modified_outfit_slots & ITEM_SLOT_ICLOTHING) + return + // SKYRAT EDIT END + + //We don't cache these, because they can delete on init + //Too fragile, better to just eat the cost + if (target.jumpsuit_style == PREF_SUIT) + uniform = GLOB.colored_assistant.jumpsuits[index] + else + uniform = GLOB.colored_assistant.jumpskirts[index] + +/datum/outfit/job/assistant/consistent + name = "Assistant - Consistent" + +/datum/outfit/job/assistant/consistent/give_jumpsuit(mob/living/carbon/human/target) + uniform = /obj/item/clothing/under/color/grey + +/datum/outfit/job/assistant/consistent/post_equip(mob/living/carbon/human/H, visualsOnly) + ..() + + // This outfit is used by the assets SS, which is ran before the atoms SS + if (SSatoms.initialized == INITIALIZATION_INSSATOMS) + H.w_uniform?.update_greyscale() + H.update_worn_undersuit() diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant/colorful_assistants.dm similarity index 53% rename from code/modules/jobs/job_types/assistant.dm rename to code/modules/jobs/job_types/assistant/colorful_assistants.dm index fce0aade6ca..740b64912c1 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant/colorful_assistants.dm @@ -1,103 +1,3 @@ -GLOBAL_DATUM(colored_assistant, /datum/colored_assistant) - -/* -Assistant -*/ -/datum/job/assistant - title = JOB_ASSISTANT - description = "Get your space legs, assist people, ask the HoP to give you a job." - faction = FACTION_STATION - total_positions = 5 - spawn_positions = 5 - supervisors = "absolutely everyone" - exp_granted_type = EXP_TYPE_CREW - outfit = /datum/outfit/job/assistant - plasmaman_outfit = /datum/outfit/plasmaman - paycheck = PAYCHECK_LOWER // Get a job. Job reassignment changes your paycheck now. Get over it. - - paycheck_department = ACCOUNT_CIV - display_order = JOB_DISPLAY_ORDER_ASSISTANT - - liver_traits = list(TRAIT_MAINTENANCE_METABOLISM) - - department_for_prefs = /datum/job_department/assistant - - family_heirlooms = list(/obj/item/storage/toolbox/mechanical/old/heirloom, /obj/item/clothing/gloves/cut/heirloom) - - mail_goodies = list( - /obj/effect/spawner/random/food_or_drink/donkpockets = 10, - /obj/item/clothing/mask/gas = 10, - /obj/item/clothing/gloves/color/fyellow = 7, - /obj/item/choice_beacon/music = 5, - /obj/item/toy/sprayoncan = 3, - /obj/item/crowbar/large = 1 - ) - - job_flags = STATION_JOB_FLAGS - rpg_title = "Lout" - config_tag = "ASSISTANT" - - allow_bureaucratic_error = FALSE // SKYRAT EDIT ADDITION - -/datum/outfit/job/assistant - name = JOB_ASSISTANT - jobtype = /datum/job/assistant - id_trim = /datum/id_trim/job/assistant - uniform = /obj/item/clothing/under/color/random // SKYRAT EDIT ADD - belt = /obj/item/modular_computer/pda/assistant - -/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/target) - ..() - give_hat() - give_jumpsuit(target) - -/datum/outfit/job/assistant/proc/give_hat() - for(var/holidayname in GLOB.holidays) - var/datum/holiday/holiday_today = GLOB.holidays[holidayname] - var/obj/item/special_hat = holiday_today.holiday_hat - if(prob(HOLIDAY_HAT_CHANCE) && !isnull(special_hat) && isnull(head)) - head = special_hat - -/datum/outfit/job/assistant/proc/give_jumpsuit(mob/living/carbon/human/target) - var/static/jumpsuit_number = 0 - jumpsuit_number += 1 - - if (isnull(GLOB.colored_assistant)) - var/configured_type = get_configured_colored_assistant_type() - GLOB.colored_assistant = new configured_type - - var/index = (jumpsuit_number % GLOB.colored_assistant.jumpsuits.len) + 1 - - // SKYRAT EDIT - Loadouts (we don't want jumpsuits to override the person's loadout item) - if(modified_outfit_slots & ITEM_SLOT_ICLOTHING) - return - // SKYRAT EDIT END - - //We don't cache these, because they can delete on init - //Too fragile, better to just eat the cost - if (target.jumpsuit_style == PREF_SUIT) - uniform = GLOB.colored_assistant.jumpsuits[index] - else - uniform = GLOB.colored_assistant.jumpskirts[index] - -/datum/outfit/job/assistant/consistent - name = "Assistant - Consistent" - -/datum/outfit/job/assistant/consistent/give_hat() - return - -/datum/outfit/job/assistant/consistent/give_jumpsuit(mob/living/carbon/human/target) - uniform = /obj/item/clothing/under/color/grey - -/datum/outfit/job/assistant/consistent/post_equip(mob/living/carbon/human/H, visualsOnly) - ..() - - // This outfit is used by the assets SS, which is ran before the atoms SS - if (SSatoms.initialized == INITIALIZATION_INSSATOMS) - H.w_uniform?.update_greyscale() - H.update_worn_undersuit() - - /proc/get_configured_colored_assistant_type() return CONFIG_GET(flag/grey_assistants) ? /datum/colored_assistant/grey : /datum/colored_assistant/random diff --git a/code/modules/jobs/job_types/assistant/gimmick_assistants.dm b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm new file mode 100644 index 00000000000..65967a0487e --- /dev/null +++ b/code/modules/jobs/job_types/assistant/gimmick_assistants.dm @@ -0,0 +1,210 @@ +// This file contains the louadouts for the assistant gimmicks station trait! When active, gives assistants random stupid gear + +/// Parent type of gimmick loadouts for assistants for the functional assistant station traits +/datum/outfit/job/assistant/gimmick + name = "Gimmick Assistant" + /// The weight of the outfit to be picked + var/outfit_weight = 0 + + +/datum/outfit/job/assistant/gimmick/give_jumpsuit(mob/living/carbon/human/target) + return //dont do colorized and stuff, it messes with our uniforms + +/datum/outfit/job/assistant/gimmick/bee + name = "Gimmick Assistant - Bee" + suit = /obj/item/clothing/suit/hooded/bee_costume + uniform = /obj/item/clothing/under/color/yellow + + l_pocket = /obj/item/coupon/bee + + outfit_weight = 2 + +/obj/item/coupon/bee + desc = "BEEEES???? AT AN AFFORDAbLE PORICE?!!!" //wordcoders seething + + discounted_pack = /datum/supply_pack/organic/hydroponics/beekeeping_fullkit + discount_pct_off = 0.7 + +/datum/outfit/job/assistant/gimmick/chicken + name = "Gimmick Assistant - Chicken" + suit = /obj/item/clothing/suit/costume/chickensuit + head = /obj/item/clothing/head/costume/chicken + + l_hand = /obj/item/storage/fancy/egg_box/fertile + + outfit_weight = 2 + +/datum/outfit/job/assistant/gimmick/cyborg + name = "Gimmick Assistant - Cardborg" + suit = /obj/item/clothing/suit/costume/cardborg + head = /obj/item/clothing/head/costume/cardborg + uniform = /obj/item/clothing/under/color/black + + r_hand = /obj/item/weldingtool/largetank + l_hand = /obj/item/stack/cable_coil/five + + uniform = /obj/item/clothing/under/color/black + + outfit_weight = 2 + +/datum/outfit/job/assistant/gimmick/cyborg/post_equip(mob/living/carbon/human/equipped, visualsOnly) + . = ..() + var/obj/item/organ/internal/tongue/robot/robotongue = new () + robotongue.Insert(equipped, movement_flags = DELETE_IF_REPLACED) + +/datum/outfit/job/assistant/gimmick/skater + name = "Gimmick Assistant - Skater" + head = /obj/item/clothing/head/helmet/redtaghelm + suit = /obj/item/clothing/suit/redtag + + l_hand = /obj/item/melee/skateboard + + uniform = /obj/item/clothing/under/color/orange + + outfit_weight = 6 + +/datum/outfit/job/assistant/gimmick/rollerskater + name = "Gimmick Assistant - Rollerskater" + head = /obj/item/clothing/head/helmet/bluetaghelm + suit = /obj/item/clothing/suit/bluetag + + shoes = /obj/item/clothing/shoes/wheelys/rollerskates + + uniform = /obj/item/clothing/under/color/darkblue + + outfit_weight = 6 + +/datum/outfit/job/assistant/gimmick/fisher + name = "Gimmick Assistant - Fisher" + suit = /obj/item/clothing/suit/jacket/puffer/vest + uniform = /obj/item/clothing/under/color/blue + + r_hand = /obj/item/storage/toolbox/fishing + + outfit_weight = 3 + +/datum/outfit/job/assistant/gimmick/patient + name = "Gimmick Assistant - Patient" + suit = /obj/item/clothing/suit/apron/surgical + + l_pocket = /obj/item/storage/pill_bottle/multiver + r_pocket = /obj/item/storage/pill_bottle/mutadone + + uniform = /obj/item/clothing/under/color/white + + outfit_weight = 3 + +/datum/outfit/job/assistant/gimmick/mopper + name = "Gimmick Assistant - Mopper" + suit = /obj/item/clothing/suit/caution + uniform = /obj/item/clothing/under/color/lightpurple + + l_hand = /obj/item/mop + + outfit_weight = 5 + +/datum/outfit/job/assistant/gimmick/mopper/post_equip(mob/living/carbon/human/equipped, visualsOnly) + . = ..() + + for(var/turf/turf in range(1, equipped)) + if(turf.is_blocked_turf()) + continue + var/obj/structure/mop_bucket/bucket = new /obj/structure/mop_bucket(turf) + equipped.start_pulling(bucket) + +/datum/outfit/job/assistant/gimmick/broomer + name = "Gimmick Assistant - Broomer" + suit = /obj/item/clothing/suit/caution + uniform = /obj/item/clothing/under/color/lightpurple + + l_hand = /obj/item/pushbroom + r_hand = /obj/item/storage/bag/trash + + outfit_weight = 5 + +/datum/outfit/job/assistant/gimmick/hall_monitor + name = "Gimmick Assistant - Hall Monitor" + head = /obj/item/clothing/head/collectable/police + mask = /obj/item/clothing/mask/whistle + uniform = /obj/item/clothing/under/color/red + + //neck = /obj/item/camera SKYRAT EDIT REMOVAL + + outfit_weight = 2 + +/datum/outfit/job/assistant/gimmick/monkey + name = "Gimmick Assistant - Monkey" + suit = /obj/item/clothing/suit/costume/monkeysuit + mask = /obj/item/clothing/mask/gas/monkeymask + l_pocket = /obj/item/food/monkeycube + r_pocket = /obj/item/food/monkeycube + + outfit_weight = 1 + +/datum/outfit/job/assistant/gimmick/flesh + name = "Gimmick Assistant - Fleshy" + suit = /obj/item/clothing/suit/hooded/bloated_human + r_hand = /obj/item/toy/foamblade + + outfit_weight = 1 + +/datum/outfit/job/assistant/gimmick/lightbringer + name = "Gimmick Assistant - Lightbringer" + uniform = /obj/item/clothing/under/color/yellow + head = /obj/item/clothing/head/costume/cueball + gloves = /obj/item/clothing/gloves/color/black + + l_pocket = /obj/item/flashlight/lantern + r_pocket = /obj/item/lightreplacer + + outfit_weight = 3 + +/datum/outfit/job/assistant/gimmick/handyman + name = "Gimmick Assistant - Handyman" + + suit = /obj/item/clothing/suit/hazardvest + belt = /obj/item/storage/belt/utility/full + head = /obj/item/clothing/head/utility/hardhat + uniform = /obj/item/clothing/under/color/yellow + + outfit_weight = 6 + +/datum/outfit/job/assistant/gimmick/magician + name = "Gimmick Assistant - Magician" + + head = /obj/item/clothing/head/hats/tophat + uniform = /obj/item/clothing/under/color/lightpurple + + l_hand = /obj/item/gun/magic/wand/nothing + + outfit_weight = 2 + +/datum/outfit/job/assistant/gimmick/firefighter + name = "Gimmick Assistant - Firefighter" + + head = /obj/item/clothing/head/utility/hardhat/red + suit = /obj/item/clothing/suit/hazardvest + uniform = /obj/item/clothing/under/color/red + + l_pocket = /obj/item/stack/medical/ointment + r_pocket = /obj/item/extinguisher/mini + + outfit_weight = 3 + +/datum/outfit/job/assistant/gimmick/gardener + name = "Gimmick Assistant - Gardener" + uniform = /obj/item/clothing/under/color/green + skillchips = list(/obj/item/skillchip/bonsai) + + l_pocket = /obj/item/knife/plastic + l_hand = /obj/item/kirbyplants/random + + outfit_weight = 3 + +/datum/outfit/job/assistant/gimmick/artist + name = "Gimmick Assistant - Artist" + uniform = /obj/item/clothing/under/color/rainbow + + backpack_contents = list(/obj/item/storage/crayons) + + outfit_weight = 3 diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index 13f05add3ec..97688417aac 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -20,6 +20,8 @@ var/chaplain_spawnable = TRUE /// Short description of what this item is capable of, for radial menu uses. var/menu_description = "A standard chaplain's weapon. Fits in pockets. Can be worn on the belt." + /// Lazylist, tracks refs()s to all cultists which have been crit or killed by this nullrod. + var/list/cultists_slain /obj/item/nullrod/Initialize(mapload) . = ..() @@ -66,6 +68,27 @@ 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) +/obj/item/nullrod/attack(mob/living/target_mob, mob/living/user, params) + if(!user.mind?.holy_role) + return ..() + if(!IS_CULTIST(target_mob) || istype(target_mob, /mob/living/carbon/human/cult_ghost)) + return ..() + + var/old_stat = target_mob.stat + . = ..() + if(old_stat < target_mob.stat) + LAZYOR(cultists_slain, REF(target_mob)) + return . + +/obj/item/nullrod/examine(mob/user) + . = ..() + if(!IS_CULTIST(user) || !GET_ATOM_BLOOD_DNA_LENGTH(src)) + return + + var/num_slain = LAZYLEN(cultists_slain) + . += span_cultitalic("It has the blood of [num_slain] fallen cultist[num_slain == 1 ? "" : "s"] on it. \ + Offering it to Nar'sie will transform it into a [num_slain >= 3 ? "powerful" : "standard"] cult weapon.") + /obj/item/nullrod/godhand name = "god hand" desc = "This hand of yours glows with an awesome power!" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 1cd3e99bbef..e863a782d9b 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -71,7 +71,7 @@ /datum/outfit/job/hop/pre_equip(mob/living/carbon/human/H) ..() - if(check_holidays("Ian's Birthday")) + if(check_holidays(IAN_HOLIDAY)) undershirt = /datum/sprite_accessory/undershirt/ian //only pet worth reviving diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index b3a31a132e8..ca4ed9c8580 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -39,9 +39,10 @@ /obj/item/flashlight/seclite = 1, /obj/item/knife/combat/survival = 1, /obj/item/mining_voucher = 1, - /obj/item/suit_voucher = 1, + /obj/item/suit_voucher = 1, //SKYRAT EDIT: Suit_Voucher is an addition /obj/item/stack/marker_beacon/ten = 1, - ) //SKYRAT EDIT: Suit_Voucher is an addition, one line up + /obj/item/t_scanner/adv_mining_scanner/lesser = 1, + ) belt = /obj/item/modular_computer/pda/shaftminer ears = /obj/item/radio/headset/headset_cargo/mining gloves = /obj/item/clothing/gloves/color/black @@ -90,6 +91,7 @@ /obj/item/gun/energy/recharge/kinetic_accelerator = 2, /obj/item/kinetic_crusher/compact = 1, /obj/item/resonator/upgraded = 1, + /obj/item/t_scanner/adv_mining_scanner/lesser = 1, ) box = /obj/item/storage/box/survival/mining/bonus l_pocket = /obj/item/modular_computer/pda/shaftminer diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm index ebc1af0ee1a..b1ae57de1ff 100644 --- a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm +++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm @@ -45,13 +45,14 @@ var/area/bridge = GLOB.areas_by_type[/area/station/command/bridge] if(isnull(bridge)) return ..() //if no bridge, spawn on the arrivals shuttle (but also what the fuck) - for(var/turf/possible_turf as anything in bridge.get_contained_turfs()) - if(possible_turf.is_blocked_turf()) - continue - if(locate(/obj/structure/chair) in possible_turf) - chair_turfs += possible_turf - continue - possible_turfs += possible_turf + for (var/list/zlevel_turfs as anything in bridge.get_zlevel_turf_lists()) + for (var/turf/possible_turf as anything in zlevel_turfs) + if(possible_turf.is_blocked_turf()) + continue + if(locate(/obj/structure/chair) in possible_turf) + chair_turfs += possible_turf + continue + possible_turfs += possible_turf if(length(chair_turfs)) return pick(chair_turfs) //prioritize turfs with a chair if(length(possible_turfs)) diff --git a/code/modules/library/skill_learning/job_skillchips/chef.dm b/code/modules/library/skill_learning/job_skillchips/chef.dm index 589978452e1..75bc494543c 100644 --- a/code/modules/library/skill_learning/job_skillchips/chef.dm +++ b/code/modules/library/skill_learning/job_skillchips/chef.dm @@ -19,5 +19,5 @@ style.teach(user, make_temporary = TRUE) /obj/item/skillchip/job/chef/on_deactivate(mob/living/carbon/user, silent = FALSE) - style.remove(user) + style.fully_remove(user) return ..() diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index c6f427f592f..84170b6964f 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -51,9 +51,10 @@ UnregisterSignal(SSdcs, COMSIG_STARLIGHT_COLOR_CHANGED) var/list/z_offsets = SSmapping.z_level_to_plane_offset if(length(lighting_effects) > 1) - for(var/turf/T as anything in get_contained_turfs()) - if(z_offsets[T.z]) - T.cut_overlay(lighting_effects[z_offsets[T.z] + 1]) + for(var/area_zlevel as anything in 1 to get_highest_zlevel()) + if(z_offsets[area_zlevel]) + for(var/turf/T as anything in get_turfs_by_zlevel(area_zlevel)) + T.cut_overlay(lighting_effects[z_offsets[T.z] + 1]) cut_overlay(lighting_effects[1]) lighting_effects = null area_has_base_lighting = FALSE @@ -91,17 +92,18 @@ add_overlay(lighting_effects[1]) var/list/z_offsets = SSmapping.z_level_to_plane_offset - if(length(lighting_effects) > 1) - // This inside loop is EXTREMELY hot because it's run by space tiles. Don't want no part in that - for(var/turf/T as anything in get_contained_turfs()) - T.luminosity = 1 - // We will only add overlays to turfs not on the first z layer, because that's a significantly lesser portion - // And we need to do them separate, or lighting will go fuckey - if(z_offsets[T.z]) - T.add_overlay(lighting_effects[z_offsets[T.z] + 1]) - else - for(var/turf/T as anything in get_contained_turfs()) - T.luminosity = 1 + for (var/area_zlevel in 1 to get_highest_zlevel()) + // We will only add overlays to turfs not on the first z layer, because that's a significantly lesser portion + // And we need to do them separate, or lighting will go fuckey + // This inside loop is EXTREMELY hot because it's run by space tiles, so we do the if check once on the outside + if(length(lighting_effects) > 1 && z_offsets[area_zlevel]) + var/lighting_effect_to_add = lighting_effects[z_offsets[area_zlevel] + 1] + for(var/turf/area_turf as anything in get_turfs_by_zlevel(area_zlevel)) + area_turf.luminosity = 1 + area_turf.add_overlay(lighting_effect_to_add) + else + for(var/turf/area_turf as anything in get_turfs_by_zlevel(area_zlevel)) + area_turf.luminosity = 1 area_has_base_lighting = TRUE diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index d6bf19711ef..c148530d1cd 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,12 +1,12 @@ /proc/create_all_lighting_objects() - for(var/area/A as anything in GLOB.areas) - if(!A.static_lighting) + for(var/area/area as anything in GLOB.areas) + if(!area.static_lighting) continue - - for(var/turf/T as anything in A.get_contained_turfs()) - if(T.space_lit) - continue - new /datum/lighting_object(T) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + if(area_turf.space_lit) + continue + new /datum/lighting_object(area_turf) CHECK_TICK CHECK_TICK diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 1e39d248f50..b61e14e8916 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -198,10 +198,15 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) currentArea.storageTurf = storageTurf currentArea.roomnumber = currentRoomnumber currentArea.reservation = currentReservation - for(var/turf/closed/indestructible/hoteldoor/door in currentArea) + + for(var/turf/closed/indestructible/hoteldoor/door in currentReservation.reserved_turfs) door.parentSphere = src - door.desc = "The door to this hotel room. The placard reads 'Room [currentRoomnumber]'. Strangely, this door doesn't even seem openable. The doorknob, however, seems to buzz with unusual energy...
[span_info("Alt-Click to look through the peephole.")]" - for(var/turf/open/space/bluespace/BSturf in currentArea) + door.desc = "The door to this hotel room. \ + The placard reads 'Room [currentRoomnumber]'. \ + Strangely, this door doesn't even seem openable. \ + The doorknob, however, seems to buzz with unusual energy...
\ + [span_info("Alt-Click to look through the peephole.")]" + for(var/turf/open/space/bluespace/BSturf in currentReservation.reserved_turfs) BSturf.parentSphere = src /obj/item/hilbertshotel/proc/ejectRooms() @@ -354,9 +359,6 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /turf/closed/indestructible/hoteldoor/attack_larva(mob/user, list/modifiers) promptExit(user) -/turf/closed/indestructible/hoteldoor/attack_slime(mob/user, list/modifiers) - promptExit(user) - /turf/closed/indestructible/hoteldoor/attack_robot(mob/user) if(get_dist(get_turf(src), get_turf(user)) <= 1) promptExit(user) @@ -436,12 +438,10 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) targetturf = get_turf(pick(GLOB.blobstart)) else CRASH("Unable to find a blobstart landmark") - var/turf/T = get_turf(H) - var/area/A = T.loc + log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") - for(var/mob/M in A) - to_chat(M, span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!")) + H.visible_message(span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!")) H.forceMove(targetturf) /area/misc/hilbertshotel/Exited(atom/movable/gone, direction) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 6494f4252e5..7676801a0a9 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -867,11 +867,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/dead_body_placer/LateInitialize() var/area/morgue_area = get_area(src) var/list/obj/structure/bodycontainer/morgue/trays = list() - for(var/turf/area_turf as anything in morgue_area.get_contained_turfs()) - var/obj/structure/bodycontainer/morgue/morgue_tray = locate() in area_turf - if(isnull(morgue_tray) || !morgue_tray.beeper || morgue_tray.connected.loc != morgue_tray) - continue - trays += morgue_tray + for (var/list/zlevel_turfs as anything in morgue_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + var/obj/structure/bodycontainer/morgue/morgue_tray = locate() in area_turf + if(isnull(morgue_tray) || !morgue_tray.beeper || morgue_tray.connected.loc != morgue_tray) + continue + trays += morgue_tray var/numtrays = length(trays) if(numtrays == 0) @@ -944,39 +945,47 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) name = "Ian's Bday Helper" late = TRUE icon_state = "iansbdayhelper" + /// How many clusters of balloons to spawn. var/balloon_clusters = 2 + /// if TRUE, we give a map log warning if we can't find Ian's dogbed. + var/map_warning = TRUE /obj/effect/mapping_helpers/ianbirthday/LateInitialize() - if(check_holidays("Ian's Birthday")) + if(check_holidays(IAN_HOLIDAY)) birthday() qdel(src) /obj/effect/mapping_helpers/ianbirthday/proc/birthday() - var/area/a = get_area(src) - var/list/table = list()//should only be one aka the front desk, but just in case... - var/list/openturfs = list() + var/area/celebration_area = get_area(src) + var/list/table_turfs = list() + var/list/open_turfs = list() + var/turf/dogbed_turf + for (var/list/zlevel_turfs as anything in celebration_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + if(locate(/obj/structure/table/reinforced) in area_turf) + table_turfs += area_turf + if(locate(/obj/structure/bed/dogbed/ian) in area_turf) + dogbed_turf = area_turf + if(isopenturf(area_turf)) + new /obj/effect/decal/cleanable/confetti(area_turf) + open_turfs += area_turf - //confetti and a corgi balloon! (and some list stuff for more decorations) - for(var/thing in a.contents) - if(istype(thing, /obj/structure/table/reinforced)) - table += thing - if(isopenturf(thing)) - new /obj/effect/decal/cleanable/confetti(thing) - if(locate(/obj/structure/bed/dogbed/ian) in thing) - new /obj/item/toy/balloon/corgi(thing) - else - openturfs += thing + if(isnull(dogbed_turf) && map_warning) + log_mapping("[src] in [celebration_area] could not find Ian's dogbed.") - //cake + knife to cut it! - if(length(table)) - var/turf/food_turf = get_turf(pick(table)) + else + new /obj/item/toy/balloon/corgi(dogbed_turf) + var/turf/food_turf = length(table_turfs) ? pick(table_turfs) : dogbed_turf new /obj/item/knife/kitchen(food_turf) var/obj/item/food/cake/birthday/iancake = new(food_turf) iancake.desc = "Happy birthday, Ian!" + if(!length(open_turfs)) + return + //some balloons! this picks an open turf and pops a few balloons in and around that turf, yay. for(var/i in 1 to balloon_clusters) - var/turf/clusterspot = pick_n_take(openturfs) + var/turf/clusterspot = pick_n_take(open_turfs) new /obj/item/toy/balloon(clusterspot) var/balloons_left_to_give = 3 //the amount of balloons around the cluster var/list/dirs_to_balloon = GLOB.cardinals.Copy() @@ -1003,6 +1012,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/ianbirthday/admin//so admins may birthday any room name = "generic birthday setup" icon_state = "bdayhelper" + map_warning = FALSE /obj/effect/mapping_helpers/ianbirthday/admin/LateInitialize() birthday() @@ -1020,24 +1030,27 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) qdel(src) /obj/effect/mapping_helpers/iannewyear/proc/fireworks() - var/area/a = get_area(src) - var/list/table = list()//should only be one aka the front desk, but just in case... - var/list/openturfs = list() + var/area/celebration_area = get_area(src) + var/list/table_turfs = list() + var/turf/dogbed_turf + for (var/list/zlevel_turfs as anything in celebration_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + if(locate(/obj/structure/table/reinforced) in area_turf) + table_turfs += area_turf + if(locate(/obj/structure/bed/dogbed/ian) in area_turf) + dogbed_turf = area_turf - for(var/thing in a.contents) - if(istype(thing, /obj/structure/table/reinforced)) - table += thing - else if(isopenturf(thing)) - if(locate(/obj/structure/bed/dogbed/ian) in thing) - new /obj/item/clothing/head/costume/festive(thing) - var/obj/item/reagent_containers/cup/glass/bottle/champagne/iandrink = new(thing) - iandrink.name = "dog champagne" - iandrink.pixel_y += 8 - iandrink.pixel_x += 8 - else - openturfs += thing + if(isnull(dogbed_turf)) + log_mapping("[src] in [celebration_area] could not find Ian's dogbed.") + return - var/turf/fireworks_turf = get_turf(pick(table)) + new /obj/item/clothing/head/costume/festive(dogbed_turf) + var/obj/item/reagent_containers/cup/glass/bottle/champagne/iandrink = new(dogbed_turf) + iandrink.name = "dog champagne" + iandrink.pixel_y += 8 + iandrink.pixel_x += 8 + + var/turf/fireworks_turf = length(table_turfs) ? pick(table_turfs) : dogbed_turf var/obj/item/storage/box/matches/matchbox = new(fireworks_turf) matchbox.pixel_y += 8 matchbox.pixel_x -= 3 diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index ab6743ff17a..4328ff34110 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -930,8 +930,10 @@ GLOBAL_LIST_EMPTY(map_model_default) if(!new_z) old_area = crds.loc - old_area.turfs_to_uncontain += crds - area_instance.contained_turfs.Add(crds) + LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, crds.z, list()) + LISTASSERTLEN(area_instance.turfs_by_zlevel, crds.z, list()) + old_area.turfs_to_uncontain_by_zlevel[crds.z] += crds + area_instance.turfs_by_zlevel[crds.z] += crds area_instance.contents.Add(crds) if(GLOB.use_preloader) @@ -1004,8 +1006,6 @@ GLOBAL_LIST_EMPTY(map_model_default) if (!text) return - // If we're using a semi colon, we can do this as splittext rather then constant calls to find_next_delimiter_position - // This does make the code a bit harder to read, but saves a good bit of time so suck it up var/position var/old_position = 1 while(position != 0) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index a7b9480a34e..d5ffa9f968d 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -63,8 +63,16 @@ new /obj/effect/landmark/ruin(center, src) return center - -/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = list(/area/space), list/potentialRuins, clear_below = FALSE) +/** + * Loads the ruins for a given z level. + * @param z_levels The z levels to load ruins on. + * @param budget The budget to spend on ruins. Compare against the cost of the ruins in /datum/map_template/ruin. + * @param whitelist A list of areas to allow ruins to be placed in. + * @param potentialRuins A list of ruins to choose from. + * @param clear_below Whether to clear the area below the ruin. Used for multiz ruins. + * @param mineral_budget The budget to spend on ruins that spawn ore vents. Map templates with vents have that defined by mineral_cost. + */ +/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = list(/area/space), list/potentialRuins, clear_below = FALSE, mineral_budget = 15) if(!z_levels || !z_levels.len) WARNING("No Z levels provided - Not generating ruins") return @@ -93,14 +101,14 @@ R.allow_duplicates = FALSE // no multiples for testing R.always_place = !R.unpickable // unpickable ruin means it spawns as a set with another ruin - if(R.cost > budget) //Why would you do that + if(R.cost > budget || R.mineral_cost > mineral_budget) //Why would you do that continue if(R.always_place) forced_ruins[R] = -1 if(R.unpickable) continue ruins_available[R] = R.placement_weight - while(budget > 0 && (ruins_available.len || forced_ruins.len)) + while((budget > 0 || mineral_budget > 0) && (ruins_available.len || forced_ruins.len)) var/datum/map_template/ruin/current_pick var/forced = FALSE var/forced_z //If set we won't pick z level and use this one instead. @@ -159,6 +167,7 @@ log_world("Failed to place [current_pick.name] ruin.") else budget -= current_pick.cost + mineral_budget -= current_pick.mineral_cost if(!current_pick.allow_duplicates) for(var/datum/map_template/ruin/R in ruins_available) if(R.id == current_pick.id) @@ -189,7 +198,7 @@ //Update the available list for(var/datum/map_template/ruin/R in ruins_available) - if(R.cost > budget) + if(R.cost > budget || R.mineral_cost > mineral_budget) ruins_available -= R log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 2809ae65e6c..04ba59ab5a4 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -81,9 +81,13 @@ for(var/turf/cordon_turf as anything in cordon_turfs) var/area/misc/cordon/cordon_area = GLOB.areas_by_type[/area/misc/cordon] || new var/area/old_area = cordon_turf.loc - old_area.turfs_to_uncontain += cordon_turf - cordon_area.contained_turfs += cordon_turf + + LISTASSERTLEN(old_area.turfs_to_uncontain_by_zlevel, cordon_turf.z, list()) + LISTASSERTLEN(cordon_area.turfs_by_zlevel, cordon_turf.z, list()) + old_area.turfs_to_uncontain_by_zlevel[cordon_turf.z] += cordon_turf + cordon_area.turfs_by_zlevel[cordon_turf.z] += cordon_turf cordon_area.contents += cordon_turf + // Its no longer unused, but its also not "used" cordon_turf.turf_flags &= ~UNUSED_RESERVATION_TURF cordon_turf.ChangeTurf(/turf/cordon, /turf/cordon) diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm new file mode 100644 index 00000000000..daa6620a233 --- /dev/null +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -0,0 +1,349 @@ +/obj/machinery/bouldertech + name = "bouldertech brand refining machine" + desc = "You shouldn't be seeing this! And bouldertech isn't even a real company!" + icon = 'icons/obj/machines/mining_machines.dmi' + icon_state = "ore_redemption" + anchored = TRUE + density = TRUE + + /// What is the efficiency of minerals produced by the machine? + var/refining_efficiency = 1 + /// How many boulders can we process maximum per loop? + var/boulders_processing_max = 1 + /// What boulder(s) are we holding? + var/list/boulders_contained = list() + /// How many boulders can we hold maximum? + var/boulders_held_max = 1 + /// Does this machine have a mineral storage link to the silo? + var/holds_minerals = FALSE + /// What materials do we accept and process out of boulders? Removing iron from an iron/glass boulder would leave a boulder with glass. + var/list/processable_materials = list() + /// If we get a boulder with one of these inside, we'll drop it back out. + var/static/list/drop_if_contained = list( + /obj/item/relic, + ) + + /// What sound plays when a thing operates? + var/usage_sound = 'sound/machines/mining/wooping_teleport.ogg' + /// Cooldown associated with the usage_sound played. + COOLDOWN_DECLARE(sound_cooldown) + + /// Silo link to it's materials list. + var/datum/component/remote_materials/silo_materials + ///Does this machine hold mining points? + var/holds_mining_points = FALSE + /// Mining points held by the machine for miners. + var/points_held = 0 + +/obj/machinery/bouldertech/Initialize(mapload) + . = ..() + register_context() + if(holds_minerals) + silo_materials = AddComponent(/datum/component/remote_materials, mapload) + +/obj/machinery/bouldertech/LateInitialize() + . = ..() + if(!holds_minerals) + return + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/machinery/bouldertech/Destroy() + boulders_contained = null + silo_materials = null + return ..() + +/obj/machinery/bouldertech/update_icon_state() + . = ..() + if(anchored) + icon_state ="[initial(icon_state)]" + else + icon_state ="[initial(icon_state)]-off" + +/obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + update_appearance(UPDATE_ICON_STATE) + START_PROCESSING(SSmachines, src) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(default_pry_open(tool, close_after_pry = TRUE, closed_density = FALSE)) + return ITEM_INTERACT_SUCCESS + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/bouldertech/attackby(obj/item/attacking_item, mob/user, params) + if(holds_minerals && istype(attacking_item, /obj/item/boulder)) + var/obj/item/boulder/my_boulder = attacking_item + update_boulder_count() + if(!accept_boulder(my_boulder)) + balloon_alert_to_viewers("full!") + return + balloon_alert_to_viewers("accepted") + START_PROCESSING(SSmachines, src) + return TRUE + if(istype(attacking_item, /obj/item/card/id) && holds_mining_points) + if(points_held <= 0) + balloon_alert_to_viewers("no points to claim!") + if(!COOLDOWN_FINISHED(src, sound_cooldown)) + return TRUE + COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, FALSE) + return FALSE + var/obj/item/card/id/id_card = attacking_item + var/amount = tgui_input_number(user, "How many mining points do you wish to claim? ID Balance: [id_card.registered_account.mining_points], stored mining points: [points_held]", "Transfer Points", max_value = points_held, min_value = 0, round_value = 1) + if(!amount) + return TRUE + if(amount > points_held) + amount = points_held + id_card.registered_account.mining_points += amount + points_held = round(points_held - amount) + to_chat(user, span_notice("You claim [amount] mining points from \the [src] to [id_card].")) + return TRUE + return ..() + +/obj/machinery/bouldertech/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!anchored) + balloon_alert(user, "anchor first!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!holds_minerals) + return SECONDARY_ATTACK_CONTINUE_CHAIN + if(!length(boulders_contained)) + balloon_alert_to_viewers("No boulders to remove!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + remove_boulder(pick(boulders_contained)) + return SECONDARY_ATTACK_CONTINUE_CHAIN + +/obj/machinery/bouldertech/deconstruct(disassembled) + . = ..() + if(length(contents)) + for(var/obj/item/boulder/boulder in contents) + remove_boulder(boulder) + +/obj/machinery/bouldertech/process() + if(!anchored) + return PROCESS_KILL + var/stop_processing_check = FALSE + var/boulders_concurrent = boulders_processing_max ///How many boulders can we touch this process() call + for(var/obj/item/potential_boulder as anything in boulders_contained) + if(QDELETED(potential_boulder)) + boulders_contained -= potential_boulder + break + if(boulders_concurrent <= 0) + break //Try again next time + + if(!istype(potential_boulder, /obj/item/boulder)) + potential_boulder.forceMove(drop_location()) + CRASH("\The [src] had a non-boulder in it's boulders contained!") + + var/obj/item/boulder/boulder = potential_boulder + if(boulder.durability < 0) + CRASH("\The [src] had a boulder with negative durability!") + if(!check_for_processable_materials(boulder.custom_materials)) //Checks for any new materials we can process. + boulders_concurrent-- //We count skipped boulders + remove_boulder(boulder) + continue + boulders_concurrent-- + boulder.durability-- //One less durability to the processed boulder. + if(COOLDOWN_FINISHED(src, sound_cooldown)) + COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) + playsound(loc, usage_sound, 29, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) //This can get annoying. One play per process() call. + stop_processing_check = TRUE + if(boulder.durability <= 0) + breakdown_boulder(boulder) //Crack that bouwlder open! + continue + if(!stop_processing_check) + playsound(src.loc, 'sound/machines/ping.ogg', 50, FALSE) + return PROCESS_KILL + + +/obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) + if(!anchored) + return FALSE + if(boulders_contained.len >= boulders_held_max) + return FALSE + if(istype(mover, /obj/item/boulder)) + var/obj/item/boulder/boulder = mover + return boulder.can_get_processed() + return ..() + +/obj/machinery/bouldertech/examine(mob/user) + . = ..() + if(holds_mining_points) + . += span_notice("The machine reads that it has [span_bold("[points_held] mining points")] stored. Swipe an ID to claim them.") + +/** + * Accepts a boulder into the machinery, then converts it into minerals. + * If the boulder can be fully processed by this machine, we take the materials, insert it into the silo, and destroy the boulder. + * If the boulder has materials left, we make a copy of the boulder to hold the processable materials, take the processable parts, and eject the original boulder. + * @param chosen_boulder The boulder to being breaking down into minerals. + */ +/obj/machinery/bouldertech/proc/breakdown_boulder(obj/item/boulder/chosen_boulder) + if(QDELETED(chosen_boulder)) + return FALSE + if(chosen_boulder.loc != src) + return FALSE + if(!length(chosen_boulder.custom_materials)) + qdel(chosen_boulder) + playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + update_boulder_count() + return FALSE + if(isnull(silo_materials)) + return FALSE + + //here we loop through the boulder's ores + var/list/processable_ores = list() + var/tripped = FALSE + //If a material is in the boulder's custom_materials, but not in the processable_materials list, we add it to the processable_ores list to add back to a leftover boulder. + for(var/datum/material/possible_mat as anything in chosen_boulder.custom_materials) + if(!is_type_in_list(possible_mat, processable_materials)) + continue + var/quantity = chosen_boulder.custom_materials[possible_mat] + points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine + processable_ores += possible_mat + processable_ores[possible_mat] = quantity + chosen_boulder.custom_materials -= possible_mat //Remove it from the boulder now that it's tracked + tripped = TRUE + if(!tripped) + remove_boulder(chosen_boulder) + say("Nothing to process!") + return FALSE //we shouldn't spend more time processing a boulder with contents we don't care about. + use_power(BASE_MACHINE_ACTIVE_CONSUMPTION) + check_for_boosts() //Calls the relevant behavior for boosting the machine's efficiency, if able. + var/is_artifact = (istype(chosen_boulder, /obj/item/boulder/artifact)) //We need to know if it's an artifact so we can carry it over to the new boulder. + var/obj/item/boulder/disposable_boulder = new (src) + disposable_boulder.custom_materials = processable_ores + silo_materials.insert_item(disposable_boulder, refining_efficiency) + qdel(disposable_boulder) + + refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100% now that we've processed any relevant ores. + if(!length(chosen_boulder.custom_materials)) + playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + if(is_artifact) + points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! + chosen_boulder.break_apart() + update_boulder_count() + return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. + + chosen_boulder.restart_processing_cooldown() //So that we don't pick it back up! + chosen_boulder.durability = rand(chosen_boulder.boulder_size, chosen_boulder.boulder_size + BOULDER_SIZE_SMALL) //Reset durability to a random value between the boulder's size and a little more. + remove_boulder(chosen_boulder) + return TRUE + +/** + * Accepts a boulder into the machine. Used when a boulder is first placed into the machine. + * @param new_boulder The boulder to be accepted. + */ +/obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) + if(isnull(new_boulder)) + return FALSE + if(boulders_contained.len >= boulders_held_max) //Full already + return FALSE + if(!istype(new_boulder)) //Can't be processed + return FALSE + if(!new_boulder.custom_materials) //Shouldn't happen, but just in case. + qdel(new_boulder) + playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return FALSE + new_boulder.forceMove(src) + boulders_contained += new_boulder + SSore_generation.available_boulders -= new_boulder + START_PROCESSING(SSmachines, src) //Starts processing if we aren't already. + return TRUE + +/** + * Ejects a boulder from the machine. Used when a boulder is finished processing, or when a boulder can't be processed. + * @param drop_turf The location to eject the boulder to. If null, it will eject to the machine's drop_location(). + * @param specific_boulder The boulder to be ejected. + */ +/obj/machinery/bouldertech/proc/remove_boulder(obj/item/boulder/specific_boulder, turf/drop_turf = null) + if(isnull(specific_boulder)) + CRASH("remove_boulder() called with no boulder!") + if(!length(specific_boulder.custom_materials)) + qdel(specific_boulder) + update_boulder_count() + playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return FALSE + specific_boulder.restart_processing_cooldown() //Reset the cooldown so we don't pick it back up by the same machine. + if(isturf(drop_turf)) + specific_boulder.forceMove(drop_turf) + else + specific_boulder.forceMove(drop_location()) + if(!update_boulder_count()) + return TRUE + STOP_PROCESSING(SSmachines, src) + balloon_alert_to_viewers("clear!") + playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) + return TRUE + +/** + * Getter proc to determine how many boulders are contained in the machine. + * Also adds their reference to the boulders_contained list. + */ +/obj/machinery/bouldertech/proc/update_boulder_count() + boulders_contained = list() + for(var/obj/item/boulder/boulder in contents) + boulders_contained += boulder + return boulders_contained.len + +/obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) + +/** + * Looks for a boost to the machine's efficiency, and applies it if found. + * Applied more on the chemistry integration but can be used for other things if desired. + */ +/obj/machinery/bouldertech/proc/check_for_boosts() + refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100%. + +/** + * Checks if a custom_material is in a list of processable materials in the machine. + * @param list/custom_material A list of materials, presumably taken from a boulder. If a material that this machine can process is in this list, it will return true, inclusively. + */ +/obj/machinery/bouldertech/proc/check_for_processable_materials(list/boulder_mats) + for(var/material as anything in boulder_mats) + if(is_type_in_list(material, processable_materials)) + return TRUE + return FALSE + +///Beacon to launch a new mining setup when activated. For testing and speed! +/obj/item/boulder_beacon + name = "boulder beacon" + desc = "N.T. approved boulder beacon, toss it down and you will have a full bouldertech mining station." + icon = 'icons/obj/machines/floor.dmi' + icon_state = "floor_beacon" + /// Number of activations left on this beacon. Uses will be removed as the beacon is used and each triggers a different machine to be spawned from it. + var/uses = 3 + +/obj/item/boulder_beacon/attack_self() + loc.visible_message(span_warning("\The [src] begins to beep loudly!")) + addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) + +/** + * Spawns a new bouldertech machine from the beacon, then removes a use from the beacon. + * Use one spawns a BRM teleporter, then a refinery, and lastly a smelter. + */ +/obj/item/boulder_beacon/proc/launch_payload() + playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + switch(uses) + if(3) + new /obj/machinery/bouldertech/brm(drop_location()) + if(2) + new /obj/machinery/bouldertech/refinery(drop_location()) + if(1) + new /obj/machinery/bouldertech/refinery/smelter(drop_location()) + qdel(src) + uses-- diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm new file mode 100644 index 00000000000..f8393ff0df9 --- /dev/null +++ b/code/modules/mining/boulder_processing/boulder.dm @@ -0,0 +1,289 @@ + + +/** + * The objects that ore vents produce, which is refined into minerals. + */ +/obj/item/boulder + name = "boulder" + desc = "This rocks." + icon_state = "ore" + icon = 'icons/obj/ore.dmi' + item_flags = NO_MAT_REDEMPTION + throw_range = 2 + throw_speed = 0.5 + drag_slowdown = 1.5 // It's still a big rock. + ///When a refinery machine is working on this boulder, we'll set this. Re reset when the process is finished, but the boulder may still be refined/operated on further. + var/obj/machinery/bouldertech/processed_by = null + /// How many steps of refinement this boulder has gone through. Starts at 5-8, goes down one each machine process. + var/durability = 5 + /// What was the size of the boulder when it was spawned? This is used for inheiriting the icon_state. + var/boulder_size = BOULDER_SIZE_SMALL + /// Used in inheriting the icon_state from our parent vent in update_icon. + var/boulder_string = "boulder" + /// Cooldown used to prevents boulders from getting processed back into a machine immediately after being processed. + COOLDOWN_DECLARE(processing_cooldown) + + /// Static list of all minerals to populate gulag boulders with. + var/list/static/gulag_minerals = list( + /datum/material/diamond = 1, + /datum/material/gold = 8, + /datum/material/iron = 95, + /datum/material/plasma = 30, + /datum/material/silver = 20, + /datum/material/titanium = 8, + /datum/material/uranium = 3, + ) + /// Static list of all minerals to populate gulag boulders with, but with bluespace added where safe. + var/list/static/expanded_gulag_minerals = list( + /datum/material/bluespace = 1, + /datum/material/diamond = 1, + /datum/material/gold = 8, + /datum/material/iron = 94, + /datum/material/plasma = 30, + /datum/material/silver = 20, + /datum/material/titanium = 8, + /datum/material/uranium = 3, + ) + +/obj/item/boulder/Initialize(mapload) + . = ..() + register_context() + AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = 0, force_wielded = 5) //Heavy as all hell, it's a boulder, dude. + +/obj/item/boulder/Destroy(force) + SSore_generation.available_boulders -= src + processed_by = null + return ..() + +/obj/item/boulder/examine(mob/user) + . = ..() + . += span_notice("This boulder would take [durability] more steps to refine or break.") + +/obj/item/boulder/examine_more(mob/user) + . = ..() + . += span_notice("[span_bold("Boulders")] can either be cracked open by [span_bold("mining tools")], or processed into sheets with [span_bold("refineries or smelters")]. Undisturbed boulders can be collected by the [span_bold("BRM")].") + +/obj/item/boulder/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item?.tool_behaviour == TOOL_MINING || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + context[SCREENTIP_CONTEXT_RMB] = "Crush boulder into ore" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/boulder/attack_self(mob/user, list/modifiers) + . = ..() + if(.) + return + if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) + return + +/obj/item/boulder/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/boulder/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(istype(mover, /obj/item/boulder)) //This way, boulders can only go one at a time on conveyor belts, but everyone else can go through. + return FALSE + +/obj/item/boulder/attackby_secondary(obj/item/weapon, mob/user, params) + . = ..() + if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER) || HAS_TRAIT(weapon, TRAIT_BOULDER_BREAKER)) + manual_process(weapon, user, INATE_BOULDER_SPEED_MULTIPLIER) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(weapon.tool_behaviour == TOOL_MINING) + manual_process(weapon, user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ..() + +/obj/item/boulder/attack_basic_mob(mob/user, list/modifiers) + . = ..() + if(.) + return + if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) //A little hacky but it works around the speed of the blackboard task selection process for now. + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/boulder/update_icon_state() + . = ..() + switch(boulder_size) + if(BOULDER_SIZE_SMALL) + icon_state = "[boulder_string]_small" + if(BOULDER_SIZE_MEDIUM) + icon_state = "[boulder_string]_medium" + if(BOULDER_SIZE_LARGE) + icon_state = "[boulder_string]_large" + else + icon_state = "[boulder_string]_small" + +/** + * This is called when a boulder is processed by a mob or tool, and reduces the durability of the boulder. + * @param obj/item/weapon The weapon that is being used to process the boulder, that we pull toolspeed from. If null, we use the override_speed_multiplier instead. + * @param mob/living/user The mob that is processing the boulder. + * @param override_speed_multiplier The speed multiplier to use if weapon is null. The do_after will take 2 * this value seconds to complete. + * @param continued Whether or not this is a continued process, or the first one. If true, we don't play the "You swing at the boulder" message. + */ +/* SKYRAT EDIT OVERRIDE! Check the module:mining boulder.dm! +/obj/item/boulder/proc/manual_process(obj/item/weapon, mob/living/user, override_speed_multiplier, continued = FALSE) + var/process_speed = 0 + //Handle weapon conditions. + if(weapon) + if(HAS_TRAIT(weapon, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) + durability = 0 + process_speed = weapon.toolspeed + weapon.play_tool_sound(src, 50) + if(!continued) + to_chat(user, span_notice("You swing at \the [src]...")) + + // Handle user conditions/override conditions. + else if (override_speed_multiplier || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + if(user) + if(HAS_TRAIT(user, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) + durability = 0 + else if(override_speed_multiplier) + process_speed = override_speed_multiplier + else + process_speed = INATE_BOULDER_SPEED_MULTIPLIER + playsound(src, 'sound/effects/rocktap1.ogg', 50) + if(!continued) + to_chat(user, span_notice("You scrape away at \the [src]... speed is [process_speed].")) + else + CRASH("No weapon, acceptable user, or override speed multiplier passed to manual_process()") + if(durability > 0) + if(!do_after(user, (2 * process_speed SECONDS), target = src)) + return + if(!user.Adjacent(src)) + return + durability-- + user.apply_damage(4, STAMINA) + if(durability <= 0) + convert_to_ore() + to_chat(user, span_notice("You finish working on \the [src], and it crumbles into ore.")) + playsound(src, 'sound/effects/rock_break.ogg', 50) + user.mind?.adjust_experience(/datum/skill/mining, MINING_SKILL_BOULDER_SIZE_XP * 0.2) + qdel(src) + return + var/msg = (durability == 1 ? "is crumbling!" : "looks weaker!") + to_chat(user, span_notice("\The [src] [msg]")) + manual_process(weapon, user, override_speed_multiplier, continued = TRUE) +*/ +/** + * This function is called while breaking boulders manually, and drops ore based on the boulder's mineral content. + * Quantity of ore spawned here is 1 less than if the boulder was processed by a machine, but clamped at 10 maximum, 1 minimum. + */ +/obj/item/boulder/proc/convert_to_ore() + for(var/datum/material/picked in custom_materials) + var/obj/item/stack/ore/cracked_ore // Take the associated value and convert it into ore stacks... + var/quantity = clamp(round((custom_materials[picked] - SHEET_MATERIAL_AMOUNT)/SHEET_MATERIAL_AMOUNT), 1, 10) //but less resources than if they processed it by hand. + + var/cracked_ore_type = picked.ore_type + if(isnull(cracked_ore_type)) + stack_trace("boulder found containing material type [picked.type] with no set ore_type") + continue + cracked_ore = new cracked_ore_type (drop_location(), quantity) + SSblackbox.record_feedback("tally", "ore_mined", quantity, cracked_ore) + +/** + * Handles the boulder's processing cooldown to check if it's ready to be processed again. + */ +/obj/item/boulder/proc/can_get_processed() + return COOLDOWN_FINISHED(src, processing_cooldown) + +/** + * Starts the boulder's processing cooldown. + */ +/obj/item/boulder/proc/restart_processing_cooldown() + COOLDOWN_START(src, processing_cooldown, 2 SECONDS) + +/** + * Moves boulder contents to the drop location, and then deletes the boulder. + */ +/obj/item/boulder/proc/break_apart() + var/list/quips = list("Clang!", "Crack!", "Bang!", "Clunk!", "Clank!") + if(length(contents)) + visible_message(span_notice("[pick(quips)] Something falls out of \the [src]!")) + playsound(loc, 'sound/effects/picaxe1.ogg', 60, FALSE) + for(var/obj/item/content as anything in contents) + content.forceMove(get_turf(src)) + qdel(src) + +/** + * This is called when a boulder is spawned from a vent, and is used to set the boulder's icon as well as durability. + * We also set our boulder_size variable, which is used for inheiriting the icon_state later on if processed. + * @param obj/structure/ore_vent/parent_vent The vent that spawned this boulder to generate consistent boulder icons. If null, we use the default size. + * @param size The size of the boulder to spawn. If parent_vent is defined, this is ignored. + * @param is_artifact Whether or not this boulder is an artifact boulder. If true, we use the artifact boulder icon state regardless of size. + */ +/obj/item/boulder/proc/flavor_boulder(obj/structure/ore_vent/parent_vent, size = BOULDER_SIZE_SMALL, is_artifact = FALSE) + var/durability_min = size + var/durability_max = size + BOULDER_SIZE_SMALL + if(parent_vent) + durability_min = parent_vent.boulder_size + durability_max = parent_vent.boulder_size + BOULDER_SIZE_SMALL + durability = rand(durability_min, durability_max) //randomize durability a bit for some flavor. + boulder_size = size + if(parent_vent) + boulder_size = parent_vent.boulder_size + boulder_string = parent_vent.boulder_icon_state + update_appearance(UPDATE_ICON_STATE) + +/** + * Unique proc for gulag-style boulders, which adds a random amount of minerals to the boulder. + */ +/obj/item/boulder/proc/add_gulag_minerals() + var/datum/material/new_material = pick_weight(gulag_minerals) + var/list/new_mats = list() + new_mats[new_material] = SHEET_MATERIAL_AMOUNT * rand(1,3) //We only want a few sheets of material in the gulag boulders + set_custom_materials(new_mats) + +/obj/item/boulder/artifact + name = "artifact boulder" + desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science." + icon_state = "boulder_artifact" + /// This is the type of item that will be inside the boulder. Default is a strange object. + var/artifact_type = /obj/item/relic + /// References to the relic inside the boulder, if any. + var/obj/item/artifact_inside + +/obj/item/boulder/artifact/Initialize(mapload) + . = ..() + artifact_inside = new artifact_type(src) /// This could be poggers for archaeology in the future. + +/obj/item/boulder/artifact/Destroy(force) + QDEL_NULL(artifact_inside) + return ..() + +/obj/item/boulder/artifact/convert_to_ore() + . = ..() + artifact_inside.forceMove(drop_location()) + artifact_inside = null + +/obj/item/boulder/artifact/break_apart() + artifact_inside = null + return ..() + + +/obj/item/boulder/gulag + name = "low-quality boulder" + desc = "This rocks. It's a low quality boulder, so it's probably not worth as much." + +/obj/item/boulder/gulag/Initialize(mapload) + . = ..() + add_gulag_minerals(gulag_minerals) + +/obj/item/boulder/gulag_expanded + name = "low-density boulder" + desc = "This rocks. It's not very well packed, and can't contain as many minerals." + +/obj/item/boulder/gulag_expanded/Initialize(mapload) + . = ..() + add_gulag_minerals(expanded_gulag_minerals) + +/obj/item/boulder/shabby + name = "shabby boulder" + desc = "A bizzare, twisted boulder. Wait, wait no, it's just a rock." + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.1) + durability = 1 diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm new file mode 100644 index 00000000000..c76ec9dabbd --- /dev/null +++ b/code/modules/mining/boulder_processing/brm.dm @@ -0,0 +1,187 @@ +#define MANUAL_TELEPORT_SOUND 'sound/machines/mining/manual_teleport.ogg' +#define AUTO_TELEPORT_SOUND 'sound/machines/mining/auto_teleport.ogg' + +/obj/machinery/bouldertech/brm + name = "boulder retrieval matrix" + desc = "A teleportation matrix used to retrieve boulders excavated by mining NODEs from ore vents." + icon_state = "brm" + circuit = /obj/item/circuitboard/machine/brm + usage_sound = MANUAL_TELEPORT_SOUND + processing_flags = START_PROCESSING_MANUALLY + boulders_held_max = 2 + /// Are we trying to actively collect boulders automatically? + var/toggled_on = FALSE + /// How long does it take to collect a boulder? + var/teleportation_time = 1.5 SECONDS + /// Cooldown used for left click teleportation. + COOLDOWN_DECLARE(manual_teleport_cooldown) + +/obj/machinery/bouldertech/brm/Initialize(mapload) + . = ..() + set_wires(new /datum/wires/brm(src)) + +/obj/machinery/bouldertech/brm/Destroy() + QDEL_NULL(wires) + return ..() + +/obj/machinery/bouldertech/brm/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(!handle_teleport_conditions(user)) + return + pre_collect_boulder() + + COOLDOWN_START(src, manual_teleport_cooldown, teleportation_time) + +/obj/machinery/bouldertech/brm/attack_robot(mob/user) + if(!handle_teleport_conditions(user)) + return + pre_collect_boulder() + + COOLDOWN_START(src, manual_teleport_cooldown, teleportation_time) + +/obj/machinery/bouldertech/brm/attackby(obj/item/attacking_item, mob/user, params) + if(is_wire_tool(attacking_item) && panel_open) + wires.interact(user) + return TRUE + return ..() + +/obj/machinery/bouldertech/brm/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!anchored) + balloon_alert(user, "anchor first!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + toggle_auto_on(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/bouldertech/brm/attack_robot_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!anchored) + balloon_alert(user, "anchor first!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + toggle_auto_on(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/bouldertech/brm/process() + if(SSore_generation.available_boulders.len < 1) + say("No boulders to collect. Entering idle mode.") + toggled_on = FALSE + update_appearance(UPDATE_ICON_STATE) + return PROCESS_KILL + for(var/i in 1 to boulders_processing_max) + if(pre_collect_boulder()) + continue + toggled_on = FALSE + update_appearance(UPDATE_ICON_STATE) + return PROCESS_KILL + for(var/obj/item/boulder/ground_rocks in loc.contents) + boulders_contained += ground_rocks + if(boulders_contained.len < boulders_held_max) + continue + toggled_on = FALSE + boulders_contained.Cut() + update_appearance(UPDATE_ICON_STATE) + return PROCESS_KILL + +/obj/machinery/bouldertech/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" + context[SCREENTIP_CONTEXT_RMB] = "Toggle automatic boulder retrieval" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/bouldertech/brm/examine(mob/user) + . = ..() + . += span_notice("The small screen reads there are [span_boldnotice("[SSore_generation.available_boulders.len] boulders")] available to teleport.") + +/obj/machinery/bouldertech/brm/RefreshParts() + . = ..() + var/scanner_stack = 0 + var/laser_stack = 0 + for(var/datum/stock_part/scanning_module/scanner in component_parts) + scanner_stack += scanner.tier + boulders_processing_max = scanner_stack + for(var/datum/stock_part/micro_laser/laser in component_parts) + laser_stack += laser.tier + boulders_held_max = laser_stack + 1 + +/obj/machinery/bouldertech/brm/update_icon_state() + if(toggled_on && !panel_open) + icon_state = "[initial(icon_state)]-toggled" + return + return ..() + +/** + * Handles qualifiers for enabling teleportation of boulders. + * Returns TRUE if the teleportation can proceed, FALSE otherwise. + */ +/obj/machinery/bouldertech/brm/proc/handle_teleport_conditions(mob/user) + if(!COOLDOWN_FINISHED(src, manual_teleport_cooldown)) + return FALSE + if(panel_open) + balloon_alert(user, "close panel first!") + return FALSE + playsound(src, MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + +/** + * Begins to collect a boulder from the available boulders list in SSore_generation. + * Boulders must not be processed by another BRM or machine, and must be in the available boulders list. + * A selected boulder is picked randomly. + * The actual movement is then handled by collect_boulder() after a timed callback. + */ +/obj/machinery/bouldertech/brm/proc/pre_collect_boulder() + if(!SSore_generation.available_boulders.len) + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + balloon_alert_to_viewers("no boulders to collect!") + return FALSE //Nothing to collect + var/obj/item/boulder/random_boulder = pick(SSore_generation.available_boulders) + if(random_boulder.processed_by) + return FALSE + + random_boulder.processed_by = src + random_boulder.Shake(duration = 1.5 SECONDS) + SSore_generation.available_boulders -= random_boulder + addtimer(CALLBACK(src, PROC_REF(collect_boulder), random_boulder), 1.5 SECONDS) + return TRUE + +/** + * Collects a boulder from the available boulders list in SSore_generation. + * Handles the movement of the boulder as well as visual effects on the BRM. + * @param obj/item/boulder/random_boulder The boulder to collect. + */ +/obj/machinery/bouldertech/brm/proc/collect_boulder(obj/item/boulder/random_boulder) + flick("brm-flash", src) + if(QDELETED(random_boulder)) + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + balloon_alert_to_viewers("target lost!") + return FALSE + playsound(src, AUTO_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + random_boulder.forceMove(drop_location()) + random_boulder.processed_by = null + random_boulder.pixel_x = rand(-2, 2) + random_boulder.pixel_y = rand(-2, 2) + balloon_alert_to_viewers("boulder appears!") + random_boulder.visible_message(span_warning("[random_boulder] suddenly appears!")) + use_power(BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1) + return TRUE + +/** + * Toggles automatic boulder retrieval on. + * Adjusts the teleportation sound, icon state, and begins processing. + * @param mob/user The user who toggled the BRM. + */ +/obj/machinery/bouldertech/brm/proc/toggle_auto_on(mob/user) + if(panel_open) + if(user) + balloon_alert(user, "close panel first!") + return + toggled_on = TRUE + START_PROCESSING(SSmachines, src) + update_appearance(UPDATE_ICON_STATE) + usage_sound = AUTO_TELEPORT_SOUND + +#undef MANUAL_TELEPORT_SOUND +#undef AUTO_TELEPORT_SOUND diff --git a/code/modules/mining/boulder_processing/refinery.dm b/code/modules/mining/boulder_processing/refinery.dm new file mode 100644 index 00000000000..828ace377e9 --- /dev/null +++ b/code/modules/mining/boulder_processing/refinery.dm @@ -0,0 +1,98 @@ +/** + * Your new favorite industrial waste magnet! + * Accepts boulders and produces sheets of non-metalic materials. + * Can be upgraded with stock parts or through chemical inputs. + * When upgraded, it can hold more boulders and process more at once. + * + * Chemical inputs can be used to boost the refinery's efficiency, but produces industrial waste, which eats through the station and is generally difficult to store. + */ + +/obj/machinery/bouldertech/refinery + name = "boulder refinery" + desc = "BR for short. Accepts boulders and refines non-metallic ores into sheets using internal chemicals. Can be upgraded with stock parts or through chemical inputs." + icon_state = "stacker" + holds_minerals = TRUE + processable_materials = list( + /datum/material/glass, + /datum/material/plasma, + /datum/material/diamond, + /datum/material/bluespace, + /datum/material/bananium, + /datum/material/plastic, + ) + circuit = /obj/item/circuitboard/machine/refinery + usage_sound = 'sound/machines/mining/refinery.ogg' + holds_mining_points = TRUE + +/// okay so var that holds mining points to claim +/// add total of pts from minerals mined in parent proc +/// then, little mini UI showing points to collect? + +/obj/machinery/bouldertech/refinery/RefreshParts() + . = ..() + var/manipulator_stack = 0 + var/matter_bin_stack = 0 + for(var/datum/stock_part/servo/servo in component_parts) + manipulator_stack += servo.tier - 1 + boulders_processing_max = clamp(manipulator_stack, 1, 6) + for(var/datum/stock_part/matter_bin/bin in component_parts) + matter_bin_stack += bin.tier + boulders_held_max = matter_bin_stack + + +/obj/machinery/bouldertech/refinery/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(istype(held_item, /obj/item/boulder)) + context[SCREENTIP_CONTEXT_LMB] = "Insert boulder" + if(istype(held_item, /obj/item/card/id) && points_held > 0) + context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" + context[SCREENTIP_CONTEXT_RMB] = "Remove boulder" + return CONTEXTUAL_SCREENTIP_SET + + +/** + * Your other new favorite industrial waste magnet! + * Accepts boulders and produces sheets of metalic materials. + * Can be upgraded with stock parts or through chemical inputs. + * When upgraded, it can hold more boulders and process more at once. + * + * Chemical inputs can be used to boost the refinery's efficiency, but produces industrial waste, which eats through the station and is generally difficult to store. + */ +/obj/machinery/bouldertech/refinery/smelter + name = "boulder smelter" + desc = "BS for short. Accept boulders and refines metallic ores into sheets. Can be upgraded with stock parts or through gas inputs." + icon_state = "smelter" + processable_materials = list( + /datum/material/iron, + /datum/material/titanium, + /datum/material/silver, + /datum/material/gold, + /datum/material/uranium, + /datum/material/mythril, + /datum/material/adamantine, + /datum/material/runite, + ) + light_system = MOVABLE_LIGHT + light_range = 1 + light_power = 2 + light_color = "#ffaf55" + light_on = FALSE + circuit = /obj/item/circuitboard/machine/smelter + usage_sound = 'sound/machines/mining/smelter.ogg' + +/obj/machinery/bouldertech/refinery/smelter/RefreshParts() + . = ..() + light_power = boulders_processing_max + +/obj/machinery/bouldertech/refinery/smelter/accept_boulder(obj/item/boulder/new_boulder) + . = ..() + if(.) + set_light_on(TRUE) + return TRUE + + +/obj/machinery/bouldertech/refinery/smelter/process() + . = ..() + if(. == PROCESS_KILL) + set_light_on(FALSE) + diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index f5676221f7a..add06da08a6 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -113,7 +113,7 @@ if((user.dir & backstab_dir) && (L.dir & backstab_dir)) backstabbed = TRUE combined_damage += backstab_bonus - playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong + playsound(user, 'sound/weapons/kinetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong if(!QDELETED(C)) C.total_damage += combined_damage @@ -159,7 +159,7 @@ if(!charged) charged = TRUE update_appearance() - playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, TRUE) + playsound(src.loc, 'sound/weapons/kinetic_reload.ogg', 60, TRUE) /obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype) set_light_on(!light_on) diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 62b61b89ce9..bf52140d6a9 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -11,7 +11,9 @@ w_class = WEIGHT_CLASS_SMALL obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT + /// The cooldown between scans. var/cooldown = 35 + /// Current time until the next scan can be performed. var/current_cooldown = 0 /obj/item/mining_scanner/attack_self(mob/user) @@ -19,7 +21,7 @@ return if(current_cooldown <= world.time) current_cooldown = world.time + cooldown - mineral_scan_pulse(get_turf(user)) + mineral_scan_pulse(get_turf(user), scanner = src) //Debug item to identify all ore spread quickly /obj/item/mining_scanner/admin @@ -40,8 +42,11 @@ w_class = WEIGHT_CLASS_SMALL obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT + /// The cooldown between scans. var/cooldown = 35 + /// Current time until the next scan can be performed. var/current_cooldown = 0 + /// The range of the scanner in tiles. var/range = 7 /obj/item/t_scanner/adv_mining_scanner/cyborg/Initialize(mapload) @@ -59,13 +64,25 @@ if(current_cooldown <= world.time) current_cooldown = world.time + cooldown var/turf/t = get_turf(src) - mineral_scan_pulse(t, range) + mineral_scan_pulse(t, range, src) -/proc/mineral_scan_pulse(turf/T, range = world.view) +/proc/mineral_scan_pulse(turf/T, range = world.view, obj/item/scanner) var/list/minerals = list() - for(var/turf/closed/mineral/M in range(range, T)) - if(M.scan_state) - minerals += M + var/vents_nearby = FALSE + var/undiscovered = FALSE + var/radar_volume = 30 + for(var/turf/closed/mineral/mineral in RANGE_TURFS(range, T)) + if(mineral.scan_state) + minerals += mineral + for(var/obj/structure/ore_vent/vent in range(range, T)) + if(!vents_nearby && (!vent.discovered || !vent.tapped)) + vents_nearby = TRUE + if(vent.discovered) + undiscovered = TRUE + var/potential_volume = 80 - (get_dist(scanner, vent) * 10) + radar_volume = max(potential_volume, radar_volume) + vent.add_mineral_overlays() + if(LAZYLEN(minerals)) for(var/turf/closed/mineral/M in minerals) var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M @@ -74,6 +91,14 @@ var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M) C.icon_state = M.scan_state + if(vents_nearby && scanner) + if(undiscovered) + playsound(scanner, 'sound/machines/radar-ping.ogg', radar_volume, FALSE) + else + playsound(scanner, 'sound/machines/sonar-ping.ogg', radar_volume, FALSE) + scanner.balloon_alert_to_viewers("ore vent nearby") + scanner.spasm_animation(1.5 SECONDS) + /obj/effect/temp_visual/mining_overlay plane = HIGH_GAME_PLANE layer = FLASH_LAYER @@ -82,7 +107,17 @@ duration = 35 pixel_x = -224 pixel_y = -224 + /// What animation easing to use when we create the ore overlay on rock walls/ore vents. + var/easing_style = EASE_IN /obj/effect/temp_visual/mining_overlay/Initialize(mapload) . = ..() - animate(src, alpha = 0, time = duration, easing = EASE_IN) + animate(src, alpha = 0, time = duration, easing = easing_style) + +/obj/effect/temp_visual/mining_overlay/vent + icon = 'icons/effects/vent_overlays.dmi' + icon_state = "unknown" + duration = 45 + pixel_x = 0 + pixel_y = 0 + easing_style = CIRCULAR_EASING|EASE_IN diff --git a/code/modules/mining/equipment/monster_organs/rush_gland.dm b/code/modules/mining/equipment/monster_organs/rush_gland.dm index b3932afdaab..b3dbc683da4 100644 --- a/code/modules/mining/equipment/monster_organs/rush_gland.dm +++ b/code/modules/mining/equipment/monster_organs/rush_gland.dm @@ -23,7 +23,7 @@ /obj/item/organ/internal/monster_core/rush_gland/on_mob_insert(mob/living/carbon/organ_owner) . = ..() - RegisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED, PROC_REF(trigger_organ_action)) + RegisterSignal(organ_owner, COMSIG_GOLIATH_TENTACLED_GRABBED, PROC_REF(trigger_organ_action_on_sig)) /obj/item/organ/internal/monster_core/rush_gland/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() @@ -32,6 +32,10 @@ /obj/item/organ/internal/monster_core/rush_gland/on_triggered_internal() owner.apply_status_effect(/datum/status_effect/lobster_rush/extended) +/obj/item/organ/internal/monster_core/rush_gland/proc/trigger_organ_action_on_sig(datum/source) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(trigger_organ_action)) + /** * Status effect: Makes you run really fast and ignore speed penalties for a short duration. * If you run into a wall indoors you will fall over and lose the buff. diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 95ee1015a95..b55a90cf5fe 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -201,7 +201,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne light_color = COLOR_VERY_PALE_LIME_GREEN max_n_of_items = 10 pixel_y = -4 - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /obj/machinery/smartfridge/survival_pod/Initialize(mapload) AddElement(/datum/element/update_icon_blocker) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 47a334484ba..3c80ad80db1 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -286,7 +286,6 @@ AddElement(/datum/element/gags_recolorable) /obj/item/clothing/suit/hooded/hostile_environment/process(seconds_per_tick) - . = ..() var/mob/living/carbon/wearer = loc if(istype(wearer) && SPT_PROB(1, seconds_per_tick)) //cursed by bubblegum if(prob(7.5)) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index f4510741968..62458347bf0 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -70,7 +70,7 @@ icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" density = TRUE - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE + interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON /// Connected ore processing machine. var/obj/machinery/mineral/processing_unit/processing_machine @@ -82,39 +82,43 @@ else return INITIALIZE_HINT_QDEL -/obj/machinery/mineral/processing_unit_console/ui_interact(mob/user) +/obj/machinery/mineral/processing_unit_console/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ProcessingConsole") + ui.open() + +/obj/machinery/mineral/processing_unit_console/ui_static_data(mob/user) + return processing_machine.ui_static_data() + +/obj/machinery/mineral/processing_unit_console/ui_data(mob/user) + return processing_machine.ui_data() + +/obj/machinery/mineral/processing_unit_console/ui_act(action, list/params) . = ..() - if(!processing_machine) + if(.) return - var/dat = processing_machine.get_machine_data() + switch(action) + if("setMaterial") + var/datum/material/new_material = locate(params["value"]) + if(!istype(new_material)) + return - var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500) - popup.set_content(dat) - popup.open() - -/obj/machinery/mineral/processing_unit_console/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - add_fingerprint(usr) - - if(href_list["material"]) - var/datum/material/new_material = locate(href_list["material"]) - if(istype(new_material)) processing_machine.selected_material = new_material processing_machine.selected_alloy = null + return TRUE - if(href_list["alloy"]) - processing_machine.selected_material = null - processing_machine.selected_alloy = href_list["alloy"] + if("setAlloy") + processing_machine.selected_material = null + processing_machine.selected_alloy = params["value"] + return TRUE - if(href_list["set_on"]) - processing_machine.on = (href_list["set_on"] == "on") - processing_machine.begin_processing() - - updateUsrDialog() - return + if("toggle") + processing_machine.on = !processing_machine.on + if(processing_machine.on) + processing_machine.begin_processing() + return TRUE /obj/machinery/mineral/processing_unit_console/Destroy() processing_machine = null @@ -181,41 +185,53 @@ unload_mineral(O) else materials.insert_item(O) - if(mineral_machine) - mineral_machine.updateUsrDialog() -/obj/machinery/mineral/processing_unit/proc/get_machine_data() - var/dat = "Smelter control console

" - for(var/datum/material/all_materials as anything in materials.materials) - var/amount = materials.materials[all_materials] - dat += "[all_materials.name]: [amount] cm³" - if (selected_material == all_materials) - dat += " Smelting" - else - dat += " Not Smelting " - dat += "
" +/obj/machinery/mineral/processing_unit/ui_static_data() + var/list/data = list() - dat += "

" - dat += "Smelt Alloys
" + for(var/datum/material/material as anything in materials.materials) + var/obj/display = initial(material.sheet_type) + data["materialIcons"] += list( + list( + "id" = REF(material), + "icon" = icon2base64(icon(initial(display.icon), icon_state = initial(display.icon_state), frame = 1)), + ) + ) for(var/research in stored_research.researched_designs) - var/datum/design/designs = SSresearch.techweb_design_by_id(research) - dat += "[designs.name] " - if (selected_alloy == designs.id) - dat += " Smelting" - else - dat += " Not Smelting " - dat += "
" + var/datum/design/design = SSresearch.techweb_design_by_id(research) + var/obj/display = initial(design.build_path) + data["alloyIcons"] += list( + list( + "id" = design.id, + "icon" = icon2base64(icon(initial(display.icon), icon_state = initial(display.icon_state), frame = 1)), + ) + ) - dat += "

" - //On or off - dat += "Machine is currently " - if (on) - dat += "On " - else - dat += "Off " + data += materials.ui_static_data() - return dat + return data + +/obj/machinery/mineral/processing_unit/ui_data() + var/list/data = list() + + data["materials"] = materials.ui_data() + data["selectedMaterial"] = selected_material?.name + + data["alloys"] = list() + for(var/research in stored_research.researched_designs) + var/datum/design/design = SSresearch.techweb_design_by_id(research) + data["alloys"] += list( + list( + "name" = design.name, + "id" = design.id, + ) + ) + data["selectedAlloy"] = selected_alloy + + data["state"] = on + + return data /obj/machinery/mineral/processing_unit/pickup_item(datum/source, atom/movable/target, direction) if(QDELETED(target)) @@ -225,19 +241,13 @@ /obj/machinery/mineral/processing_unit/process(seconds_per_tick) if(!on) - end_processing() - if(mineral_machine) - mineral_machine.updateUsrDialog() - return + return PROCESS_KILL if(selected_material) smelt_ore(seconds_per_tick) else if(selected_alloy) smelt_alloy(seconds_per_tick) - if(mineral_machine) - mineral_machine.updateUsrDialog() - /obj/machinery/mineral/processing_unit/proc/smelt_ore(seconds_per_tick = 2) var/datum/material/mat = selected_material if(!mat) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index cfa8203615e..0b9b7895c6b 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -1,4 +1,4 @@ -/**********************Ore Redemption Unit**************************/ +/**********************Ore Redemption Unit (ORM)**************************/ //Turns all the various mining machines into a single unit to speed up mining and establish a point system /obj/machinery/mineral/ore_redemption diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index dcc85dc1c1c..59247be2c0a 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -1,6 +1,3 @@ -GLOBAL_DATUM(ore_silo_default, /obj/machinery/ore_silo) -GLOBAL_LIST_EMPTY(silo_access_logs) - /obj/machinery/ore_silo name = "ore silo" desc = "An all-in-one bluespace storage and transmission system for the station's mineral distribution needs." @@ -8,10 +5,9 @@ GLOBAL_LIST_EMPTY(silo_access_logs) icon_state = "silo" density = TRUE circuit = /obj/item/circuitboard/machine/ore_silo - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE + interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON + processing_flags = NONE - /// The machine UI's page of logs showing ore history. - var/log_page = 1 /// List of all connected components that are on hold from accessing materials. var/list/holds = list() /// List of all components that are sharing ores with this silo. @@ -21,6 +17,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/Initialize(mapload) . = ..() + var/static/list/materials_list = list( /datum/material/iron, /datum/material/glass, @@ -38,6 +35,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /datum/component/material_container, \ materials_list, \ INFINITY, \ + MATCONTAINER_EXAMINE, \ container_signals = list( \ COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/ore_silo, on_item_consumed), \ COMSIG_MATCONTAINER_SHEETS_RETRIEVED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_sheets_ejected), \ @@ -46,6 +44,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) ) if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src + register_context() /obj/machinery/ore_silo/Destroy() if (GLOB.ore_silo_default == src) @@ -59,6 +58,30 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return ..() +/obj/machinery/ore_silo/examine(mob/user) + . = ..() + . += span_notice("It can be linked to techfabs, circuit printers and protolathes with a multitool.") + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + if(panel_open) + . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") + +/obj/machinery/ore_silo/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) + return + + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_MULTITOOL) + context[SCREENTIP_CONTEXT_LMB] = "Log Silo" + return CONTEXTUAL_SCREENTIP_SET + + if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + /obj/machinery/ore_silo/proc/on_item_consumed(datum/component/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER @@ -72,105 +95,120 @@ GLOBAL_LIST_EMPTY(silo_access_logs) silo_log(context, "ejected", -sheets.amount, "[sheets.singular_name]", sheets.custom_materials) /obj/machinery/ore_silo/screwdriver_act(mob/living/user, obj/item/tool) - return default_deconstruction_screwdriver(user, icon_state, icon_state, tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + return ITEM_INTERACT_SUCCESS /obj/machinery/ore_silo/crowbar_act(mob/living/user, obj/item/tool) - return default_deconstruction_crowbar(tool) - -/obj/machinery/ore_silo/ui_interact(mob/user) - user.set_machine(src) - var/datum/browser/popup = new(user, "ore_silo", null, 600, 550) - popup.set_content(generate_ui()) - popup.open() - -/obj/machinery/ore_silo/proc/generate_ui() - var/list/ui = list("Ore Silo

Stored Material:

") - var/any = FALSE - for(var/M in materials.materials) - var/datum/material/mat = M - var/amount = materials.materials[M] - var/sheets = round(amount) / SHEET_MATERIAL_AMOUNT - var/ref = REF(M) - if (sheets) - if (sheets >= 1) - ui += "Eject" - else - ui += "Eject" - if (sheets >= 20) - ui += "20x" - else - ui += "20x" - ui += "[mat.name]: [sheets] sheets
" - any = TRUE - if(!any) - ui += "Nothing!" - - ui += "

Connected Machines:

" - for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) - var/atom/parent = mats.parent - ui += "Remove" - ui += "[holds[mats] ? "Allow" : "Hold"]" - ui += " [parent.name] in [get_area_name(parent, TRUE)]
" - if(!ore_connected_machines.len) - ui += "Nothing!" - - ui += "

Access Logs:

" - var/list/logs = GLOB.silo_access_logs[REF(src)] - var/len = LAZYLEN(logs) - var/num_pages = 1 + round((len - 1) / 30) - var/page = clamp(log_page, 1, num_pages) - if(num_pages > 1) - for(var/i in 1 to num_pages) - if(i == page) - ui += "[i]" - else - ui += "[i]" - - ui += "
    " - any = FALSE - for(var/i in (page - 1) * 30 + 1 to min(page * 30, len)) - var/datum/ore_silo_log/entry = logs[i] - ui += "
  1. [entry.formatted]
  2. " - any = TRUE - if (!any) - ui += "
  3. Nothing!
  4. " - - ui += "
" - return ui.Join() - -/obj/machinery/ore_silo/Topic(href, href_list) - if(..()) - return - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["remove"]) - var/datum/component/remote_materials/mats = locate(href_list["remove"]) in ore_connected_machines - if (mats) - mats.disconnect_from(src) - updateUsrDialog() - return TRUE - else if(href_list["hold"]) - var/datum/component/remote_materials/mats = locate(href_list["hold"]) in ore_connected_machines - mats.toggle_holding() - updateUsrDialog() - return TRUE - else if(href_list["ejectsheet"]) - var/datum/material/eject_sheet = locate(href_list["ejectsheet"]) - var/amount = text2num(href_list["eject_amt"]) - materials.retrieve_sheets(amount, eject_sheet, drop_location()) - return TRUE - else if(href_list["page"]) - log_page = text2num(href_list["page"]) || 1 - updateUsrDialog() - return TRUE + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS /obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/multitool/I) + I.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") + return ITEM_INTERACT_SUCCESS + +/obj/machinery/ore_silo/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/sheetmaterials) + ) + +/obj/machinery/ore_silo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "OreSilo") + ui.open() + +/obj/machinery/ore_silo/ui_static_data(mob/user) + return materials.ui_static_data() + +/obj/machinery/ore_silo/ui_data(mob/user) + var/list/data = list() + + data["materials"] = materials.ui_data() + + data["machines"] = list() + for(var/datum/component/remote_materials/remote as anything in ore_connected_machines) + var/atom/parent = remote.parent + data["machines"] += list( + list( + "icon" = icon2base64(icon(initial(parent.icon), initial(parent.icon_state), frame = 1)), + "name" = parent.name, + "onHold" = !!holds[remote], + "location" = get_area_name(parent, TRUE) + ) + ) + + data["logs"] = list() + for(var/datum/ore_silo_log/entry as anything in GLOB.silo_access_logs[REF(src)]) + data["logs"] += list( + list( + "rawMaterials" = entry.get_raw_materials(""), + "machineName" = entry.machine_name, + "areaName" = entry.area_name, + "action" = entry.action, + "amount" = entry.amount, + "time" = entry.timestamp, + "noun" = entry.noun + ) + ) + + return data + +/obj/machinery/ore_silo/ui_act(action, list/params) . = ..() - if (istype(I)) - I.set_buffer(src) - balloon_alert(user, "saved to multitool buffer") - return TRUE + if(.) + return + + switch(action) + if("remove") + var/index = params["id"] + if(isnull(index)) + return + + index = text2num(index) + if(isnull(index)) + return + + var/datum/component/remote_materials/remote = ore_connected_machines[index] + if(isnull(remote)) + return + + remote.disconnect_from(src) + return TRUE + + if("hold") + var/index = params["id"] + if(isnull(index)) + return + + index = text2num(index) + if(isnull(index)) + return + + var/datum/component/remote_materials/remote = ore_connected_machines[index] + if(isnull(remote)) + return + + remote.toggle_holding() + return TRUE + + if("eject") + var/datum/material/ejecting = locate(params["ref"]) + if(!istype(ejecting)) + return + + var/amount = params["amount"] + if(isnull(amount)) + return + + amount = text2num(amount) + if(isnull(amount)) + return + + materials.retrieve_sheets(amount, ejecting, drop_location()) + return TRUE /** * Creates a log entry for depositing/withdrawing from the silo both ingame and in text based log @@ -185,6 +223,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) if (!length(mats)) return + var/datum/ore_silo_log/entry = new(M, action, amount, noun, mats) var/list/datum/ore_silo_log/logs = GLOB.silo_access_logs[REF(src)] if(!LAZYLEN(logs)) @@ -192,23 +231,23 @@ GLOBAL_LIST_EMPTY(silo_access_logs) else if(!logs[1].merge(entry)) logs.Insert(1, entry) - updateUsrDialog() flick("silo_active", src) -/obj/machinery/ore_silo/examine(mob/user) - . = ..() - . += span_notice("[src] can be linked to techfabs, circuit printers and protolathes with a multitool.") - +///The log entry for an ore silo action /datum/ore_silo_log - var/name // for VV - var/formatted // for display - + ///The time of action var/timestamp + ///The name of the machine that remotely acted on the ore silo var/machine_name + ///The area of the machine that remotely acted on the ore silo var/area_name + ///The actual action performed by the machine var/action + ///An short verb describing the action var/noun + ///The amount of items affected by this action e.g. print quantity, sheets ejected etc. var/amount + ///List of individual materials used in the action var/list/materials /datum/ore_silo_log/New(obj/machinery/M, _action, _amount, _noun, list/mats=list()) @@ -219,7 +258,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs) amount = _amount noun = _noun materials = mats.Copy() - format() var/list/data = list( "machine_name" = machine_name, "area_name" = AREACOORD(M), @@ -235,6 +273,12 @@ GLOBAL_LIST_EMPTY(silo_access_logs) data, ) +/** + * Merges a silo log entry with this one + * Arguments + * + * * datum/ore_silo_log/other - the other silo entry we are trying to merge with this one + */ /datum/ore_silo_log/proc/merge(datum/ore_silo_log/other) if (other == src || action != other.action || noun != other.noun) return FALSE @@ -245,13 +289,14 @@ GLOBAL_LIST_EMPTY(silo_access_logs) amount += other.amount for(var/each in other.materials) materials[each] += other.materials[each] - format() return TRUE -/datum/ore_silo_log/proc/format() - name = "[machine_name]: [action] [amount]x [noun]" - formatted = "([timestamp]) [machine_name] in [area_name]
[action] [abs(amount)]x [noun]
[get_raw_materials("")]" - +/** + * Returns list/materials but with each entry joined by an seperator to create 1 string + * Arguments + * + * * separator - the string used to concatenate all entries in list/materials + */ /datum/ore_silo_log/proc/get_raw_materials(separator) var/list/msg = list() for(var/key in materials) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f1a661e6a48..085fbca1945 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -69,7 +69,7 @@ new /obj/item/flashlight/seclite(src) new /obj/item/storage/bag/plants(src) new /obj/item/storage/bag/ore(src) - new /obj/item/t_scanner/adv_mining_scanner/lesser(src) + new /obj/item/mining_scanner(src) new /obj/item/clothing/glasses/meson(src) if (HAS_TRAIT(SSstation, STATION_TRAIT_SMALLER_PODS)) new /obj/item/survivalcapsule/bathroom(src) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_box.dm similarity index 76% rename from code/modules/mining/satchel_ore_boxdm.dm rename to code/modules/mining/satchel_ore_box.dm index 607bbcd9f06..7a82b9483a0 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_box.dm @@ -10,8 +10,9 @@ pressure_resistance = 5*ONE_ATMOSPHERE /obj/structure/ore_box/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/stack/ore)) - user.transferItemToLoc(W, src) + if (istype(W, /obj/item/stack/ore) || istype(W, /obj/item/boulder)) + if(!user.transferItemToLoc(W, src)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN else if(W.atom_storage) W.atom_storage.remove_type(/obj/item/stack/ore, src, INFINITY, TRUE, FALSE, user, null) to_chat(user, span_notice("You empty the ore in [W] into \the [src].")) @@ -45,7 +46,7 @@ /obj/structure/ore_box/proc/dump_box_contents() var/drop = drop_location() var/turf/our_turf = get_turf(src) - for(var/obj/item/stack/ore/O in src) + for(var/obj/item/O in src) if(QDELETED(O)) continue if(QDELETED(src)) @@ -64,17 +65,24 @@ ui.open() /obj/structure/ore_box/ui_data() - var/contents = list() - for(var/obj/item/stack/ore/O in src) - contents[O.type] += O.amount + var/item_contents = list() + var/boulder_count = 0 + for(var/obj/item/stack/ore/potental_ore as anything in contents) + if(istype(potental_ore, /obj/item/stack/ore)) + item_contents[potental_ore.type] += potental_ore.amount + else + boulder_count++ var/data = list() - data["materials"] = list() - for(var/type in contents) - var/obj/item/stack/ore/O = type - var/name = initial(O.name) - data["materials"] += list(list("name" = name, "amount" = contents[type], "id" = type)) + data["materials"] = list() + + for(var/obj/item/stone as anything in item_contents) + if(ispath(stone, /obj/item/stack/ore)) + var/obj/item/stack/ore/found_ore = stone + var/name = initial(found_ore.name) + data["materials"] += list(list("name" = name, "amount" = item_contents[stone], "id" = type)) + data["boulders"] = boulder_count return data /obj/structure/ore_box/ui_act(action, params) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index d1e75d0ab14..e15218a9fef 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -25,7 +25,7 @@ /datum/preferences/proc/hardcore_random_setup(mob/living/carbon/human/character) var/next_hardcore_score = select_hardcore_quirks() character.hardcore_survival_score = next_hardcore_score ** 1.2 //30 points would be about 60 score - log_admin("[character] started hardcore random with [english_list(all_quirks)], for a score of [next_hardcore_score].") + log_game("[character] started hardcore random with [english_list(all_quirks)], for a score of [next_hardcore_score].") //Add a sixpack because honestly var/obj/item/bodypart/chest/chest = character.get_bodypart(BODY_ZONE_CHEST) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 3dd88935437..19a7b5a6650 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -151,6 +151,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) SSpoints_of_interest.make_point_of_interest(src) ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, ref(src)) + ADD_TRAIT(src, TRAIT_SECURITY_HUD, ref(src)) /mob/dead/observer/get_photo_description(obj/item/camera/camera) if(!invisibility || camera.see_ghosts) @@ -171,10 +172,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) mind.current.med_hud_set_status() GLOB.ghost_images_default -= ghostimage_default - QDEL_NULL(ghostimage_default) + ghostimage_default = null GLOB.ghost_images_simple -= ghostimage_simple - QDEL_NULL(ghostimage_simple) + ghostimage_simple = null updateallghostimages() diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 27c6d939fbc..9b7722ed85b 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -138,10 +138,8 @@ if(staminaloss > 0) adjustStaminaLoss(-stamina_recovery * seconds_per_tick, forced = TRUE) -/mob/living/basic/say_mod(input, list/message_mods = list()) - if(length(speak_emote)) - verb_say = pick(speak_emote) - return ..() +/mob/living/basic/get_default_say_verb() + return length(speak_emote) ? pick(speak_emote) : ..() /mob/living/basic/death(gibbed) . = ..() diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm index 03f684b7d87..646cabe339d 100644 --- a/code/modules/mob/living/basic/basic_defense.dm +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -4,31 +4,7 @@ return TRUE if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if(user.move_force < move_resist) - return - user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - playsound(src, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - var/shove_dir = get_dir(user, src) - if(!Move(get_step(src, shove_dir), shove_dir)) - log_combat(user, src, "shoved", "failing to move it") - user.visible_message( - span_danger("[user.name] [response_disarm_continuous] [src]!"), - span_danger("You [response_disarm_simple] [src]!"), - span_hear("You hear aggressive shuffling!"), - COMBAT_MESSAGE_RANGE, - list(src), - ) - to_chat(src, span_userdanger("You're shoved by [user.name]!")) - return TRUE - log_combat(user, src, "shoved", "pushing it") - user.visible_message( - span_danger("[user.name] [response_disarm_continuous] [src], pushing [p_them()]!"), - span_danger("You [response_disarm_simple] [src], pushing [p_them()]!"), - span_hear("You hear aggressive shuffling!"), - COMBAT_MESSAGE_RANGE, - list(src), - ) - to_chat(src, span_userdanger("You're pushed by [user.name]!")) + user.disarm(src) return TRUE if(!user.combat_mode) @@ -63,6 +39,19 @@ updatehealth() return TRUE +/mob/living/basic/get_shoving_message(mob/living/shover, obj/item/weapon, shove_flags) + if(weapon) // no "gently pushing aside" if you're pressing a shield at them. + return ..() + var/moved = !(shove_flags & SHOVE_BLOCKED) + shover.visible_message( + span_danger("[shover.name] [response_disarm_continuous] [src][moved ? ", pushing [p_them()]" : ""]!"), + span_danger("You [response_disarm_simple] [src][moved ? ", pushing [p_them()]" : ""]!"), + span_hear("You hear aggressive shuffling!"), + COMBAT_MESSAGE_RANGE, + list(src), + ) + to_chat(src, span_userdanger("You're [moved ? "pushed" : "shoved"] by [shover.name]!")) + /mob/living/basic/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) @@ -112,13 +101,6 @@ if(damage_done > 0) attacking_larva.amount_grown = min(attacking_larva.amount_grown + damage_done, attacking_larva.max_grown) -/mob/living/basic/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - var/damage = rand(15, 25) - if(M.is_adult) - damage = rand(20, 35) - return apply_damage(damage, M.melee_damage_type) - /mob/living/basic/attack_drone(mob/living/basic/drone/attacking_drone) if(attacking_drone.combat_mode) //No kicking dogs even as a rogue drone. Use a weapon. return diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index f8b273804ea..8462f4afc35 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -546,8 +546,7 @@ GLOBAL_LIST_INIT(command_strings, list( /mob/living/basic/bot/proc/bot_reset(bypass_ai_reset = FALSE) SEND_SIGNAL(src, COMSIG_BOT_RESET) - if(length(initial_access)) - access_card.set_access(initial_access) + access_card.set_access(initial_access) diag_hud_set_botstat() diag_hud_set_botmode() clear_path_hud() diff --git a/code/modules/mob/living/basic/bots/bot_ai.dm b/code/modules/mob/living/basic/bots/bot_ai.dm index 802b66ef48d..19b7bcbdb5e 100644 --- a/code/modules/mob/living/basic/bots/bot_ai.dm +++ b/code/modules/mob/living/basic/bots/bot_ai.dm @@ -5,7 +5,8 @@ "salutes", "nods in appreciation towards", "fist bumps", - ) + ), + BB_UNREACHABLE_LIST_COOLDOWN = 45 SECONDS, ) ai_movement = /datum/ai_movement/jps/bot @@ -53,10 +54,12 @@ clear_blackboard_key(key) ///set the target if we can reach them -/datum/ai_controller/basic_controller/bot/proc/set_if_can_reach(key, target, distance = 10) +/datum/ai_controller/basic_controller/bot/proc/set_if_can_reach(key, target, distance = 10, bypass_add_to_blacklist = FALSE) if(can_reach_target(target, distance)) set_blackboard_key(key, target) return TRUE + if(!bypass_add_to_blacklist) + set_blackboard_key_assoc_lazylist(BB_TEMPORARY_IGNORE_LIST, REF(target), TRUE) return FALSE /datum/ai_controller/basic_controller/bot/proc/can_reach_target(target, distance = 10) @@ -69,33 +72,16 @@ return FALSE return TRUE -///check if the target is too far away, and delete them if so and add them to the unreachables list -/datum/ai_controller/basic_controller/bot/proc/reachable_key(key, distance = 10) - var/datum/target = blackboard[key] - if(QDELETED(target)) - return FALSE - var/datum/last_attempt = blackboard[BB_LAST_ATTEMPTED_PATHING] - if(last_attempt != target) - current_pathing_attempts = 0 - set_blackboard_key(BB_LAST_ATTEMPTED_PATHING, target) - else - current_pathing_attempts++ - if(current_pathing_attempts >= max_pathing_attempts || !can_reach_target(target, distance)) - clear_blackboard_key(key) - clear_blackboard_key(BB_LAST_ATTEMPTED_PATHING) - set_blackboard_key_assoc_lazylist(BB_TEMPORARY_IGNORE_LIST, target, TRUE) - return FALSE - return TRUE - /// subtree to manage our list of unreachables, we reset it every 15 seconds /datum/ai_planning_subtree/manage_unreachable_list /datum/ai_planning_subtree/manage_unreachable_list/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(isnull(controller.blackboard[BB_UNREACHABLE_LIST_COOLDOWN]) || controller.blackboard[BB_CLEAR_LIST_READY] > world.time) + return controller.queue_behavior(/datum/ai_behavior/manage_unreachable_list, BB_TEMPORARY_IGNORE_LIST) /datum/ai_behavior/manage_unreachable_list behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION - action_cooldown = 45 SECONDS /datum/ai_behavior/manage_unreachable_list/perform(seconds_per_tick, datum/ai_controller/controller, list_key) . = ..() @@ -103,8 +89,13 @@ controller.clear_blackboard_key(list_key) finish_action(controller, TRUE) +/datum/ai_behavior/manage_unreachable_list/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.set_blackboard_key(BB_CLEAR_LIST_READY, controller.blackboard[BB_UNREACHABLE_LIST_COOLDOWN] + world.time) /datum/ai_planning_subtree/find_patrol_beacon + ///travel towards beacon behavior + var/travel_behavior = /datum/ai_behavior/travel_towards/beacon /datum/ai_planning_subtree/find_patrol_beacon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/basic/bot/bot_pawn = controller.pawn @@ -113,7 +104,7 @@ if(controller.blackboard_key_exists(BB_BEACON_TARGET)) bot_pawn.update_bot_mode(new_mode = BOT_PATROL) - controller.queue_behavior(/datum/ai_behavior/travel_towards/beacon, BB_BEACON_TARGET) + controller.queue_behavior(travel_behavior, BB_BEACON_TARGET) return if(controller.blackboard_key_exists(BB_PREVIOUS_BEACON_TARGET)) @@ -131,9 +122,9 @@ var/atom/final_target var/atom/previous_target = controller.blackboard[BB_PREVIOUS_BEACON_TARGET] for(var/obj/machinery/navbeacon/beacon as anything in GLOB.navbeacons["[bot_pawn.z]"]) - if(beacon == previous_target) - continue var/dist = get_dist(bot_pawn, beacon) + if(beacon == previous_target || dist <= 1) + continue if(dist > closest_distance) continue closest_distance = dist @@ -169,6 +160,7 @@ /datum/ai_behavior/travel_towards/beacon clear_target = TRUE + new_movement_type = /datum/ai_movement/jps/bot/travel_to_beacon /datum/ai_behavior/travel_towards/beacon/finish_action(datum/ai_controller/controller, succeeded, target_key) var/atom/target = controller.blackboard[target_key] @@ -187,6 +179,7 @@ /datum/ai_behavior/travel_towards/bot_summon clear_target = TRUE + new_movement_type = /datum/ai_movement/jps/bot/travel_to_beacon /datum/ai_behavior/travel_towards/bot_summon/finish_action(datum/ai_controller/controller, succeeded, target_key) var/mob/living/basic/bot/bot_pawn = controller.pawn diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm index 8a8050b9afc..a81f48c9c95 100644 --- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm +++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot.dm @@ -321,15 +321,18 @@ INVOKE_ASYNC(weapon, TYPE_PROC_REF(/obj/item, attack), stabbed_carbon, src) stabbed_carbon.Knockdown(2 SECONDS) -/mob/living/basic/bot/cleanbot/proc/pre_attack(mob/living/source, atom/target) +/mob/living/basic/bot/cleanbot/proc/pre_attack(mob/living/source, atom/target, proximity, modifiers) SIGNAL_HANDLER + if(!proximity || !can_unarmed_attack()) + return NONE + if(is_type_in_typecache(target, huntable_pests) && !isnull(our_mop)) INVOKE_ASYNC(our_mop, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, target) return COMPONENT_CANCEL_ATTACK_CHAIN if(!iscarbon(target) && !is_type_in_typecache(target, huntable_trash)) - return + return NONE visible_message(span_danger("[src] sprays hydrofluoric acid at [target]!")) playsound(src, 'sound/effects/spray2.ogg', 50, TRUE, -6) diff --git a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm index 5a992c1cc75..3c49a322e51 100644 --- a/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm +++ b/code/modules/mob/living/basic/bots/cleanbot/cleanbot_ai.dm @@ -6,6 +6,7 @@ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_UNREACHABLE_LIST_COOLDOWN = 3 MINUTES, BB_SALUTE_MESSAGES = list( "salutes", "nods in appreciation towards", @@ -51,7 +52,7 @@ /datum/ai_planning_subtree/cleaning_subtree /datum/ai_planning_subtree/cleaning_subtree/SelectBehaviors(datum/ai_controller/basic_controller/bot/cleanbot/controller, seconds_per_tick) - if(controller.reachable_key(BB_CLEAN_TARGET, BOT_CLEAN_PATH_LIMIT)) + if(controller.blackboard_key_exists(BB_CLEAN_TARGET)) controller.queue_behavior(/datum/ai_behavior/execute_clean, BB_CLEAN_TARGET) return SUBTREE_RETURN_FINISH_PLANNING @@ -68,13 +69,17 @@ controller.queue_behavior(/datum/ai_behavior/find_and_set/in_list/clean_targets, BB_CLEAN_TARGET, final_hunt_list) /datum/ai_behavior/find_and_set/in_list/clean_targets - action_cooldown = 1 SECONDS + action_cooldown = 3 SECONDS /datum/ai_behavior/find_and_set/in_list/clean_targets/search_tactic(datum/ai_controller/controller, locate_paths, search_range) var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) var/list/ignore_list = controller.blackboard[BB_TEMPORARY_IGNORE_LIST] for(var/atom/found_item in found) - if(LAZYACCESS(ignore_list, found_item)) + if(LAZYACCESS(ignore_list, REF(found_item))) + continue + var/list/path = get_path_to(controller.pawn, found_item, max_distance = BOT_CLEAN_PATH_LIMIT, access = controller.get_access()) + if(!length(path)) + controller.set_blackboard_key_assoc_lazylist(BB_TEMPORARY_IGNORE_LIST, REF(found_item), TRUE) continue return found_item @@ -84,7 +89,7 @@ var/mob/living/basic/bot/cleanbot/bot_pawn = controller.pawn if(!(bot_pawn.bot_access_flags & BOT_COVER_EMAGGED)) return - if(controller.reachable_key(BB_ACID_SPRAY_TARGET, BOT_CLEAN_PATH_LIMIT)) + if(controller.blackboard_key_exists(BB_ACID_SPRAY_TARGET)) controller.queue_behavior(/datum/ai_behavior/execute_clean, BB_ACID_SPRAY_TARGET) return SUBTREE_RETURN_FINISH_PLANNING @@ -97,7 +102,7 @@ /datum/ai_behavior/find_and_set/spray_target/search_tactic(datum/ai_controller/controller, locate_path, search_range) var/list/ignore_list = controller.blackboard[BB_TEMPORARY_IGNORE_LIST] for(var/mob/living/carbon/human/human_target in oview(search_range, controller.pawn)) - if(LAZYACCESS(ignore_list, human_target)) + if(LAZYACCESS(ignore_list, REF(human_target))) continue if(human_target.stat != CONSCIOUS || isnull(human_target.mind)) continue @@ -130,6 +135,10 @@ . = ..() controller.set_blackboard_key(BB_POST_CLEAN_COOLDOWN, POST_CLEAN_COOLDOWN + world.time) var/atom/target = controller.blackboard[target_key] + if(!succeeded && !isnull(target)) + controller.clear_blackboard_key(target_key) + controller.set_blackboard_key_assoc_lazylist(BB_TEMPORARY_IGNORE_LIST, REF(target), TRUE) + return if(QDELETED(target) || is_type_in_typecache(target, controller.blackboard[BB_HUNTABLE_TRASH])) return if(!iscarbon(target)) @@ -203,12 +212,12 @@ return if(isnull(parent.ai_controller)) return - if(LAZYACCESS(parent.ai_controller.blackboard[BB_TEMPORARY_IGNORE_LIST], target)) + if(LAZYACCESS(parent.ai_controller.blackboard[BB_TEMPORARY_IGNORE_LIST], REF(target))) return return ..() /datum/pet_command/point_targeting/clean/execute_action(datum/ai_controller/basic_controller/bot/controller) - if(controller.reachable_key(BB_CURRENT_PET_TARGET)) + if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET)) controller.queue_behavior(/datum/ai_behavior/execute_clean, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm b/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm index 2d2bc27079f..d982869595b 100644 --- a/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm +++ b/code/modules/mob/living/basic/bots/hygienebot/hygienebot_ai.dm @@ -1,4 +1,5 @@ #define BOT_FRUSTRATION_LIMIT 8 +#define BOT_ANGER_THRESHOLD 5 /datum/ai_controller/basic_controller/bot/hygienebot blackboard = list( @@ -128,7 +129,7 @@ var/datum/action/cooldown/bot_announcement/announcement = controller.blackboard[BB_ANNOUNCE_ABILITY] if(succeeded) - if(controller.blackboard[BB_WASH_FRUSTRATION] > 0) + if(controller.blackboard[BB_WASH_FRUSTRATION] > BOT_ANGER_THRESHOLD) announcement.announce(pick(controller.blackboard[BB_WASH_DONE])) controller.clear_blackboard_key(target_key) return @@ -139,4 +140,5 @@ announcement.announce(pick(controller.blackboard[BB_WASH_THREATS])) controller.set_blackboard_key(BB_WASH_FRUSTRATION, 0) +#undef BOT_ANGER_THRESHOLD #undef BOT_FRUSTRATION_LIMIT diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm index cad238b01d1..7e801d53798 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm @@ -399,6 +399,7 @@ health = 40 maxHealth = 40 maints_access_required = list(ACCESS_SYNDICATE) + bot_mode_flags = parent_type::bot_mode_flags & ~BOT_MODE_REMOTE_ENABLED radio_key = /obj/item/encryptionkey/syndicate radio_channel = RADIO_CHANNEL_SYNDICATE damage_type_healer = HEAL_ALL_DAMAGE diff --git a/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm b/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm index ceb333b1755..21f9ab29d1b 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot_ai.dm @@ -7,7 +7,7 @@ /datum/ai_planning_subtree/find_and_hunt_target/patients_in_crit, /datum/ai_planning_subtree/treat_wounded_target, /datum/ai_planning_subtree/salute_authority, - /datum/ai_planning_subtree/find_patrol_beacon, + /datum/ai_planning_subtree/find_patrol_beacon/medbot, ) ai_movement = /datum/ai_movement/jps/bot/medbot reset_keys = list( @@ -19,6 +19,8 @@ ai_traits = PAUSE_DURING_DO_AFTER /datum/ai_movement/jps/bot/medbot + maximum_length = BOT_PATIENT_PATH_LIMIT + max_pathing_attempts = 20 // only AI isnt allowed to move when this flag is set, sentient players can /datum/ai_movement/jps/bot/medbot/allowed_to_move(datum/move_loop/source) @@ -28,6 +30,9 @@ return FALSE return ..() +/datum/ai_movement/jps/bot/medbot/travel_to_beacon + maximum_length = AI_BOT_PATH_LENGTH + /datum/ai_planning_subtree/treat_wounded_target @@ -36,9 +41,9 @@ if(bot_pawn.medical_mode_flags & MEDBOT_TIPPED_MODE) controller.clear_blackboard_key(BB_PATIENT_TARGET) return - var/reach_distance = (bot_pawn.medical_mode_flags & MEDBOT_STATIONARY_MODE) ? 1 : BOT_PATIENT_PATH_LIMIT - if(controller.reachable_key(BB_PATIENT_TARGET, reach_distance)) - controller.queue_behavior(/datum/ai_behavior/tend_to_patient, BB_PATIENT_TARGET, bot_pawn.heal_threshold, bot_pawn.damage_type_healer, bot_pawn.bot_access_flags) + var/is_stationary = bot_pawn.medical_mode_flags & MEDBOT_STATIONARY_MODE + if(controller.blackboard_key_exists(BB_PATIENT_TARGET)) + controller.queue_behavior(/datum/ai_behavior/tend_to_patient, BB_PATIENT_TARGET, bot_pawn.heal_threshold, bot_pawn.damage_type_healer, bot_pawn.bot_access_flags, is_stationary) return SUBTREE_RETURN_FINISH_PLANNING controller.queue_behavior(/datum/ai_behavior/find_suitable_patient, BB_PATIENT_TARGET, bot_pawn.heal_threshold, bot_pawn.damage_type_healer, bot_pawn.medical_mode_flags, bot_pawn.bot_access_flags) @@ -52,18 +57,18 @@ search_range = (mode_flags & MEDBOT_STATIONARY_MODE) ? 1 : initial(search_range) var/list/ignore_keys = controller.blackboard[BB_TEMPORARY_IGNORE_LIST] for(var/mob/living/carbon/human/treatable_target in oview(search_range, controller.pawn)) - if(LAZYACCESS(ignore_keys, treatable_target) || treatable_target.stat == DEAD) + if(LAZYACCESS(ignore_keys, REF(treatable_target)) || treatable_target.stat == DEAD) continue if((access_flags & BOT_COVER_EMAGGED) && treatable_target.stat == CONSCIOUS) - controller.set_blackboard_key(BB_PATIENT_TARGET, treatable_target) + controller.set_if_can_reach(BB_PATIENT_TARGET, treatable_target, distance =BOT_PATIENT_PATH_LIMIT, bypass_add_to_blacklist = (search_range == 1)) break if((heal_type == HEAL_ALL_DAMAGE)) if(treatable_target.get_total_damage() > threshold) - controller.set_blackboard_key(BB_PATIENT_TARGET, treatable_target) + controller.set_if_can_reach(BB_PATIENT_TARGET, treatable_target, distance = BOT_PATIENT_PATH_LIMIT, bypass_add_to_blacklist = (search_range == 1)) break continue if(treatable_target.get_current_damage_of_type(damagetype = heal_type) > threshold) - controller.set_blackboard_key(BB_PATIENT_TARGET, treatable_target) + controller.set_if_can_reach(BB_PATIENT_TARGET, treatable_target, distance = BOT_PATIENT_PATH_LIMIT, bypass_add_to_blacklist = (search_range == 1)) break finish_action(controller, controller.blackboard_key_exists(BB_PATIENT_TARGET)) @@ -85,14 +90,14 @@ return FALSE set_movement_target(controller, target) -/datum/ai_behavior/tend_to_patient/perform(seconds_per_tick, datum/ai_controller/basic_controller/bot/controller, target_key, threshold, damage_type_healer, access_flags) +/datum/ai_behavior/tend_to_patient/perform(seconds_per_tick, datum/ai_controller/basic_controller/bot/controller, target_key, threshold, damage_type_healer, access_flags, is_stationary) . = ..() var/mob/living/carbon/human/patient = controller.blackboard[target_key] if(QDELETED(patient) || patient.stat == DEAD) - finish_action(controller, FALSE, target_key) + finish_action(controller, FALSE, target_key, is_stationary) return if(check_if_healed(patient, threshold, damage_type_healer, access_flags)) - finish_action(controller, TRUE, target_key, healed_target = TRUE) + finish_action(controller, TRUE, target_key, is_stationary, healed_target = TRUE) return var/mob/living/basic/bot/bot_pawn = controller.pawn @@ -100,16 +105,23 @@ var/datum/action/cooldown/bot_announcement/announcement = controller.blackboard[BB_ANNOUNCE_ABILITY] announcement?.announce(pick(controller.blackboard[BB_NEAR_DEATH_SPEECH])) bot_pawn.melee_attack(patient) - finish_action(controller, TRUE, target_key) + finish_action(controller, TRUE, target_key, is_stationary) // only clear the target if they get healed -/datum/ai_behavior/tend_to_patient/finish_action(datum/ai_controller/controller, succeeded, target_key, healed_target = FALSE) +/datum/ai_behavior/tend_to_patient/finish_action(datum/ai_controller/controller, succeeded, target_key, is_stationary, healed_target = FALSE) . = ..() - if(!succeeded) - return var/atom/target = controller.blackboard[target_key] + if(!succeeded) + + if(!isnull(target) && !is_stationary) + controller.set_blackboard_key_assoc_lazylist(BB_TEMPORARY_IGNORE_LIST, REF(target), TRUE) + + controller.clear_blackboard_key(target_key) + return + if(QDELETED(target) || !healed_target) return + var/datum/action/cooldown/bot_announcement/announcement = controller.blackboard[BB_ANNOUNCE_ABILITY] announcement?.announce(pick(controller.blackboard[BB_AFTERHEAL_SPEECH])) controller.clear_blackboard_key(target_key) @@ -207,4 +219,11 @@ . = ..() controller.clear_blackboard_key(target_key) +/datum/ai_planning_subtree/find_patrol_beacon/medbot + ///travel towards beacon behavior + travel_behavior = /datum/ai_behavior/travel_towards/beacon/medbot + +/datum/ai_behavior/travel_towards/beacon/medbot + new_movement_type = /datum/ai_movement/jps/bot/medbot/travel_to_beacon + #undef BOT_PATIENT_PATH_LIMIT diff --git a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm index 29902d68b81..82c69149f6e 100644 --- a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm +++ b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm @@ -22,7 +22,7 @@ return ..() /mob/living/basic/guardian/explosive/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LAZYACCESS(modifiers, RIGHT_CLICK) && proximity_flag && isobj(attack_target)) + if(LAZYACCESS(modifiers, RIGHT_CLICK) && proximity_flag && isobj(attack_target) && can_unarmed_attack()) bomb.Trigger(target = attack_target) return return ..() diff --git a/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm b/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm index 1728254d3dd..1ce50a3e9fa 100644 --- a/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm +++ b/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm @@ -57,7 +57,7 @@ return TRUE /mob/living/basic/guardian/gravitokinetic/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if (LAZYACCESS(modifiers, RIGHT_CLICK) && proximity_flag && !gravity_targets[attack_target]) + if (LAZYACCESS(modifiers, RIGHT_CLICK) && proximity_flag && !gravity_targets[attack_target] && can_unarmed_attack()) slam_turf(attack_target) return return ..() diff --git a/code/modules/mob/living/basic/guardian/guardian_verbs.dm b/code/modules/mob/living/basic/guardian/guardian_verbs.dm index 7377ad15282..2f40da369f8 100644 --- a/code/modules/mob/living/basic/guardian/guardian_verbs.dm +++ b/code/modules/mob/living/basic/guardian/guardian_verbs.dm @@ -83,6 +83,7 @@ button_icon_state = "communicate" background_icon = 'icons/hud/guardian.dmi' background_icon_state = "base" + check_flags = NONE click_to_activate = FALSE cooldown_time = 0 SECONDS melee_cooldown_time = 0 @@ -119,6 +120,7 @@ button_icon_state = "recall" background_icon = 'icons/hud/guardian.dmi' background_icon_state = "base" + check_flags = NONE click_to_activate = FALSE cooldown_time = 0 SECONDS melee_cooldown_time = 0 @@ -140,6 +142,7 @@ button_icon_state = "ghost" background_icon = 'icons/hud/guardian.dmi' background_icon_state = "base" + check_flags = NONE click_to_activate = FALSE cooldown_time = 5 SECONDS melee_cooldown_time = 0 diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm index ea979febff3..aa3e06af16a 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm @@ -22,11 +22,16 @@ //because one ability is always INFINITY cooldown, this actually works to check which ability should be used //sometimes it will try to spew bile on infinity cooldown, but that's okay because as soon as resurface is ready it will attempt that - if(!QDELETED(resurface) && resurface.next_use_time <= world.time) + + if(resurface?.IsAvailable()) controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_plan_execute, BB_BILEWORM_RESURFACE, BB_BASIC_MOB_CURRENT_TARGET) - else + return SUBTREE_RETURN_FINISH_PLANNING + + var/datum/action/cooldown/mob_cooldown/bile = controller.blackboard[BB_BILEWORM_SPEW_BILE] + + if(bile?.IsAvailable()) controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_plan_execute, BB_BILEWORM_SPEW_BILE, BB_BASIC_MOB_CURRENT_TARGET) - return SUBTREE_RETURN_FINISH_PLANNING //focus on the fight + return SUBTREE_RETURN_FINISH_PLANNING //focus on the fight /datum/ai_planning_subtree/bileworm_execute @@ -35,9 +40,15 @@ var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_EXECUTION_TARGET] if(QDELETED(target) || !isliving(target)) return + + var/datum/action/cooldown/mob_cooldown/devour = controller.blackboard[BB_BILEWORM_DEVOUR] + + if(!(devour?.IsAvailable())) + return + var/mob/living/living_target = target if(living_target.stat < UNCONSCIOUS) return - controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_BILEWORM_DEVOUR, BB_BASIC_MOB_EXECUTION_TARGET) + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target, BB_BILEWORM_DEVOUR, BB_BASIC_MOB_EXECUTION_TARGET) return SUBTREE_RETURN_FINISH_PLANNING //focus on devouring this fool diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm index 9a45ed99e1c..11fd7b6aa26 100644 --- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm @@ -53,4 +53,4 @@ if(!COOLDOWN_FINISHED(src, ore_sensing_cooldown)) return COOLDOWN_START(src, ore_sensing_cooldown, cooldown) - mineral_scan_pulse(get_turf(src), range) + mineral_scan_pulse(get_turf(src), range, src) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index afc87fb7ce5..f35f78ba80f 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -65,7 +65,8 @@ make_tameable() if(can_lay_eggs) make_egg_layer() - + ADD_TRAIT(src, TRAIT_BOULDER_BREAKER, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_INSTANTLY_PROCESSES_BOULDERS, INNATE_TRAIT) RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) /mob/living/basic/mining/goldgrub/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) @@ -83,7 +84,7 @@ /mob/living/basic/mining/goldgrub/proc/barf_contents(gibbed) playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - for(var/obj/item/ore as anything in src) + 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/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm index 53054052e58..a31bf1f3e1d 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm @@ -14,6 +14,8 @@ /datum/ai_planning_subtree/dig_away_from_danger, /datum/ai_planning_subtree/flee_target, /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores, + /datum/ai_planning_subtree/find_and_hunt_target/break_boulders, + /datum/ai_planning_subtree/find_and_hunt_target/harvest_vents, /datum/ai_planning_subtree/find_and_hunt_target/baby_egg, /datum/ai_planning_subtree/mine_walls, ) @@ -43,7 +45,7 @@ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/hunt_ores finding_behavior = /datum/ai_behavior/find_hunt_target/hunt_ores hunt_targets = list(/obj/item/stack/ore) - hunt_chance = 75 + hunt_chance = 90 hunt_range = 9 /datum/ai_behavior/find_hunt_target/hunt_ores @@ -66,6 +68,50 @@ /datum/ai_behavior/hunt_target/unarmed_attack_target/hunt_ores always_reset_target = TRUE +///break boulders so that we can find more food! +/datum/ai_planning_subtree/find_and_hunt_target/harvest_vents + target_key = BB_VENT_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target //We call the ore vent's produce_boulder() proc here to produce a single boulder. + finding_behavior = /datum/ai_behavior/find_hunt_target/harvest_vents + hunt_targets = list(/obj/structure/ore_vent) + hunt_chance = 25 + hunt_range = 15 + +/datum/ai_behavior/find_hunt_target/harvest_vents + +/datum/ai_behavior/find_hunt_target/harvest_vents/valid_dinner(mob/living/basic/source, obj/structure/target, radius) + if(target in source) + return FALSE + + var/turf/vent_turf = target.drop_location() + var/counter = 0 + for(var/obj/item/boulder in vent_turf.contents) + counter++ + if(counter > MAX_BOULDERS_PER_VENT) //Too many items currently on the vent + return FALSE + + return can_see(source, target, radius) + +///break boulders so that we can find more food! +/datum/ai_planning_subtree/find_and_hunt_target/break_boulders + target_key = BB_BOULDER_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target //We process boulders once every tap, so we dont need to do anything special here + finding_behavior = /datum/ai_behavior/find_hunt_target/break_boulders + hunt_targets = list(/obj/item/boulder) + hunt_chance = 100 //If we can, we should always break boulders. + hunt_range = 9 + +/datum/ai_behavior/find_hunt_target/break_boulders + +/datum/ai_behavior/find_hunt_target/break_boulders/valid_dinner(mob/living/basic/source, obj/item/boulder/target, radius) + if(target in source) + return FALSE + + var/obj/item/pet_target = source.ai_controller.blackboard[BB_CURRENT_PET_TARGET] + if(target == pet_target) //we are currently fetching this ore for master, dont eat it! + return FALSE + return can_see(source, target, radius) + ///find our child's egg and pull it! /datum/ai_planning_subtree/find_and_hunt_target/baby_egg target_key = BB_LOW_PRIORITY_HUNTING_TARGET diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm index 91edf40615c..7cc5ea06ad8 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -30,7 +30,7 @@ density = FALSE ai_controller = /datum/ai_controller/basic_controller/legion_brood /// Reference to a guy who made us - var/mob/living/created_by + var/datum/weakref/created_by /mob/living/basic/legion_brood/Initialize(mapload) . = ..() @@ -49,7 +49,12 @@ if (ishuman(target) && target.stat > SOFT_CRIT) infest(target) return - if (isliving(target) && faction_check_atom(target) && !istype(target, created_by?.type)) + + var/mob/living/mob_creator = created_by?.resolve() + if(isnull(mob_creator)) + created_by = null + + if (isliving(target) && faction_check_atom(target) && !istype(target, mob_creator?.type)) visible_message(span_warning("[src] melds with [target]'s flesh!")) target.apply_status_effect(/datum/status_effect/regenerative_core) new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) @@ -78,7 +83,7 @@ faction = creator.faction.Copy() else faction |= REF(creator) - created_by = creator + created_by = WEAKREF(creator) ai_controller?.set_blackboard_key(BB_LEGION_BROOD_CREATOR, creator) RegisterSignal(creator, COMSIG_QDELETING, PROC_REF(creator_destroyed)) diff --git a/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm new file mode 100644 index 00000000000..d85ad69682c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/node_drone/node_drone.dm @@ -0,0 +1,154 @@ +#define FLY_IN_STATE 1 +#define FLY_OUT_STATE 2 +#define NEUTRAL_STATE 3 + +/** + * Mining drones that are spawned when starting a ore vent's wave defense minigame. + * They will latch onto the vent to defend it from lavaland mobs, and will flee if attacked by lavaland mobs. + * If the drone survives, they will fly away to safety as the vent spawns ores. + * If the drone dies, the wave defense will fail. + */ + +/mob/living/basic/node_drone + name = "NODE drone" + desc = "Standard in-atmosphere drone, used by Nanotrasen to operate and excavate valuable ore vents." + icon = 'icons/obj/mining.dmi' + icon_state = "mining_node_active" + icon_living = "mining_node_active" + icon_dead = "mining_node_active" + + maxHealth = 500 + health = 500 + density = TRUE + pass_flags = PASSTABLE|PASSGRILLE|PASSMOB + mob_size = MOB_SIZE_LARGE + mob_biotypes = MOB_ROBOTIC + faction = list(FACTION_STATION, FACTION_NEUTRAL) + light_range = 4 + basic_mob_flags = DEL_ON_DEATH + + speak_emote = list("chirps") + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "clangs" + response_harm_simple = "clang against" + + ai_controller = /datum/ai_controller/basic_controller/node_drone + + /// Is the drone currently attached to a vent? + var/active_node = FALSE + /// What status do we currently track for icon purposes? + var/flying_state = NEUTRAL_STATE + /// Weakref to the vent the drone is currently attached to. + var/obj/structure/ore_vent/attached_vent = null + /// Set when the drone is begining to leave lavaland after the vent is secured. + var/escaping = FALSE + +/mob/living/basic/node_drone/death(gibbed) + . = ..() + explosion(origin = src, light_impact_range = 1, smoke = 1) + +/mob/living/basic/node_drone/Destroy() + attached_vent?.node = null //clean our reference to the vent both ways. + attached_vent = null + return ..() + + +/mob/living/basic/node_drone/examine(mob/user) + . = ..() + var/sameside = user.faction_check_atom(src, exact_match = FALSE) + if(sameside) + . += span_notice("This drone is currently attached to a mineral vent. You should protect it from harm to secure the mineral vent.") + else + . += span_warning("This vile Nanotrasen trash is trying to destroy the environment. Attack it to free the mineral vent from its grasp.") + +/mob/living/basic/node_drone/update_icon_state() + . = ..() + + icon_state = "mining_node_active" + + if(flying_state == FLY_IN_STATE || flying_state == FLY_OUT_STATE) + icon_state = "mining_node_flying" + +/mob/living/basic/node_drone/proc/arrive(obj/structure/ore_vent/parent_vent) + attached_vent = parent_vent + flying_state = FLY_IN_STATE + update_appearance(UPDATE_ICON_STATE) + pixel_z = 400 + animate(src, pixel_z = 0, time = 2 SECONDS, easing = QUAD_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + + +/** + * Called when wave defense is completed. Visually flicks the escape sprite and then deletes the mob. + */ +/mob/living/basic/node_drone/proc/escape() + var/funny_ending = FALSE + flying_state = FLY_OUT_STATE + update_appearance(UPDATE_ICON_STATE) + if(prob(1)) + say("I have to go now, my planet needs me.") + funny_ending = TRUE + visible_message(span_notice("The drone flies away to safety as the vent is secured.")) + animate(src, pixel_z = 400, time = 2 SECONDS, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) + sleep(2 SECONDS) + if(funny_ending) + playsound(src, 'sound/effects/explosion3.ogg', 50, FALSE) //node drone died on the way back to his home planet. + visible_message(span_notice("...or maybe not.")) + qdel(src) + + +/mob/living/basic/node_drone/proc/pre_escape() + if(attached_vent) + attached_vent.unbuckle_mob(src) + attached_vent = null + if(!escaping) + escaping = TRUE + flick("mining_node_escape", src) + addtimer(CALLBACK(src, PROC_REF(escape)), 1.9 SECONDS) + return + +/// The node drone AI controller +// Generally, this is a very simple AI that will try to find a vent and latch onto it, unless attacked by a lavaland mob, who it will try to flee from. +/datum/ai_controller/basic_controller/node_drone + blackboard = list( + BB_BASIC_MOB_FLEEING = FALSE, // Will flee when the vent lies undefended. + BB_CURRENT_HUNTING_TARGET = null, // Hunts for vents. + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, // Use this to find vents to run away from + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = null + planning_subtrees = list( + // Priority is see if lavaland mobs are attacking us to flee from them. + /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee, + // Fly you fool + /datum/ai_planning_subtree/flee_target/node_drone, + // Otherwise, look for and execute hunts for vents to latch onto. + /datum/ai_planning_subtree/find_and_hunt_target/look_for_vent, + ) + +// Node subtree to hunt down ore vents. +/datum/ai_planning_subtree/find_and_hunt_target/look_for_vent + hunting_behavior = /datum/ai_behavior/hunt_target/latch_onto/node_drone + hunt_targets = list(/obj/structure/ore_vent) + hunt_range = 7 // Hunt vents to the end of the earth. + +// node drone behavior for buckling down on a vent. +/datum/ai_behavior/hunt_target/latch_onto/node_drone + hunt_cooldown = 5 SECONDS + +// Evasion behavior. +/datum/ai_planning_subtree/flee_target/node_drone + flee_behaviour = /datum/ai_behavior/run_away_from_target/drone + +/datum/ai_behavior/run_away_from_target/drone + action_cooldown = 1 SECONDS + run_distance = 3 + + +#undef FLY_IN_STATE +#undef FLY_OUT_STATE +#undef NEUTRAL_STATE diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index 6bc0202aed5..f9a22f955f1 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -118,10 +118,8 @@ return ..() /mob/living/basic/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers) - . = ..() - - if(. || user.combat_mode) - return + if(user.combat_mode) + return ..() set_combat_mode(!combat_mode) balloon_alert(user, "now [combat_mode ? "attacking wildlife" : "collecting loose ore"]") diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 17fb3841e2d..207599a1d16 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -54,6 +54,8 @@ . = ..() AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/pet_bonus, "purrs!") + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) + add_cell_sample() add_verb(src, /mob/living/proc/toggle_resting) add_traits(list(TRAIT_CATLIKE_GRACE, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) ai_controller.set_blackboard_key(BB_HUNTABLE_PREY, typecacheof(huntable_items)) @@ -64,6 +66,9 @@ if(can_interact_with_stove) RegisterSignal(src, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(pre_unarmed_attack)) +/mob/living/basic/pet/cat/proc/add_cell_sample() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + /mob/living/basic/pet/cat/proc/pre_attack(mob/living/source, atom/movable/target) SIGNAL_HANDLER if(!is_type_in_list(target, huntable_items) || held_food) @@ -73,9 +78,12 @@ /mob/living/basic/pet/cat/proc/pre_unarmed_attack(mob/living/hitter, atom/target, proximity, modifiers) SIGNAL_HANDLER - if(istype(target, /obj/machinery/oven/range)) - target.attack_hand(src) - return COMPONENT_CANCEL_ATTACK_CHAIN + if(!proximity || !can_unarmed_attack()) + return NONE + if(!istype(target, /obj/machinery/oven/range)) + return NONE + target.attack_hand(src) + return COMPONENT_CANCEL_ATTACK_CHAIN /mob/living/basic/pet/cat/Exited(atom/movable/gone, direction) . = ..() @@ -147,6 +155,8 @@ /obj/item/food/breadslice/plain = 1 ) +/mob/living/basic/pet/cat/breadcat/add_cell_sample() + return /mob/living/basic/pet/cat/original name = "Batsy" @@ -159,6 +169,9 @@ unique_pet = TRUE held_state = "original" +/mob/living/basic/pet/cat/original/add_cell_sample() + return + /mob/living/basic/pet/cat/kitten name = "kitten" desc = "D'aaawwww." diff --git a/code/modules/mob/living/basic/pets/cat/cat_ai.dm b/code/modules/mob/living/basic/pets/cat/cat_ai.dm index 6cd01eb5453..7eff8582355 100644 --- a/code/modules/mob/living/basic/pets/cat/cat_ai.dm +++ b/code/modules/mob/living/basic/pets/cat/cat_ai.dm @@ -2,6 +2,7 @@ blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_HOSTILE_MEOWS = list("Mawwww", "Mrewwww", "mhhhhng..."), + BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/cat), BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/cat/kitten), ) diff --git a/code/modules/mob/living/basic/pets/cat/keeki.dm b/code/modules/mob/living/basic/pets/cat/keeki.dm index 5cf16552e9a..4c18d22b02a 100644 --- a/code/modules/mob/living/basic/pets/cat/keeki.dm +++ b/code/modules/mob/living/basic/pets/cat/keeki.dm @@ -35,6 +35,9 @@ ) AddElement(/datum/element/consumable_mob, reagents_list = on_consume) +/mob/living/basic/pet/cat/cak/add_cell_sample() + return + /mob/living/basic/pet/cat/cak/CheckParts(list/parts) . = ..() var/obj/item/organ/internal/brain/candidate = locate(/obj/item/organ/internal/brain) in contents diff --git a/code/modules/mob/living/basic/pets/cat/kitten_ai.dm b/code/modules/mob/living/basic/pets/cat/kitten_ai.dm index 355ec4d3e48..15630c07838 100644 --- a/code/modules/mob/living/basic/pets/cat/kitten_ai.dm +++ b/code/modules/mob/living/basic/pets/cat/kitten_ai.dm @@ -33,13 +33,13 @@ . = ..() var/atom/target = controller.blackboard[target_key] if(QDELETED(target)) - finish_action(controller, FALSE) + finish_action(controller, FALSE, target_key) var/mob/living/living_pawn = controller.pawn var/list/meowing_list = controller.blackboard[meows_key] if(length(meowing_list)) living_pawn.say(pick(meowing_list), forced = "ai_controller") living_pawn._pointed(target) - finish_action(controller, TRUE) + finish_action(controller, TRUE, target_key) /datum/ai_behavior/beacon_for_food/finish_action(datum/ai_controller/controller, success, target_key) . = ..() diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index 85f48a8f672..38e56f84c84 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -130,7 +130,7 @@ RegisterSignal(part.owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died)) RegisterSignal(part.owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(owner_shocked)) //detach if we are shocked, not beneficial for the host but hey its a sideeffect -/mob/living/basic/living_limb_flesh/proc/owner_shocked(datum/source, shock_damage, source, siemens_coeff, flags) +/mob/living/basic/living_limb_flesh/proc/owner_shocked(datum/source, shock_damage, shock_source, siemens_coeff, flags) SIGNAL_HANDLER if(shock_damage < 10) return @@ -152,7 +152,7 @@ current_bodypart.dismember() return TRUE//on_limb_lost should be called after that -/mob/living/basic/living_limb_flesh/proc/on_limb_lost(atom/movable/source, mob/living/carbon/old_owner, dismembered) +/mob/living/basic/living_limb_flesh/proc/on_limb_lost(atom/movable/source, mob/living/carbon/old_owner, special, dismembered) SIGNAL_HANDLER UnregisterSignal(source, COMSIG_BODYPART_REMOVED) UnregisterSignal(old_owner, COMSIG_LIVING_ELECTROCUTE_ACT) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm index c7bee5a36e9..27fdb25ee22 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_migration.dm @@ -10,32 +10,29 @@ /datum/ai_planning_subtree/carp_migration /datum/ai_planning_subtree/carp_migration/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - . = ..() - // If there's a rift nearby take a ride, then cancel everything else because it's not valid any more - var/obj/effect/temp_visual/lesser_carp_rift/entrance/rift = locate(/obj/effect/temp_visual/lesser_carp_rift/entrance) in orange(controller.pawn, CARP_PORTAL_SEARCH_RANGE) - if (rift) + for(var/obj/effect/temp_visual/lesser_carp_rift/entrance/rift in orange(controller.pawn, CARP_PORTAL_SEARCH_RANGE)) controller.queue_behavior(/datum/ai_behavior/travel_towards_atom, get_turf(rift)) return SUBTREE_RETURN_FINISH_PLANNING - var/list/migration_points = controller.blackboard[BB_CARP_MIGRATION_PATH] - if (!length(migration_points)) - return - + // We have a destination, try to approach it var/turf/moving_to = controller.blackboard[BB_CARP_MIGRATION_TARGET] - - // If we don't have a target or are close enough to it, pick a new one - if (isnull(moving_to) || get_dist(controller.pawn, moving_to) <= CARP_DESTINATION_SEARCH_RANGE) - controller.queue_behavior(/datum/ai_behavior/find_next_carp_migration_step, BB_CARP_MIGRATION_PATH, BB_CARP_MIGRATION_TARGET) + if(!isnull(moving_to)) + var/turf/next_step = get_step_towards(controller.pawn, moving_to) + // Attempt to teleport around if we're blocked + if(next_step.is_blocked_turf(exclude_mobs = TRUE)) + controller.queue_behavior(/datum/ai_behavior/make_carp_rift/towards/unvalidated, BB_CARP_RIFT, BB_CARP_MIGRATION_TARGET) + controller.queue_behavior(/datum/ai_behavior/attack_obstructions/carp, BB_CARP_MIGRATION_TARGET) + controller.queue_behavior(/datum/ai_behavior/step_towards_turf, BB_CARP_MIGRATION_TARGET) + // We've gotten close enough to it, clear it so we can select a new point (or do nothing) + if(get_dist(controller.pawn, moving_to) <= CARP_DESTINATION_SEARCH_RANGE) + controller.clear_blackboard_key(BB_CARP_MIGRATION_TARGET) return SUBTREE_RETURN_FINISH_PLANNING - var/turf/next_step = get_step_towards(controller.pawn, moving_to) - if (next_step.is_blocked_turf(exclude_mobs = TRUE)) - controller.queue_behavior(/datum/ai_behavior/make_carp_rift/towards/unvalidated, BB_CARP_RIFT, BB_CARP_MIGRATION_TARGET) - controller.queue_behavior(/datum/ai_behavior/attack_obstructions/carp, BB_CARP_MIGRATION_TARGET) - controller.queue_behavior(/datum/ai_behavior/step_towards_turf, BB_CARP_MIGRATION_TARGET) - - return SUBTREE_RETURN_FINISH_PLANNING + // We have a path to follow but no destination, select one + if(length(controller.blackboard[BB_CARP_MIGRATION_PATH])) + controller.queue_behavior(/datum/ai_behavior/find_next_carp_migration_step, BB_CARP_MIGRATION_PATH, BB_CARP_MIGRATION_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING /** * # Find next carp migration step @@ -45,14 +42,13 @@ /datum/ai_behavior/find_next_carp_migration_step/perform(seconds_per_tick, datum/ai_controller/controller, path_key, target_key) var/list/blackboard_points = controller.blackboard[path_key] - var/list/potential_migration_points = blackboard_points.Copy() - while (length(potential_migration_points)) - var/turf/potential_destination = popleft(potential_migration_points) - if (!isnull(potential_destination) && get_dist(controller.pawn, potential_destination) > CARP_DESTINATION_SEARCH_RANGE) - controller.set_blackboard_key(target_key, potential_destination) + for(var/turf/migration_point as anything in blackboard_points) + // By the end of this loop we will either have a valid migration point set, or an empty list in our blackboard + blackboard_points -= migration_point + if(get_dist(controller.pawn, migration_point) > CARP_DESTINATION_SEARCH_RANGE) + controller.set_blackboard_key(target_key, migration_point) finish_action(controller, succeeded = TRUE) return - controller.set_blackboard_key(path_key, potential_migration_points.Copy()) finish_action(controller, succeeded = FALSE) diff --git a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm index a417b6c1394..27a9f7d07ae 100644 --- a/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm +++ b/code/modules/mob/living/basic/space_fauna/changeling/headslug.dm @@ -75,7 +75,6 @@ /// Just to be super-duper safe to the player, we do return TRUE if all goes well and read that value in check_and_implant() to be nice to the player. /mob/living/basic/headslug/proc/infect(mob/living/carbon/victim) var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) - egg.Insert(victim) egg.origin = mind diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm index 3f445ea1261..1be2a870de3 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm @@ -35,7 +35,7 @@ /mob/living/basic/migo/Initialize(mapload) . = ..() - migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_alert.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/footstep/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/runtime/hyperspace/hyperspace_begin.ogg', 'sound/runtime/hyperspace/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gun/pistol/shot_suppressed.ogg', 'sound/weapons/gun/pistol/shot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/default/outbreak5.ogg', 'sound/ai/default/outbreak7.ogg', 'sound/ai/default/poweroff.ogg', 'sound/ai/default/radiation.ogg', 'sound/ai/default/shuttlecalled.ogg', 'sound/ai/default/shuttledock.ogg', 'sound/ai/default/shuttlerecalled.ogg', 'sound/ai/default/aimalf.ogg') //hahahaha fuck you code divers + migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_alert.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/footstep/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/runtime/hyperspace/hyperspace_begin.ogg', 'sound/runtime/hyperspace/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desecration-01.ogg', 'sound/misc/desecration-02.ogg', 'sound/misc/desecration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gun/pistol/shot_suppressed.ogg', 'sound/weapons/gun/pistol/shot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kinetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/default/outbreak5.ogg', 'sound/ai/default/outbreak7.ogg', 'sound/ai/default/poweroff.ogg', 'sound/ai/default/radiation.ogg', 'sound/ai/default/shuttlecalled.ogg', 'sound/ai/default/shuttledock.ogg', 'sound/ai/default/shuttlerecalled.ogg', 'sound/ai/default/aimalf.ogg') //hahahaha fuck you code divers AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 0) AddComponent(/datum/component/health_scaling_effects, min_health_slowdown = -1.5, additional_status_callback = CALLBACK(src, PROC_REF(update_dodge_chance))) diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm index 1ab7bd36594..df7eb0c42b3 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm @@ -6,6 +6,7 @@ name = "Rat King's Domain" desc = "Corrupts this area to be more suitable for your rat army." check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED + click_to_activate = FALSE cooldown_time = 6 SECONDS melee_cooldown_time = 0 SECONDS button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -41,6 +42,7 @@ name = "Raise Army" desc = "Raise an army out of the hordes of mice and pests crawling around the maintenance shafts." check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED + click_to_activate = FALSE button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "riot" background_icon_state = "bg_clock" diff --git a/code/modules/mob/living/basic/space_fauna/statue/statue.dm b/code/modules/mob/living/basic/space_fauna/statue/statue.dm index 801aa271d91..814500674fc 100644 --- a/code/modules/mob/living/basic/space_fauna/statue/statue.dm +++ b/code/modules/mob/living/basic/space_fauna/statue/statue.dm @@ -51,10 +51,8 @@ pull_force = MOVE_FORCE_EXTREMELY_STRONG ai_controller = /datum/ai_controller/basic_controller/statue - /// Stores the creator in here if it has one. - var/mob/living/creator = null -/mob/living/basic/statue/Initialize(mapload, mob/living/creator) +/mob/living/basic/statue/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_UNOBSERVANT, INNATE_TRAIT) AddComponent(/datum/component/unobserved_actor, unobserved_flags = NO_OBSERVED_MOVEMENT | NO_OBSERVED_ATTACKS) @@ -65,10 +63,6 @@ ) grant_actions_by_list(innate_actions) - // Set creator - if(creator) - src.creator = creator - /mob/living/basic/statue/med_hud_set_health() return //we're a statue we're invincible @@ -142,7 +136,6 @@ /datum/ai_controller/basic_controller/statue blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, - BB_LOW_PRIORITY_HUNTING_TARGET = null, // lights ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm index 98daeb6d8c2..04d52cf6212 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm @@ -37,7 +37,7 @@ animal.health = min(animal.maxHealth, animal.health * 1.5) animal.melee_damage_lower = max((animal.melee_damage_lower * 2), 10) animal.melee_damage_upper = max((animal.melee_damage_upper * 2), 10) - animal.transform *= 2 - AddElement(/datum/element/wall_tearer) + animal.update_transform(2) + animal.AddElement(/datum/element/wall_tearer) to_chat(user, span_info("You increase the size of [animal], giving [animal.p_them()] a surge of strength!")) qdel(src) diff --git a/code/modules/mob/living/basic/trooper/abductor.dm b/code/modules/mob/living/basic/trooper/abductor.dm index 7f5ed6fff9b..fdb8b41cc5e 100644 --- a/code/modules/mob/living/basic/trooper/abductor.dm +++ b/code/modules/mob/living/basic/trooper/abductor.dm @@ -2,7 +2,6 @@ /mob/living/basic/trooper/abductor name = "Abductor Agent" desc = "Mezaflorp?" - speed = 1.1 faction = list(ROLE_SYNDICATE) loot = list(/obj/effect/mob_spawn/corpse/human/abductor) mob_spawner = /obj/effect/mob_spawn/corpse/human/abductor diff --git a/code/modules/mob/living/basic/trooper/nanotrasen.dm b/code/modules/mob/living/basic/trooper/nanotrasen.dm index 5fdfe0239b8..bcbc5e647eb 100644 --- a/code/modules/mob/living/basic/trooper/nanotrasen.dm +++ b/code/modules/mob/living/basic/trooper/nanotrasen.dm @@ -2,7 +2,6 @@ /mob/living/basic/trooper/nanotrasen name = "\improper Nanotrasen Private Security Officer" desc = "An officer of Nanotrasen's private security force. Seems rather unpleased to meet you." - speed = 0 melee_damage_lower = 10 melee_damage_upper = 15 faction = list(ROLE_DEATHSQUAD) diff --git a/code/modules/mob/living/basic/trooper/pirate.dm b/code/modules/mob/living/basic/trooper/pirate.dm index 714fc53856e..208a113e5d4 100644 --- a/code/modules/mob/living/basic/trooper/pirate.dm +++ b/code/modules/mob/living/basic/trooper/pirate.dm @@ -4,7 +4,6 @@ desc = "Does what he wants cause a pirate is free." response_help_continuous = "pushes" response_help_simple = "push" - speed = 0 speak_emote = list("yarrs") faction = list(FACTION_PIRATE) loot = list(/obj/effect/mob_spawn/corpse/human/pirate) @@ -42,7 +41,6 @@ name = "Space Pirate Swashbuckler" unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 - speed = 1 loot = list(/obj/effect/mob_spawn/corpse/human/pirate/melee/space) mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee/space @@ -79,7 +77,6 @@ name = "Space Pirate Gunner" unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 - speed = 1 loot = list(/obj/effect/mob_spawn/corpse/human/pirate/ranged/space) mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged/space r_hand = /obj/item/gun/energy/e_gun/lethal diff --git a/code/modules/mob/living/basic/trooper/russian.dm b/code/modules/mob/living/basic/trooper/russian.dm index 6e5e34d16b9..6c8ff52c019 100644 --- a/code/modules/mob/living/basic/trooper/russian.dm +++ b/code/modules/mob/living/basic/trooper/russian.dm @@ -2,7 +2,7 @@ /mob/living/basic/trooper/russian name = "Russian Mobster" desc = "For the Motherland!" - speed = 0 + speed = 1.2 melee_damage_lower = 15 melee_damage_upper = 15 unsuitable_cold_damage = 1 diff --git a/code/modules/mob/living/basic/trooper/syndicate.dm b/code/modules/mob/living/basic/trooper/syndicate.dm index 76ad808ceb3..c4d1bbd3630 100644 --- a/code/modules/mob/living/basic/trooper/syndicate.dm +++ b/code/modules/mob/living/basic/trooper/syndicate.dm @@ -2,7 +2,6 @@ /mob/living/basic/trooper/syndicate name = "Syndicate Operative" desc = "Death to Nanotrasen." - speed = 1.1 faction = list(ROLE_SYNDICATE) loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatesoldier @@ -192,7 +191,6 @@ health = 170 unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 - speed = 1 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando /mob/living/basic/trooper/syndicate/ranged/shotgun/space/Initialize(mapload) diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index 92f3febef2c..2cab03d670e 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -74,12 +74,6 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( name = "[name] ([numba])" real_name = name -/mob/living/carbon/alien/adult/proc/grab(mob/living/carbon/human/target) - if(target.check_block(src, 0, "[target]'s grab")) - return FALSE - target.grabbedby(src) - return TRUE - /mob/living/carbon/alien/adult/setGrabState(newstate) if(newstate == grab_state) return diff --git a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm index b4a119d5aba..d89f6de30d6 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm @@ -15,11 +15,8 @@ to_chat(user, span_danger("You [hitverb] [src]!")) /mob/living/carbon/alien/adult/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(!..() || !user.combat_mode) - return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if(stat < UNCONSCIOUS) - user.disarm(src) + . = ..() + if(.) return TRUE var/damage = rand(1, 9) if (prob(90)) @@ -41,7 +38,6 @@ span_danger("You avoid [user]'s punch!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) to_chat(user, span_warning("Your punch misses [src]!")) - /mob/living/carbon/alien/adult/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!no_effect && !visual_effect_icon) visual_effect_icon = ATTACK_EFFECT_CLAW diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index e686c920b58..e9c5199cf3f 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -339,7 +339,11 @@ Doesn't work on other aliens/AI.*/ span_notice("[owner] vomits up a thick purple substance and begins to shape it."), span_notice("You shape a [choice] out of resin."), ) - + //SKYRAT EDIT START - Roundstart xenohybrid organs + if(build_duration && !do_after(owner, build_duration)) + owner.balloon_alert(owner, "interrupted!") + return + //SKYRAT EDIT END new choice_path(owner.loc) return TRUE diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index f2093738eac..1a08d2446d2 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -18,6 +18,8 @@ . = ..() // as a wise man once wrote: "pull over that ass too fat" REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + // that'd be a too cheeky shield bashing strat + ADD_TRAIT(src, TRAIT_SHOVE_KNOCKDOWN_BLOCKED, INNATE_TRAIT) AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/royal/on_lying_down(new_lying_angle) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 42ec1224746..94a3d70372b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -97,11 +97,13 @@ Proc: RemoveInfectionImages() Des: Removes all infected images from the alien. ----------------------------------------*/ /mob/living/carbon/alien/proc/RemoveInfectionImages() - if (client) - for(var/image/I in client.images) + if(client) + var/list/image/to_remove + for(var/image/client_image as anything in client.images) var/searchfor = "infected" - if(findtext(I.icon_state, searchfor, 1, length(searchfor) + 1)) - qdel(I) + if(findtext(client_image.icon_state, searchfor, 1, length(searchfor) + 1)) + to_remove += client_image + client.images -= to_remove return /mob/living/carbon/alien/canBeHandcuffed() diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 4ea7e98b05f..3717cfcb89a 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -44,22 +44,22 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/attack_hand(mob/living/carbon/human/user, list/modifiers) . = ..() - if(.) //to allow surgery to return properly. - return FALSE - - var/martial_result = user.apply_martial_art(src, modifiers) - if (martial_result != MARTIAL_ATTACK_INVALID) - return martial_result - - if(user.combat_mode) - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return TRUE - user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + if(.) return TRUE + + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + user.disarm(src) + return TRUE + if(user.combat_mode) + user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) else help_shake_act(user) + return TRUE +/mob/living/carbon/alien/get_shove_flags(mob/living/shover, obj/item/weapon) + . = ..() + if(isnull(weapon) || stat != CONSCIOUS) + . &= ~(SHOVE_CAN_MOVE|SHOVE_CAN_HIT_SOMETHING|SHOVE_CAN_STAGGER) /mob/living/carbon/alien/attack_paw(mob/living/carbon/human/user, list/modifiers) if(..()) @@ -67,15 +67,6 @@ In all, this is a lot like the monkey code. /N var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(user.zone_selected)) apply_damage(rand(1, 3), BRUTE, affecting) -/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - log_combat(M, src, "attacked") - updatehealth() - /mob/living/carbon/alien/ex_act(severity, target, origin) . = ..() if(!. || QDELETED(src)) diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm index 3fa78271d6f..62dd4f88b21 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm @@ -1,24 +1,26 @@ /mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(..()) - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, SFX_PUNCH, 25, TRUE, -1) - log_combat(user, src, "attacked") - visible_message(span_danger("[user] kicks [src]!"), \ - span_userdanger("[user] kicks you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You kick [src]!")) - if ((stat != DEAD) && (damage > 4.9)) - Unconscious(rand(100,200)) + . = ..() + if(.) + return TRUE + var/damage = rand(1, 9) + if (prob(90)) + playsound(loc, SFX_PUNCH, 25, TRUE, -1) + log_combat(user, src, "attacked") + visible_message(span_danger("[user] kicks [src]!"), \ + span_userdanger("[user] kicks you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You kick [src]!")) + if ((stat != DEAD) && (damage > 4.9)) + Unconscious(rand(100,200)) - var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(user.zone_selected)) - apply_damage(damage, BRUTE, affecting) - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - visible_message(span_danger("[user]'s kick misses [src]!"), \ - span_danger("You avoid [user]'s kick!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_warning("Your kick misses [src]!")) + var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(user.zone_selected)) + apply_damage(damage, BRUTE, affecting) + else + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + visible_message(span_danger("[user]'s kick misses [src]!"), \ + span_danger("You avoid [user]'s kick!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_warning("Your kick misses [src]!")) /mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user) . = ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 86a6d6a1594..1d2d02bd311 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -5,11 +5,6 @@ register_context() GLOB.carbon_list += src - var/static/list/loc_connections = list( - COMSIG_CARBON_DISARM_PRESHOVE = PROC_REF(disarm_precollide), - COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(disarm_collision), - ) - AddElement(/datum/element/connect_loc, loc_connections) ADD_TRAIT(src, TRAIT_CAN_HOLD_ITEMS, INNATE_TRAIT) // Carbons are assumed to be innately capable of having arms, we check their arms count instead /mob/living/carbon/Destroy() @@ -65,6 +60,9 @@ take_bodypart_damage(5 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) else if(!iscarbon(hit_atom) && extra_speed) take_bodypart_damage(5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) + visible_message(span_danger("[src] crashes into [hit_atom][extra_speed ? " really hard" : ""]!"),\ + span_userdanger("You violently crash into [hit_atom][extra_speed ? " extra hard" : ""]!")) + log_combat(hit_atom, src, "crashes ") oof_noise = TRUE if(iscarbon(hit_atom) && hit_atom != src) @@ -138,6 +136,7 @@ if(prob(0.5)) verb_text = "yeet" var/neckgrab_throw = FALSE // we can't check for if it's a neckgrab throw when totaling up power_throw since we've already stopped pulling them by then, so get it early + var/frequency_number = 1 //We assign a default frequency number for the sound of the throw. if(!held_item) if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) var/mob/living/throwable_mob = pulling @@ -175,13 +174,24 @@ power_throw++ if(isitem(thrown_thing)) var/obj/item/thrown_item = thrown_thing + frequency_number = 1-(thrown_item.w_class-3)/8 //At normal weight, the frequency is at 1. For tiny, it is 1.25. For huge, it is 0.75. if(thrown_item.throw_verb) verb_text = thrown_item.throw_verb - do_attack_animation(target, no_effect = 1) //SKYRAT EDIT ADDITION - AESTHETICS - playsound(loc, 'sound/weapons/punchmiss.ogg', 50, TRUE, -1) //SKYRAT EDIT ADDITION - AESTHETICS - visible_message(span_danger("[src] [verb_text][plural_s(verb_text)] [thrown_thing][power_throw ? " really hard!" : "."]"), \ - span_danger("You [verb_text] [thrown_thing][power_throw ? " really hard!" : "."]")) - log_message("has thrown [thrown_thing] [power_throw > 0 ? "really hard" : ""]", LOG_ATTACK) + do_attack_animation(target, no_effect = 1) + var/sound/throwsound = 'sound/weapons/throw.ogg' + var/power_throw_text = "." + if(power_throw > 0) //If we have anything that boosts our throw power like hulk, we use the rougher heavier variant. + throwsound = 'sound/weapons/throwhard.ogg' + power_throw_text = " really hard!" + if(power_throw < 0) //if we have anything that weakens our throw power like dward, we use a slower variant. + throwsound = 'sound/weapons/throwsoft.ogg' + power_throw_text = " flimsily." + frequency_number = frequency_number + (rand(-5,5)/100); //Adds a bit of randomness in the frequency to not sound exactly the same. + //The volume of the sound takes the minimum between the distance thrown or the max range an item, but no more than 50. Short throws are quieter. A fast throwing speed also makes the noise sharper. + playsound(src, throwsound, min(8*min(get_dist(loc,target),thrown_thing.throw_range), 50), vary = TRUE, extrarange = -1, frequency = frequency_number) + visible_message(span_danger("[src] [verb_text][plural_s(verb_text)] [thrown_thing][power_throw_text]"), \ + span_danger("You [verb_text] [thrown_thing][power_throw_text]")) + log_message("has thrown [thrown_thing] [power_throw_text]", LOG_ATTACK) var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0 newtonian_move(get_dir(target, src)) thrown_thing.safe_throw_at(target, thrown_thing.throw_range + extra_throw_range, max(1,thrown_thing.throw_speed + power_throw), src, null, null, null, move_force) @@ -1385,24 +1395,6 @@ if(mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD)) AddComponent(/datum/component/rot, 6 MINUTES, 10 MINUTES, 1) -/mob/living/carbon/proc/disarm_precollide(datum/source, mob/living/carbon/shover, mob/living/carbon/target) - SIGNAL_HANDLER - if(can_be_shoved_into) - return COMSIG_CARBON_ACT_SOLID - -/mob/living/carbon/proc/disarm_collision(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) - SIGNAL_HANDLER - if(src == target || LAZYFIND(target.buckled_mobs, src) || !can_be_shoved_into) - return - target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) - if(!is_shove_knockdown_blocked()) - Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) - target.visible_message(span_danger("[shover] shoves [target.name] into [name]!"), - span_userdanger("You're shoved into [name] by [shover]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You shove [target.name] into [name]!")) - log_combat(shover, target, "shoved", addition = "into [name]") - return COMSIG_CARBON_SHOVE_HANDLED - /** * This proc is used to determine whether or not the mob can handle touching an acid affected object. */ diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 5891c35e634..a8509283d4e 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -1,6 +1,4 @@ #define SHAKE_ANIMATION_OFFSET 4 -#define PERSONAL_SPACE_DAMAGE 2 -#define ASS_SLAP_EXTRA_RANGE -1 /mob/living/carbon/get_eye_protection() . = ..() @@ -161,10 +159,9 @@ /mob/living/carbon/attack_drone_secondary(mob/living/basic/drone/user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -//ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/carbon/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) - . = TRUE + . = ..() + for(var/thing in diseases) var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) @@ -175,13 +172,8 @@ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - for(var/datum/surgery/operations as anything in surgeries) - if(user.combat_mode) - break - if(body_position != LYING_DOWN && (operations.surgery_flags & SURGERY_REQUIRE_RESTING)) - continue - if(operations.next_step(user, modifiers)) - return TRUE + if(.) + return TRUE for(var/datum/wound/wounds as anything in all_wounds) if(wounds.try_handling(user)) @@ -215,28 +207,6 @@ ForceContractDisease(D) return TRUE - -/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - if(M.powerlevel > 0) - var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - visible_message(span_danger("The [M.name] shocks [src]!"), \ - span_userdanger("The [M.name] shocks you!")) - - do_sparks(5, TRUE, src) - var/power = M.powerlevel + rand(0,3) - Paralyze(power * 2 SECONDS) - set_stutter_if_lower(power * 2 SECONDS) - if (prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - updatehealth() - return 1 - /** * Really weird proc that attempts to dismebmer the passed zone if it is at max damage * Unless the attacker is an NPC, in which case it disregards the zone and picks a random one @@ -269,136 +239,6 @@ return dam_zone -/** - * Attempt to disarm the target mob. - * Will shove the target mob back, and drop them if they're in front of something dense - * or another carbon. -*/ -/mob/living/carbon/proc/disarm(mob/living/carbon/target) - if(zone_selected == BODY_ZONE_PRECISE_MOUTH) - var/target_on_help_and_unarmed = !target.combat_mode && !target.get_active_held_item() - if(target_on_help_and_unarmed || HAS_TRAIT(target, TRAIT_RESTRAINED)) - do_slap_animation(target) - playsound(target.loc, 'sound/weapons/slap.ogg', 50, TRUE, -1) - visible_message("[src] slaps [target] in the face!", - "You slap [target] in the face! ",\ - "You hear a slap.") - target.dna?.species?.stop_wagging_tail(target) - return - //SKYRAT EDIT ADDITION BEGIN - EMOTES - if(zone_selected == BODY_ZONE_PRECISE_GROIN && target.dir == src.dir) - if(HAS_TRAIT(target, TRAIT_PERSONALSPACE) && (target.stat != UNCONSCIOUS) && (!target.handcuffed)) //You need to be conscious and uncuffed to use Personal Space - if(target.combat_mode && (!HAS_TRAIT(target, TRAIT_PACIFISM))) //Being pacified prevents violent counters - var/obj/item/bodypart/affecting = src.get_bodypart(BODY_ZONE_HEAD) - if(affecting?.receive_damage(PERSONAL_SPACE_DAMAGE)) - src.update_damage_overlays() - visible_message(span_danger("[src] tried slapping [target]'s ass, but they were slapped instead!"), - span_danger("You tried slapping [target]'s ass, but they hit you back, ouch!"), - "You hear a slap.", ignored_mobs = list(target)) - playsound(target.loc, 'sound/effects/snap.ogg', 50, TRUE, ASS_SLAP_EXTRA_RANGE) - to_chat(target, span_danger("[src] tried slapping your ass, but you hit them back!")) - return - else - visible_message(span_danger("[src] tried slapping [target]'s ass, but they were blocked!"), - span_danger("You tried slapping [target]'s ass, but they blocked you!"), - "You hear a slap.", ignored_mobs = list(target)) - playsound(target.loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, ASS_SLAP_EXTRA_RANGE) - to_chat(target, span_danger("[src] tried slapping your ass, but you blocked them!")) - return - else - do_ass_slap_animation(target) - playsound(target.loc, 'sound/weapons/slap.ogg', 50, TRUE, ASS_SLAP_EXTRA_RANGE) - visible_message("[src] slaps [target] right on the ass!",\ - "You slap [target] on the ass, how satisfying.",\ - "You hear a slap.", ignored_mobs = list(target)) - to_chat(target, "[src] slaps your ass!") - return - //SKYRAT EDIT END - do_attack_animation(target, ATTACK_EFFECT_DISARM) - playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - if (ishuman(target)) - var/mob/living/carbon/human/human_target = target - human_target.w_uniform?.add_fingerprint(src) - - SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, src, zone_selected) - var/shove_dir = get_dir(loc, target.loc) - var/turf/target_shove_turf = get_step(target.loc, shove_dir) - var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied - var/turf/target_old_turf = target.loc - - //Are we hitting anything? or - if(SEND_SIGNAL(target_shove_turf, COMSIG_CARBON_DISARM_PRESHOVE) & COMSIG_CARBON_ACT_SOLID) - shove_blocked = TRUE - else - target.Move(target_shove_turf, shove_dir) - if(get_turf(target) == target_old_turf) - shove_blocked = TRUE - - if(!shove_blocked) - target.setGrabState(GRAB_PASSIVE) - - if(target.IsKnockdown() && !target.IsParalyzed()) //KICK HIM IN THE NUTS - target.Paralyze(SHOVE_CHAIN_PARALYZE) - target.visible_message(span_danger("[name] kicks [target.name] onto [target.p_their()] side!"), - span_userdanger("You're kicked onto your side by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You kick [target.name] onto [target.p_their()] side!")) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE) - log_combat(src, target, "kicks", "onto their side (paralyzing)") - - var/directional_blocked = FALSE - var/can_hit_something = (!target.is_shove_knockdown_blocked() && !target.buckled) - - //Directional checks to make sure that we're not shoving through a windoor or something like that - if(shove_blocked && can_hit_something && (shove_dir in GLOB.cardinals)) - var/target_turf = get_turf(target) - for(var/obj/obj_content in target_turf) - if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == shove_dir && obj_content.density) - directional_blocked = TRUE - break - if(target_turf != target_shove_turf && !directional_blocked) //Make sure that we don't run the exact same check twice on the same tile - for(var/obj/obj_content in target_shove_turf) - if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == REVERSE_DIR(shove_dir) && obj_content.density) - directional_blocked = TRUE - break - - if(can_hit_something) - //Don't hit people through windows, ok? - if(!directional_blocked && SEND_SIGNAL(target_shove_turf, COMSIG_CARBON_DISARM_COLLIDE, src, target, shove_blocked) & COMSIG_CARBON_SHOVE_HANDLED) - return - if(directional_blocked || shove_blocked) - target.Knockdown(SHOVE_KNOCKDOWN_SOLID) - target.visible_message(span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), - span_userdanger("You're knocked down from a shove by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You shove [target.name], knocking [target.p_them()] down!")) - log_combat(src, target, "shoved", "knocking them down") - return - - target.visible_message(span_danger("[name] shoves [target.name]!"), - span_userdanger("You're shoved by [name]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You shove [target.name]!")) - - //Take their lunch money - var/target_held_item = target.get_active_held_item() - var/append_message = "" - if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) //It's too expensive we'll get caught - target_held_item = null - - if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered)) - target.dropItemToGround(target_held_item) - append_message = "causing [target.p_them()] to drop [target_held_item]" - target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"), - span_warning("You drop \the [target_held_item]!"), null, COMBAT_MESSAGE_RANGE) - - target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) - - log_combat(src, target, "shoved", append_message) - -/mob/living/carbon/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this - for (var/obj/item/clothing/clothing in get_equipped_items()) - if(clothing.clothing_flags & BLOCKS_SHOVE_KNOCKDOWN) - return TRUE - return FALSE - /mob/living/carbon/blob_act(obj/structure/blob/B) if (stat == DEAD) return @@ -772,7 +612,7 @@ if (!IS_ORGANIC_LIMB(limb)) . += (limb.brute_dam * limb.body_damage_coeff) + (limb.burn_dam * limb.body_damage_coeff) -/mob/living/carbon/grabbedby(mob/living/carbon/user, supress_message = FALSE) +/mob/living/carbon/grabbedby(mob/living/user, supress_message = FALSE, grabbed_part) // SKYRAT EDIT CHANGE - ORIGINAL: /mob/living/carbon/grabbedby(mob/living/user, supress_message = FALSE) if(user != src) return ..() @@ -910,6 +750,10 @@ organs -= organ_type GLOB.bioscrambler_valid_organs = organs +/mob/living/carbon/get_shove_flags(mob/living/shover, obj/item/weapon) + . = ..() + . |= SHOVE_CAN_STAGGER + if(IsKnockdown() && !IsParalyzed()) + . |= SHOVE_CAN_KICK_SIDE + #undef SHAKE_ANIMATION_OFFSET -#undef PERSONAL_SPACE_DAMAGE -#undef ASS_SLAP_EXTRA_RANGE diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index d4fa006957e..c362faca0da 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -586,6 +586,7 @@ /obj/item/bodypart/proc/generate_husk_key() RETURN_TYPE(/list) . = list() + . += "[limb_id]-" . += "[husk_type]" . += "-husk" . += "-[body_zone]" diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 52f3a7575bb..c53d01023d2 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1132,9 +1132,6 @@ GLOBAL_LIST_EMPTY(features_by_species) if(SEND_SIGNAL(target, COMSIG_CARBON_PRE_HELP, user, attacker_style) & COMPONENT_BLOCK_HELP_ACT) return TRUE - if(attacker_style?.help_act(user, target) == MARTIAL_ATTACK_SUCCESS) - return TRUE - if(target.body_position == STANDING_UP || (target.appears_alive() && target.stat != SOFT_CRIT && target.stat != HARD_CRIT)) target.help_shake_act(user) if(target != user) @@ -1143,115 +1140,104 @@ GLOBAL_LIST_EMPTY(features_by_species) user.do_cpr(target) -/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(attacker_style?.grab_act(user, target) == MARTIAL_ATTACK_SUCCESS) - return TRUE - target.grabbedby(user) - return TRUE - ///This proc handles punching damage. IMPORTANT: Our owner is the TARGET and not the USER in this proc. For whatever reason... /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(HAS_TRAIT(user, TRAIT_PACIFISM) && !attacker_style?.pacifist_style) to_chat(user, span_warning("You don't want to harm [target]!")) return FALSE - if(attacker_style?.harm_act(user,target) == MARTIAL_ATTACK_SUCCESS) - return TRUE - else - var/obj/item/organ/internal/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) - var/obj/item/bodypart/attacking_bodypart - if(brain) - attacking_bodypart = brain.get_attacking_limb(target) - if(!attacking_bodypart) - attacking_bodypart = user.get_active_hand() - var/atk_verb = attacking_bodypart.unarmed_attack_verb - var/atk_effect = attacking_bodypart.unarmed_attack_effect + var/obj/item/organ/internal/brain/brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) + var/obj/item/bodypart/attacking_bodypart + if(brain) + attacking_bodypart = brain.get_attacking_limb(target) + if(!attacking_bodypart) + attacking_bodypart = user.get_active_hand() + var/atk_verb = attacking_bodypart.unarmed_attack_verb + var/atk_effect = attacking_bodypart.unarmed_attack_effect - if(atk_effect == ATTACK_EFFECT_BITE) - if(user.is_mouth_covered(ITEM_SLOT_MASK)) - to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) - return FALSE - user.do_attack_animation(target, atk_effect) - - //has our target been shoved recently? If so, they're staggered and we get an easy hit. - var/staggered = FALSE - - //Someone in a grapple is much more vulnerable to being harmed by punches. - var/grappled = FALSE - - if(target.get_timed_status_effect_duration(/datum/status_effect/staggered)) - staggered = TRUE - - if(target.pulledby && target.pulledby.grab_state >= GRAB_AGGRESSIVE) - grappled = TRUE - - var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) - var/limb_accuracy = attacking_bodypart.unarmed_effectiveness - - var/obj/item/bodypart/affecting = target.get_bodypart(target.get_random_valid_zone(user.zone_selected)) - - var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases - if(attacking_bodypart.unarmed_damage_low) - if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || staggered) //kicks and attacks against staggered targets never miss (provided your species deals more than 0 damage) - miss_chance = 0 - else - miss_chance = clamp(UNARMED_MISS_CHANCE_BASE - limb_accuracy + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 0, UNARMED_MISS_CHANCE_MAX) //Limb miss chance + various damage. capped at 80 so there is at least a chance to land a hit. - - if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted - playsound(target.loc, attacking_bodypart.unarmed_miss_sound, 25, TRUE, -1) - target.visible_message(span_danger("[user]'s [atk_verb] misses [target]!"), \ - span_danger("You avoid [user]'s [atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_warning("Your [atk_verb] misses [target]!")) - log_combat(user, target, "attempted to punch") + if(atk_effect == ATTACK_EFFECT_BITE) + if(user.is_mouth_covered(ITEM_SLOT_MASK)) + to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) return FALSE + user.do_attack_animation(target, atk_effect) - var/armor_block = target.run_armor_check(affecting, MELEE) + //has our target been shoved recently? If so, they're staggered and we get an easy hit. + var/staggered = FALSE - playsound(target.loc, attacking_bodypart.unarmed_attack_sound || get_sfx("punch"), 25, TRUE, -1) // SKYRAT EDIT - ORIGINAL: playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1) + //Someone in a grapple is much more vulnerable to being harmed by punches. + var/grappled = FALSE - if(grappled && attacking_bodypart.grappled_attack_verb) - atk_verb = attacking_bodypart.grappled_attack_verb - target.visible_message(span_danger("[user] [atk_verb]ed [target]!"), \ - span_userdanger("You're [atk_verb]ed by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You [atk_verb] [target]!")) + if(target.get_timed_status_effect_duration(/datum/status_effect/staggered)) + staggered = TRUE - target.lastattacker = user.real_name - target.lastattackerckey = user.ckey + if(target.pulledby && target.pulledby.grab_state >= GRAB_AGGRESSIVE) + grappled = TRUE - if(user.limb_destroyer) - target.dismembering_strike(user, affecting.body_zone) + var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) + var/limb_accuracy = attacking_bodypart.unarmed_effectiveness - var/attack_direction = get_dir(user, target) - var/attack_type = attacking_bodypart.attack_type - var/unarmed_sharpness = attacking_bodypart.unarmed_sharpness //SKYRAT EDIT ADDITION - If unarmed damage sharpness needs to be taken into account. - if(atk_effect == ATTACK_EFFECT_KICK || grappled) //kicks and punches when grappling bypass armor slightly. - if(damage >= 9) - target.force_say() - log_combat(user, target, grappled ? "grapple punched" : "kicked") - target.apply_damage(damage, attack_type, affecting, armor_block - limb_accuracy, attack_direction = attack_direction) - target.apply_damage(damage*1.5, STAMINA, affecting, armor_block - limb_accuracy) - else // Normal attacks do not gain the benefit of armor penetration. - target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction, sharpness = unarmed_sharpness) //SKYRAT EDIT - Applies sharpness if it does - ORIGINAL: target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) - target.apply_damage(damage*1.5, STAMINA, affecting, armor_block) - if(damage >= 9) - target.force_say() - log_combat(user, target, "punched") + var/obj/item/bodypart/affecting = target.get_bodypart(target.get_random_valid_zone(user.zone_selected)) - //If we rolled a punch high enough to hit our stun threshold, or our target is staggered and they have at least 40 damage+stamina loss, we knock them down - if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) - target.visible_message(span_danger("[user] knocks [target] down!"), \ - span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You knock [target] down!")) - /* SKYRAT EDIT REMOVAL - Less combat lethality and hard stungs - var/knockdown_duration = 4 SECONDS + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 4 second base stun + 4 second stun modifier = 8 second knockdown duration - target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) - */ // SKYRAT REMOVAL END - target.StaminaKnockdown(20) //SKYRAT EDIT ADDITION - log_combat(user, target, "got a stun punch with their previous punch") + var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases + if(attacking_bodypart.unarmed_damage_low) + if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || staggered) //kicks and attacks against staggered targets never miss (provided your species deals more than 0 damage) + miss_chance = 0 + else + miss_chance = clamp(UNARMED_MISS_CHANCE_BASE - limb_accuracy + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 0, UNARMED_MISS_CHANCE_MAX) //Limb miss chance + various damage. capped at 80 so there is at least a chance to land a hit. + + if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted + playsound(target.loc, attacking_bodypart.unarmed_miss_sound, 25, TRUE, -1) + target.visible_message(span_danger("[user]'s [atk_verb] misses [target]!"), \ + span_danger("You avoid [user]'s [atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_warning("Your [atk_verb] misses [target]!")) + log_combat(user, target, "attempted to punch") + return FALSE + + var/armor_block = target.run_armor_check(affecting, MELEE) + + playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1) + + if(grappled && attacking_bodypart.grappled_attack_verb) + atk_verb = attacking_bodypart.grappled_attack_verb + target.visible_message(span_danger("[user] [atk_verb]ed [target]!"), \ + span_userdanger("You're [atk_verb]ed by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You [atk_verb] [target]!")) + + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + + if(user.limb_destroyer) + target.dismembering_strike(user, affecting.body_zone) + + var/attack_direction = get_dir(user, target) + var/attack_type = attacking_bodypart.attack_type + var/unarmed_sharpness = attacking_bodypart.unarmed_sharpness //SKYRAT EDIT ADDITION - If unarmed damage sharpness needs to be taken into account. + if(atk_effect == ATTACK_EFFECT_KICK || grappled) //kicks and punches when grappling bypass armor slightly. + if(damage >= 9) + target.force_say() + log_combat(user, target, grappled ? "grapple punched" : "kicked") + target.apply_damage(damage, attack_type, affecting, armor_block - limb_accuracy, attack_direction = attack_direction) + target.apply_damage(damage*1.5, STAMINA, affecting, armor_block - limb_accuracy) + else // Normal attacks do not gain the benefit of armor penetration. + target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction, sharpness = unarmed_sharpness) //SKYRAT EDIT - Applies sharpness if it does - ORIGINAL: target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) + target.apply_damage(damage*1.5, STAMINA, affecting, armor_block) + if(damage >= 9) + target.force_say() + log_combat(user, target, "punched") + + //If we rolled a punch high enough to hit our stun threshold, or our target is staggered and they have at least 40 damage+stamina loss, we knock them down + if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) + target.visible_message(span_danger("[user] knocks [target] down!"), \ + span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You knock [target] down!")) + /* SKYRAT EDIT REMOVAL - Less combat lethality and hard stuns + var/knockdown_duration = 4 SECONDS + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 //50 total damage = 4 second base stun + 4 second stun modifier = 8 second knockdown duration + target.apply_effect(knockdown_duration, EFFECT_KNOCKDOWN, armor_block) + SKYRAT EDIT REMOVAL END */ + target.StaminaKnockdown(20) //SKYRAT EDIT ADDITION + log_combat(user, target, "got a stun punch with their previous punch") /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(attacker_style?.disarm_act(user,target) == MARTIAL_ATTACK_SUCCESS) - return TRUE if(user.body_position != STANDING_UP) return FALSE if(user == target) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 771dc12000d..8e90e8d4320 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -366,7 +366,7 @@ if(!key) msg += "[span_deadsay("[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.")]\n" else if(!client) - msg += "[span_deadsay("[t_He] [t_has] a blank, absent-minded stare and [t_has] been completely unresponsive to anything for [round(((world.time - lastclienttime) / (1 MINUTES)),1)] minutes. [t_He] may snap out of it soon.")]\n" // SKYRAT EDIT CHANGE - SSD_INDICATOR - ORIGINAL: msg += "[span_deadsay("[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.")]\n" + msg += "[span_deadsay("[t_He] [t_has] a blank, absent-minded stare and [t_has] been completely unresponsive to anything for [round(((world.time - lastclienttime) / (1 MINUTES)),1)] minutes. [t_He] may snap out of it soon.")]\n" // SKYRAT EDIT CHANGE - SSD_INDICATOR - ORIGINAL: msg += "[span_deadsay("[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.")]\n" var/scar_severity = 0 for(var/i in all_scars) @@ -428,7 +428,7 @@ //SKYRAT EDIT END if(HAS_TRAIT(user, TRAIT_SECURITY_HUD)) - if(!user.stat && user != src) + if((user.stat == CONSCIOUS || isobserver(user)) && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/wanted_status = WANTED_NONE var/security_note = "None." @@ -438,13 +438,16 @@ wanted_status = target_record.wanted_status if(target_record.security_note) security_note = target_record.security_note - - . += "Criminal status: \[[wanted_status]\]" + if(ishuman(user)) + . += "Criminal status: \[[wanted_status]\]" + else + . += "Criminal status: [wanted_status]" . += "Important Notes: [security_note]" - . += jointext(list("Security record: \[View\]", - "\[Add citation\]", - "\[Add crime\]", - "\[Add note\]"), "") + . += "Security record: \[View\]" + if(ishuman(user)) + . += jointext(list("\[Add citation\]", + "\[Add crime\]", + "\[Add note\]"), "") // SKYRAT EDIT ADDITION BEGIN - EXAMINE RECORDS if(target_record && length(target_record.past_security_records) > RECORDS_INVISIBLE_THRESHOLD) . += "Past security records: \[View past security records\]" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ac65691efd3..4cb7666d1ab 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -29,6 +29,8 @@ AddElement(/datum/element/strippable, GLOB.strippable_human_items, TYPE_PROC_REF(/mob/living/carbon/human/, should_strip)) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_LIVING_DISARM_PRESHOVE = PROC_REF(disarm_precollide), + COMSIG_LIVING_DISARM_COLLIDE = PROC_REF(disarm_collision), ) AddElement(/datum/element/connect_loc, loc_connections) GLOB.human_list += src @@ -95,20 +97,24 @@ ///////HUDs/////// if(href_list["hud"]) - if(!ishuman(usr)) + if(!ishuman(usr) && !isobserver(usr)) return - var/mob/living/carbon/human/human_user = usr + var/mob/human_or_ghost_user = usr var/perpname = get_face_name(get_id_name("")) - if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD) && !HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) + if(!HAS_TRAIT(human_or_ghost_user, TRAIT_SECURITY_HUD) && !HAS_TRAIT(human_or_ghost_user, TRAIT_MEDICAL_HUD)) return if((text2num(href_list["examine_time"]) + 1 MINUTES) < world.time) - to_chat(human_user, "[span_notice("It's too late to use this now!")]") + to_chat(human_or_ghost_user, "[span_notice("It's too late to use this now!")]") return var/datum/record/crew/target_record = find_record(perpname) if(href_list["photo_front"] || href_list["photo_side"]) - if(!human_user.canUseHUD()) + if(!target_record) return - if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD) && !HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) + if(ishuman(human_or_ghost_user)) + var/mob/living/carbon/human/human_user = human_or_ghost_user + if(!human_user.canUseHUD()) + return + if(!HAS_TRAIT(human_or_ghost_user, TRAIT_SECURITY_HUD) && !HAS_TRAIT(human_or_ghost_user, TRAIT_MEDICAL_HUD)) return var/obj/item/photo/photo_from_record = null if(href_list["photo_front"]) @@ -116,10 +122,11 @@ else if(href_list["photo_side"]) photo_from_record = target_record.get_side_photo() if(photo_from_record) - photo_from_record.show(human_user) + photo_from_record.show(human_or_ghost_user) return - if(href_list["hud"] == "m") + if(ishuman(human_or_ghost_user) && href_list["hud"] == "m") + var/mob/living/carbon/human/human_user = human_or_ghost_user if(!HAS_TRAIT(human_user, TRAIT_MEDICAL_HUD)) return if(href_list["evaluation"]) @@ -203,33 +210,36 @@ return //Medical HUD ends here. if(href_list["hud"] == "s") - if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) - return - if(human_user.stat || human_user == src) //|| !human_user.canmove || human_user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. - return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten - // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access var/allowed_access = null - var/obj/item/clothing/glasses/hud/security/user_glasses = human_user.glasses - if(istype(user_glasses) && (user_glasses.obj_flags & EMAGGED)) - allowed_access = "@%&ERROR_%$*" - else //Implant and standard glasses check access - if(human_user.wear_id) - var/list/access = human_user.wear_id.GetAccess() - if(ACCESS_SECURITY in access) - allowed_access = human_user.get_authentification_name() - - if(!allowed_access) - to_chat(human_user, span_warning("ERROR: Invalid access.")) + if(!HAS_TRAIT(human_or_ghost_user, TRAIT_SECURITY_HUD)) return + if(ishuman(human_or_ghost_user)) + var/mob/living/carbon/human/human_user = human_or_ghost_user + if(human_user.stat || human_user == src) //|| !human_user.canmove || human_user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. + return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten + // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access + var/obj/item/clothing/glasses/hud/security/user_glasses = human_user.glasses + if(istype(user_glasses) && (user_glasses.obj_flags & EMAGGED)) + allowed_access = "@%&ERROR_%$*" + else //Implant and standard glasses check access + if(human_user.wear_id) + var/list/access = human_user.wear_id.GetAccess() + if(ACCESS_SECURITY in access) + allowed_access = human_user.get_authentification_name() + + if(!allowed_access) + to_chat(human_user, span_warning("ERROR: Invalid access.")) + return if(!perpname) - to_chat(human_user, span_warning("ERROR: Can not identify target.")) + to_chat(human_or_ghost_user, span_warning("ERROR: Can not identify target.")) return target_record = find_record(perpname) if(!target_record) - to_chat(usr, span_warning("ERROR: Unable to locate data core entry for target.")) + to_chat(human_or_ghost_user, span_warning("ERROR: Unable to locate data core entry for target.")) return - if(href_list["status"]) + if(ishuman(human_or_ghost_user) && href_list["status"]) + var/mob/living/carbon/human/human_user = human_or_ghost_user var/new_status = tgui_input_list(human_user, "Specify a new criminal status for this person.", "Security HUD", WANTED_STATUSES(), target_record.wanted_status) if(!new_status || !target_record || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return @@ -245,82 +255,84 @@ return if(href_list["view"]) - if(!human_user.canUseHUD()) + if(ishuman(human_or_ghost_user)) + var/mob/living/carbon/human/human_user = human_or_ghost_user + if(!human_user.canUseHUD()) + return + if(!HAS_TRAIT(human_or_ghost_user, TRAIT_SECURITY_HUD)) return - if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) - return - to_chat(human_user, "Name: [target_record.name]") - to_chat(human_user, "Criminal Status: [target_record.wanted_status]") - to_chat(human_user, "Citations: [length(target_record.citations)]") - to_chat(human_user, "Note: [target_record.security_note || "None"]") - to_chat(human_user, "Rapsheet: [length(target_record.crimes)] incidents") + var/sec_record_message = "" + sec_record_message += "Name: [target_record.name]" + sec_record_message += "\nCriminal Status: [target_record.wanted_status]" + sec_record_message += "\nCitations: [length(target_record.citations)]" + sec_record_message += "\nNote: [target_record.security_note || "None"]" + sec_record_message += "\nRapsheet: [length(target_record.crimes)] incidents" if(length(target_record.crimes)) for(var/datum/crime/crime in target_record.crimes) if(!crime.valid) - to_chat(human_user, span_notice("-- REDACTED --")) + sec_record_message += span_notice("\n-- REDACTED --") continue - to_chat(human_user, "Crime: [crime.name]") - to_chat(human_user, "Details: [crime.details]") - to_chat(human_user, "Added by [crime.author] at [crime.time]") - to_chat(human_user, "----------") - + sec_record_message += "\nCrime: [crime.name]" + sec_record_message += "\nDetails: [crime.details]" + sec_record_message += "\nAdded by [crime.author] at [crime.time]" + to_chat(human_or_ghost_user, examine_block(sec_record_message)) return + if(ishuman(human_or_ghost_user)) + var/mob/living/carbon/human/human_user = human_or_ghost_user + if(href_list["add_citation"]) + var/max_fine = CONFIG_GET(number/maxfine) + var/citation_name = tgui_input_text(human_user, "Citation crime", "Security HUD") + var/fine = tgui_input_number(human_user, "Citation fine", "Security HUD", 50, max_fine, 5) + if(!fine || !target_record || !citation_name || !allowed_access || !isnum(fine) || fine > max_fine || fine <= 0 || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) + return - //SKYRAT EDIT ADDITION BEGIN - EXAMINE RECORDS - if(href_list["genrecords"]) - if(!human_user.canUseHUD()) - return - if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) - return - to_chat(human_user, "General Record: [target_record.past_general_records]") + var/datum/crime/citation/new_citation = new(name = citation_name, author = allowed_access, fine = fine) - if(href_list["secrecords"]) - if(!human_user.canUseHUD()) - return - if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) - return - to_chat(human_user, "Security Record: [target_record.past_security_records]") - //SKYRAT EDIT END - - if(href_list["add_citation"]) - var/max_fine = CONFIG_GET(number/maxfine) - var/citation_name = tgui_input_text(human_user, "Citation crime", "Security HUD") - var/fine = tgui_input_number(human_user, "Citation fine", "Security HUD", 50, max_fine, 5) - if(!fine || !target_record || !citation_name || !allowed_access || !isnum(fine) || fine > max_fine || fine <= 0 || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) + target_record.citations += new_citation + new_citation.alert_owner(usr, src, target_record.name, "You have been fined [fine] credits for '[citation_name]'. Fines may be paid at security.") + investigate_log("New Citation: [citation_name] Fine: [fine] | Added to [target_record.name] by [key_name(human_user)]", INVESTIGATE_RECORDS) + SSblackbox.ReportCitation(REF(new_citation), human_user.ckey, human_user.real_name, target_record.name, citation_name, fine) return - var/datum/crime/citation/new_citation = new(name = citation_name, author = allowed_access, fine = fine) + //SKYRAT EDIT ADDITION BEGIN - EXAMINE RECORDS + if(href_list["genrecords"]) + if(!human_user.canUseHUD()) + return + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) + return + to_chat(human_user, "General Record: [target_record.past_general_records]") - target_record.citations += new_citation - new_citation.alert_owner(usr, src, target_record.name, "You have been fined [fine] credits for '[citation_name]'. Fines may be paid at security.") - investigate_log("New Citation: [citation_name] Fine: [fine] | Added to [target_record.name] by [key_name(human_user)]", INVESTIGATE_RECORDS) - SSblackbox.ReportCitation(REF(new_citation), human_user.ckey, human_user.real_name, target_record.name, citation_name, fine) + if(href_list["secrecords"]) + if(!human_user.canUseHUD()) + return + if(!HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) + return + to_chat(human_user, "Security Record: [target_record.past_security_records]") + //SKYRAT EDIT END - return + if(href_list["add_crime"]) + var/crime_name = tgui_input_text(human_user, "Crime name", "Security HUD") + if(!target_record || !crime_name || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) + return + + var/datum/crime/new_crime = new(name = crime_name, author = allowed_access) + + target_record.crimes += new_crime + investigate_log("New Crime: [crime_name] | Added to [target_record.name] by [key_name(human_user)]", INVESTIGATE_RECORDS) + to_chat(human_user, span_notice("Successfully added a crime.")) - if(href_list["add_crime"]) - var/crime_name = tgui_input_text(human_user, "Crime name", "Security HUD") - if(!target_record || !crime_name || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return - var/datum/crime/new_crime = new(name = crime_name, author = allowed_access) + if(href_list["add_note"]) + var/new_note = tgui_input_text(human_user, "Security note", "Security Records", multiline = TRUE) + if(!target_record || !new_note || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) + return - target_record.crimes += new_crime - investigate_log("New Crime: [crime_name] | Added to [target_record.name] by [key_name(human_user)]", INVESTIGATE_RECORDS) - to_chat(human_user, span_notice("Successfully added a crime.")) + target_record.security_note = new_note - return - - if(href_list["add_note"]) - var/new_note = tgui_input_text(human_user, "Security note", "Security Records", multiline = TRUE) - if(!target_record || !new_note || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return - target_record.security_note = new_note - - return - //SKYRAT EDIT ADDITION BEGIN - VIEW RECORDS if(href_list["bgrecords"]) if(isobserver(usr) || usr.mind.can_see_exploitables || usr.mind.has_exploitables_override) @@ -333,7 +345,6 @@ var/datum/record/crew/target_record = find_record(examined_name) to_chat(usr, "Exploitable information: [target_record.exploitable_information]") //SKYRAT EDIT END - ..() //end of this massive fucking chain. TODO: make the hud chain not spooky. - Yeah, great job doing that. //called when something steps onto a human diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ca8bd78099d..470a72b9d88 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -109,7 +109,7 @@ return FALSE -/mob/living/carbon/human/grippedby(mob/living/user, instant = FALSE) +/mob/living/carbon/human/grippedby(mob/living/carbon/user, instant = FALSE) if(w_uniform) w_uniform.add_fingerprint(user) ..() @@ -129,20 +129,35 @@ apply_damage(15, BRUTE, wound_bonus=10) /mob/living/carbon/human/attack_hand(mob/user, list/modifiers) - if(..()) //to allow surgery to return properly. - return + . = ..() + if(.) + return TRUE if(ishuman(user)) var/mob/living/carbon/human/H = user dna.species.spec_attack_hand(H, src, null, modifiers) +/mob/living/carbon/human/proc/disarm_precollide(datum/source, mob/living/shover, mob/living/target, obj/item/weapon) + SIGNAL_HANDLER + return COMSIG_LIVING_ACT_SOLID + +/mob/living/carbon/human/proc/disarm_collision(datum/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon) + SIGNAL_HANDLER + if(src == target || LAZYFIND(target.buckled_mobs, src) || !iscarbon(target)) + return + if(!(shove_flags & SHOVE_KNOCKDOWN_BLOCKED)) + target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) + if(!HAS_TRAIT(src, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) + Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) + target.visible_message(span_danger("[shover] shoves [target.name] into [name]!"), + span_userdanger("You're shoved into [name] by [shover]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + to_chat(src, span_danger("You shove [target.name] into [name]!")) + log_combat(shover, target, "shoved", addition = "into [name][weapon ? " with [weapon]" : ""]") + return COMSIG_LIVING_SHOVE_HANDLED + /mob/living/carbon/human/attack_paw(mob/living/carbon/human/user, list/modifiers) var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(dam_zone)) - var/martial_result = user.apply_martial_art(src, modifiers) - if (martial_result != MARTIAL_ATTACK_INVALID) - return martial_result - if(LAZYACCESS(modifiers, RIGHT_CLICK)) //Always drop item in hand, if no item, get stunned instead. var/obj/item/I = get_active_held_item() if(I && !(I.item_flags & ABSTRACT) && dropItemToGround(I)) @@ -256,30 +271,6 @@ var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block) -/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - . = ..() - if(!.) // slime attack failed - return - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - if(!damage) - return - var/wound_mod = -45 // 25^1.4=90, 90-45=45 - if(M.is_adult) - damage += rand(5, 10) - wound_mod = -90 // 35^1.4=145, 145-90=55 - - if(check_block(M, damage, "the [M.name]")) - return FALSE - - var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!dam_zone) //Dismemberment successful - return TRUE - - var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(dam_zone)) - var/armor_block = run_armor_check(affecting, MELEE) - apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod) - - /mob/living/carbon/human/ex_act(severity, target, origin) if(HAS_TRAIT(src, TRAIT_BOMBIMMUNE)) return FALSE @@ -397,20 +388,6 @@ //Don't go further if the shock was blocked/too weak. if(!.) return - //SKYRAT EDIT BEGIN: MAKES POWERFUL SHOCKS HAVE A CHANCE TO STOP YOUR HEART. DANGER - /*¨ - BUBBER EDIT REMOVAL BEGIN - JUST WHY - - if(can_heartattack() && !(flags & SHOCK_ILLUSION) && shock_damage >= 70) - if(shock_damage * siemens_coeff >= 1 && prob(30))//Higher chance to disrupt the pacemaker cells - var/obj/item/organ/internal/heart/heart = get_organ_slot(ORGAN_SLOT_HEART) - heart.Stop() - visible_message("[src.name] briefly twitches; before falling limp - their breathing irratic and chest spasming violently!", \ - "You feel your heart thump eratically; before ceasing to beat, a violent twitch overcoming your form!", ignored_mobs=src) - - BUBBER EDIT REMOVAL END - */ - //SKYRAT EDIT END if(!(flags & SHOCK_ILLUSION)) if(shock_damage * siemens_coeff >= 5) force_say() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7e7af092b99..d18c0c800f6 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -57,7 +57,7 @@ return if_no_id //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a separate proc as it'll be useful elsewhere -/mob/living/carbon/human/get_visible_name() +/mob/living/carbon/human/get_visible_name(add_id_name = TRUE) if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return "Unknown" var/list/identity = list(null, null) @@ -67,7 +67,7 @@ var/face_name = !isnull(signal_face) ? signal_face : get_face_name("") var/id_name = !isnull(signal_id) ? signal_id : get_id_name("") if(face_name) - if(id_name && (id_name != face_name)) + if(add_id_name && id_name && (id_name != face_name)) return "[face_name] (as [id_name])" return face_name if(id_name) diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 7a659f055b6..7b250ef7a03 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -9,16 +9,13 @@ message = tongueless_upper.Replace(message, pick("AA","OO","'")) return ..() -/mob/living/carbon/human/say_mod(input, list/message_mods = list()) +/mob/living/carbon/human/get_default_say_verb() var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) - if(!tongue) + if(isnull(tongue)) if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) - verb_say = "signs" - else - verb_say = "gurgles" - else - verb_say = tongue.temp_say_mod || tongue.say_mod - return ..() + return "signs" + return "gurgles" + return tongue.temp_say_mod || tongue.say_mod || ..() /mob/living/carbon/human/GetVoice() if(HAS_TRAIT(src, TRAIT_UNKNOWN)) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 5b210ff77ef..4d8403413f1 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -264,23 +264,19 @@ update_worn_oversuit() else if(I == w_uniform) - // BUBBER EDIT START - PREVENTS DROPPING FROM SYNTHS - // Since this always runs on carbons we dont need to check if the loc is one - var/mob/living/carbon/human/H = src - if(invdrop && !HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && (IS_ORGANIC_LIMB(H.get_bodypart(BODY_ZONE_CHEST)))) - // BUBBER EDIT END - if(r_store) - dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop. - if(l_store) - dropItemToGround(l_store, TRUE) - if(wear_id) - dropItemToGround(wear_id) - if(belt) - dropItemToGround(belt) w_uniform = null update_suit_sensors() if(!QDELETED(src)) update_worn_undersuit() + if(invdrop) + if(r_store && !can_equip(r_store, ITEM_SLOT_RPOCKET, TRUE, ignore_equipped = TRUE)) + dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop. + if(l_store && !can_equip(l_store, ITEM_SLOT_LPOCKET, TRUE, ignore_equipped = TRUE)) + dropItemToGround(l_store, TRUE) + if(wear_id && !can_equip(wear_id, ITEM_SLOT_ID, TRUE, ignore_equipped = TRUE)) + dropItemToGround(wear_id) + if(belt && !can_equip(belt, ITEM_SLOT_BELT, TRUE, ignore_equipped = TRUE)) + dropItemToGround(belt) else if(I == gloves) //SKYRAT EDIT ADDITION - ERP UPDATE if(gloves.breakouttime) //when unequipping a straightjacket diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 597a54660bc..ce720e66789 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -52,9 +52,10 @@ human.put_in_hands(head) // We want to give the head some boring old eyes just so it doesn't look too jank on the head sprite. - head.eyes = new /obj/item/organ/internal/eyes(head) - head.eyes.eye_color_left = human.eye_color_left - head.eyes.eye_color_right = human.eye_color_right + var/obj/item/organ/internal/eyes/eyes = new /obj/item/organ/internal/eyes(head) + eyes.eye_color_left = human.eye_color_left + eyes.eye_color_right = human.eye_color_right + eyes.bodypart_insert(my_head) human.update_body() head.update_icon_dropped() human.set_safe_hunger_level() @@ -248,7 +249,8 @@ return // It's so over detached_head.real_name = wearer.real_name detached_head.name = wearer.real_name - detached_head.brain.name = "[wearer.name]'s brain" + var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in detached_head + brain.name = "[wearer.name]'s brain" /obj/item/dullahan_relay/proc/examinate_check(mob/user, atom/source) SIGNAL_HANDLER diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 01451a8db36..612328e749e 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -18,6 +18,7 @@ TRAIT_RADIMMUNE, TRAIT_SNOWSTORM_IMMUNE, // Shared with plasma river... but I guess if you can survive a plasma river a blizzard isn't a big deal TRAIT_UNHUSKABLE, + TRAIT_BOULDER_BREAKER, ) mutantheart = null mutantlungs = null @@ -87,7 +88,7 @@ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "pickaxe", SPECIES_PERK_NAME = "Natural Miners", - SPECIES_PERK_DESC = "Golems can see dimly in the dark, sense minerals, and mine stone with their bare hands. \ + SPECIES_PERK_DESC = "Golems can see dimly in the dark, sense minerals, break boulders, and mine stone with their bare hands. \ They can even smelt ores in an internal furnace, if their surrounding environment is hot enough.", )) 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 308645c9ea1..046cbc165aa 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -45,12 +45,13 @@ if(!H.dna.mutant_bodyparts["caps"] || H.dna.mutant_bodyparts["caps"][MUTANT_INDEX_NAME] != "None") // SKYRAT EDIT - Customization - ORIGINAL: if(!H.dna.features["caps"]) H.dna.mutant_bodyparts["caps"] = list(MUTANT_INDEX_NAME = "Round", MUTANT_INDEX_COLOR_LIST = list(H.hair_color)) // SKYRAT EDIT - Customization - ORIGINAL: H.dna.features["caps"] = "Round" handle_mutant_bodyparts(H) - mush = new(null) - mush.teach(H) + mush = new() + mush.teach(C) + mush.allow_temp_override = FALSE /datum/species/mush/on_species_loss(mob/living/carbon/C) . = ..() - mush.remove(C) + mush.fully_remove(C) QDEL_NULL(mush) /datum/species/mush/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a3b6c0d229c..97618605d2d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1263,9 +1263,6 @@ /mob/living/proc/resist_restraints() return -/mob/living/proc/get_visible_name() - return name - /mob/living/proc/update_gravity(gravity) // Handle movespeed stuff var/speed_change = max(0, gravity - STANDARD_GRAVITY) @@ -2123,7 +2120,11 @@ GLOBAL_LIST_EMPTY(fire_appearances) ///Checks if the user is incapacitated or on cooldown. /mob/living/proc/can_look_up() - return !(incapacitated(IGNORE_RESTRAINTS)) + if(next_move > world.time) + return FALSE + if(incapacitated(IGNORE_RESTRAINTS)) + return FALSE + return TRUE /** * look_up Changes the perspective of the mob to any openspace turf above the mob @@ -2470,31 +2471,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/get_attack_type() return BRUTE - -/** - * Apply a martial art move from src to target. - * - * This is used to process martial art attacks against nonhumans. - * It is also used to process martial art attacks by nonhumans, even against humans - * Human vs human attacks are handled in species code right now. - */ -/mob/living/proc/apply_martial_art(mob/living/target, modifiers, is_grab = FALSE) - if(HAS_TRAIT(target, TRAIT_MARTIAL_ARTS_IMMUNE)) - return MARTIAL_ATTACK_INVALID - var/datum/martial_art/style = mind?.martial_art - if (!style) - return MARTIAL_ATTACK_INVALID - // will return boolean below since it's not invalid - if (is_grab) - return style.grab_act(src, target) - if (LAZYACCESS(modifiers, RIGHT_CLICK)) - return style.disarm_act(src, target) - if(combat_mode) - if (HAS_TRAIT(src, TRAIT_PACIFISM)) - return FALSE - return style.harm_act(src, target) - return style.help_act(src, target) - /** * Returns an assoc list of assignments and minutes for updating a client's exp time in the databse. * @@ -2600,7 +2576,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) mob_mood.clear_mood_event(mood_events[chosen]) /// Adds a mood event to the mob -/mob/living/proc/add_mood_event(category, type, timeout_mod, ...) +/mob/living/proc/add_mood_event(category, type, ...) if(QDELETED(mob_mood)) return mob_mood.add_mood_event(arglist(args)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index ccdcc18390f..0d53a457fbb 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -179,6 +179,10 @@ blocked = TRUE else playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) //Item sounds are handled in the item itself + if(!isvendor(AM) && !iscarbon(AM)) //Vendors have special interactions, while carbon mobs already generate visible messages! + visible_message(span_danger("[src] is hit by [AM]!"), \ + span_userdanger("You're hit by [AM]!")) + log_combat(AM, src, "hit ") return ..() var/obj/item/thrown_item = AM @@ -202,6 +206,8 @@ var/mob/thrown_by = thrown_item.thrownby?.resolve() if(thrown_by) log_combat(thrown_by, src, "threw and hit", thrown_item) + else + log_combat(thrown_item, src, "hit ") if(nosell_hit) return ..() visible_message(span_danger("[src] is hit by [thrown_item]!"), \ @@ -221,17 +227,34 @@ adjust_fire_stacks(3) ignite_mob() -/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = FALSE) +/** + * Called when a mob is grabbing another mob. + */ +/mob/living/proc/grab(mob/living/target) + if(!istype(target)) + return FALSE + if(SEND_SIGNAL(src, COMSIG_LIVING_GRAB, target) & (COMPONENT_CANCEL_ATTACK_CHAIN|COMPONENT_SKIP_ATTACK)) + return FALSE + if(target.check_block(src, 0, "[src]'s grab")) + return FALSE + target.grabbedby(src) + return TRUE + +/** + * Called when this mob is grabbed by another mob. + */ +/mob/living/proc/grabbedby(mob/living/user, supress_message = FALSE, grabbed_part) // SKYRAT EDIT CHANGE - ORIGINAL: /mob/living/proc/grabbedby(mob/living/user, supress_message = FALSE) if(user == src || anchored || !isturf(user.loc)) return FALSE if(!user.pulling || user.pulling != src) user.start_pulling(src, supress_message = supress_message) return - + // This line arbitrarily prevents any non-carbon from upgrading grabs + if(!iscarbon(user)) + return if(!(status_flags & CANPUSH) || HAS_TRAIT(src, TRAIT_PUSHIMMUNE)) to_chat(user, span_warning("[src] can't be grabbed more aggressively!")) return FALSE - if(user.grab_state >= GRAB_AGGRESSIVE && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to risk hurting [src]!")) return FALSE @@ -296,30 +319,6 @@ user.set_pull_offsets(src, grab_state) return TRUE - -/mob/living/attack_slime(mob/living/simple_animal/slime/attacking_slime, list/modifiers) - if(attacking_slime.buckled) - if(attacking_slime in buckled_mobs) - attacking_slime.stop_feeding() - return // can't attack while eating! - - if(HAS_TRAIT(attacking_slime, TRAIT_PACIFISM)) - to_chat(attacking_slime, span_warning("You don't want to hurt anyone!")) - return FALSE - - if(check_block(src, attacking_slime.melee_damage_upper, "[attacking_slime]'s glomp", MELEE_ATTACK, attacking_slime.armour_penetration, attacking_slime.melee_damage_type)) - return FALSE - - if (stat != DEAD) - log_combat(attacking_slime, src, "attacked") - attacking_slime.do_attack_animation(src) - visible_message(span_danger("\The [attacking_slime.name] glomps [src]!"), \ - span_userdanger("\The [attacking_slime.name] glomps you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacking_slime) - to_chat(attacking_slime, span_danger("You glomp [src]!")) - return TRUE - - return FALSE - /mob/living/attack_animal(mob/living/simple_animal/user, list/modifiers) . = ..() if(.) @@ -389,21 +388,12 @@ if(operations.next_step(user, modifiers)) return TRUE - var/martial_result = user.apply_martial_art(src, modifiers) - if (martial_result != MARTIAL_ATTACK_INVALID) - return martial_result - return FALSE /mob/living/attack_paw(mob/living/carbon/human/user, list/modifiers) - var/martial_result = user.apply_martial_art(src, modifiers) - if (martial_result != MARTIAL_ATTACK_INVALID) - return martial_result - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if (user != src && iscarbon(src)) - user.disarm(src) - return TRUE + user.disarm(src) + return TRUE if (!user.combat_mode) return FALSE if(HAS_TRAIT(user, TRAIT_PACIFISM)) @@ -645,6 +635,145 @@ ricocheting_projectile.set_angle(new_angle_s) return TRUE +/** + * Attempt to disarm the target mob. Some items might let you do it, also carbon can do it with right click. + * Will shove the target mob back, and drop them if they're in front of something dense + * or another carbon. +*/ +/mob/living/proc/disarm(mob/living/target, obj/item/weapon) + if(!can_disarm(target)) + return + var/shove_flags = target.get_shove_flags(src, weapon) + if(weapon) + do_attack_animation(target, used_item = weapon) + playsound(target, 'sound/effects/glassbash.ogg', 50, TRUE, -1) + else + //SKYRAT EDIT ADDITION BEGIN - EMOTES + if(zone_selected == BODY_ZONE_PRECISE_GROIN && target.dir == src.dir) + if(HAS_TRAIT(target, TRAIT_PERSONALSPACE)) //You need to be conscious and uncuffed to use Personal Space + if(target.combat_mode && (!HAS_TRAIT(target, TRAIT_PACIFISM))) //Being pacified prevents violent counters + var/obj/item/bodypart/affecting = src.get_bodypart(BODY_ZONE_HEAD) + if(affecting?.receive_damage(PERSONAL_SPACE_DAMAGE)) + src.update_damage_overlays() + visible_message(span_danger("[src] tried slapping [target]'s ass, but they were slapped instead!"), + span_danger("You tried slapping [target]'s ass, but they hit you back, ouch!"), + "You hear a slap.", ignored_mobs = list(target)) + playsound(target.loc, 'sound/effects/snap.ogg', 50, TRUE, ASS_SLAP_EXTRA_RANGE) + to_chat(target, span_danger("[src] tried slapping your ass, but you hit them back!")) + return + else + visible_message(span_danger("[src] tried slapping [target]'s ass, but they were blocked!"), + span_danger("You tried slapping [target]'s ass, but they blocked you!"), + "You hear a slap.", ignored_mobs = list(target)) + playsound(target.loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, ASS_SLAP_EXTRA_RANGE) + to_chat(target, span_danger("[src] tried slapping your ass, but you blocked them!")) + return + else + do_ass_slap_animation(target) + playsound(target.loc, 'sound/weapons/slap.ogg', 50, TRUE, ASS_SLAP_EXTRA_RANGE) + visible_message(span_danger("[src] slaps [target] right on the ass!"),\ + span_danger("You slap [target] on the ass, how satisfying."),\ + "You hear a slap.", ignored_mobs = list(target)) + to_chat(target, "[src] slaps your ass!") + return + //SKYRAT EDIT END + do_attack_animation(target, ATTACK_EFFECT_DISARM) + playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + if (ishuman(target) && isnull(weapon)) + var/mob/living/carbon/human/human_target = target + human_target.w_uniform?.add_fingerprint(src) + + SEND_SIGNAL(target, COMSIG_LIVING_DISARM_HIT, src, zone_selected, weapon) + var/shove_dir = get_dir(loc, target.loc) + var/turf/target_shove_turf = get_step(target.loc, shove_dir) + var/turf/target_old_turf = target.loc + + //Are we hitting anything? or + if(shove_flags & SHOVE_CAN_MOVE) + if(SEND_SIGNAL(target_shove_turf, COMSIG_LIVING_DISARM_PRESHOVE, src, target, weapon) & COMSIG_LIVING_ACT_SOLID) + shove_flags |= SHOVE_BLOCKED + else + target.Move(target_shove_turf, shove_dir) + if(get_turf(target) == target_old_turf) + shove_flags |= SHOVE_BLOCKED + + if(!(shove_flags & SHOVE_BLOCKED)) + target.setGrabState(GRAB_PASSIVE) + + //Directional checks to make sure that we're not shoving through a windoor or something like that + if((shove_flags & SHOVE_BLOCKED) && (shove_dir in GLOB.cardinals)) + var/target_turf = get_turf(target) + for(var/obj/obj_content in target_turf) + if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == shove_dir && obj_content.density) + shove_flags |= SHOVE_DIRECTIONAL_BLOCKED + break + if(target_turf != target_shove_turf && !(shove_flags && SHOVE_DIRECTIONAL_BLOCKED)) //Make sure that we don't run the exact same check twice on the same tile + for(var/obj/obj_content in target_shove_turf) + if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == REVERSE_DIR(shove_dir) && obj_content.density) + shove_flags |= SHOVE_DIRECTIONAL_BLOCKED + break + + if(shove_flags & SHOVE_CAN_HIT_SOMETHING) + //Don't hit people through windows, ok? + if(!(shove_flags & SHOVE_DIRECTIONAL_BLOCKED) && (SEND_SIGNAL(target_shove_turf, COMSIG_LIVING_DISARM_COLLIDE, src, target, shove_flags, weapon) & COMSIG_LIVING_SHOVE_HANDLED)) + return + if((shove_flags & SHOVE_BLOCKED) && !(shove_flags & (SHOVE_KNOCKDOWN_BLOCKED|SHOVE_CAN_KICK_SIDE))) + target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + target.visible_message(span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), + span_userdanger("You're knocked down from a shove by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + to_chat(src, span_danger("You shove [target.name], knocking [target.p_them()] down!")) + log_combat(src, target, "shoved", "knocking them down[weapon ? " with [weapon]" : ""]") + return + + if(shove_flags & SHOVE_CAN_KICK_SIDE) //KICK HIM IN THE NUTS + target.Paralyze(SHOVE_CHAIN_PARALYZE) + target.visible_message(span_danger("[name] kicks [target.name] onto [target.p_their()] side!"), + span_userdanger("You're kicked onto your side by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + to_chat(src, span_danger("You kick [target.name] onto [target.p_their()] side!")) + addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE) + log_combat(src, target, "kicks", "onto their side (paralyzing)") + return + + target.get_shoving_message(src, weapon, shove_flags) + + //Take their lunch money + var/target_held_item = target.get_active_held_item() + var/append_message = weapon ? " with [weapon]" : "" + if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) //It's too expensive we'll get caught + target_held_item = null + + if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered)) + target.dropItemToGround(target_held_item) + append_message = "causing [target.p_them()] to drop [target_held_item]" + target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"), + span_warning("You drop \the [target_held_item]!"), null, COMBAT_MESSAGE_RANGE) + + if(shove_flags & SHOVE_CAN_STAGGER) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) + + log_combat(src, target, "shoved", append_message) + +///Check if the universal conditions for disarming/shoving are met. +/mob/living/proc/can_disarm(mob/living/target) + if(body_position != STANDING_UP || src == target || loc == target.loc) + return FALSE + return TRUE + +///Check if there's anything that could stop the knockdown from being shoved into something or someone. +/mob/living/proc/get_shove_flags(mob/living/shover, obj/item/weapon) + if(shover.move_force >= move_resist) + . |= SHOVE_CAN_MOVE + if(!buckled) + . |= SHOVE_CAN_HIT_SOMETHING + if(HAS_TRAIT(src, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) + . |= SHOVE_KNOCKDOWN_BLOCKED + +///Send the chat feedback message for shoving +/mob/living/proc/get_shoving_message(mob/living/shover, obj/item/weapon, shove_flags) + visible_message(span_danger("[shover] shoves [name][weapon ? " with [weapon]" : ""]!"), + span_userdanger("You're shoved by [shover][weapon ? " with [weapon]" : ""]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, shover) + to_chat(shover, span_danger("You shove [name][weapon ? " with [weapon]" : ""]!")) + /mob/living/proc/check_block(atom/hit_by, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0, damage_type = BRUTE) if(SEND_SIGNAL(src, COMSIG_LIVING_CHECK_BLOCK, hit_by, damage, attack_text, attack_type, armour_penetration, damage_type) & SUCCESSFUL_BLOCK) return TRUE diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index d31e5dd5fa5..660e818251a 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -211,33 +211,33 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( message = "[randomnote] [message] [randomnote]" spans |= SPAN_SINGING + if(LAZYACCESS(message_mods,WHISPER_MODE)) // whisper away + spans |= SPAN_ITALICS if(!message) if(succumbed) succumb() return - //BUBBER EDIT: AUTOPUNCTUATION - if(client?.autopunctuation) - message = autopunct_bare(message) - //BUBBER EDIT END: AUTOPUNCTUATION + //Get which verb is prefixed to the message before radio but after most modifications + message_mods[SAY_MOD_VERB] = say_mod(message, message_mods) + // SKYRAT EDIT ADDITION START: autopunctuation + //ensure EOL punctuation exists and that word-bounded 'i' are capitalized before we do anything else + message = autopunct_bare(message) + // SKYRAT EDIT ADDITION END //This is before anything that sends say a radio message, and after all important message type modifications, so you can scumb in alien chat or something if(saymode && !saymode.handle_message(src, message, language)) return - var/radio_message = message - if(message_mods[WHISPER_MODE]) - // radios don't pick up whispers very well - radio_message = stars(radio_message) - spans |= SPAN_ITALICS - var/radio_return = radio(radio_message, message_mods, spans, language)//roughly 27% of living/say()'s total cost + var/radio_return = radio(message, message_mods, spans, language)//roughly 27% of living/say()'s total cost if(radio_return & ITALICS) spans |= SPAN_ITALICS if(radio_return & REDUCE_RANGE) message_range = 1 if(!message_mods[WHISPER_MODE]) message_mods[WHISPER_MODE] = MODE_WHISPER + message_mods[SAY_MOD_VERB] = say_mod(message, message_mods) if(radio_return & NOPASS) return TRUE @@ -278,7 +278,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/understood = TRUE if(!is_custom_emote) // we do not translate emotes var/untranslated_raw_message = raw_message - raw_message = translate_language(src, message_language, raw_message) // translate + raw_message = translate_language(speaker, message_language, raw_message, spans, message_mods) // translate if(raw_message != untranslated_raw_message) understood = FALSE @@ -322,7 +322,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(speaker != src) if(!radio_freq) //These checks have to be separate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. - deaf_message = "[span_name("[speaker]")] [speaker.verb_say] something but you cannot hear [speaker.p_them()]." + deaf_message = "[span_name("[speaker]")] [speaker.get_default_say_verb()] something but you cannot hear [speaker.p_them()]." deaf_type = MSG_VISUAL else deaf_message = span_notice("You can't hear yourself!") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f0122491a04..096afab907d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -496,10 +496,6 @@ if(incapacitated()) return - if (href_list["mach_close"]) - var/t1 = "window=[href_list["mach_close"]]" - unset_machine() - src << browse(null, t1) if (href_list["switchcamera"]) switchCamera(locate(href_list["switchcamera"]) in GLOB.cameranet.cameras) if (href_list["showalerts"]) @@ -902,7 +898,7 @@ return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5) /mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) - var/raw_translation = translate_language(speaker, message_language, raw_message) + var/raw_translation = translate_language(speaker, message_language, raw_message, spans, message_mods) var/atom/movable/source = speaker.GetSource() || speaker // is the speaker virtual/radio var/treated_message = source.say_quote(raw_translation, spans, message_mods) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index da8411f7cb3..1148b639d01 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -10,9 +10,6 @@ return ..() -/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - return //immune to slimes - /mob/living/silicon/ai/blob_act(obj/structure/blob/B) if (stat != DEAD) adjustBruteLoss(60) diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index 4a6a2a5519b..dacb1eeb813 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -7,1042 +7,1043 @@ // For vim // :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox_fem\/\1',/g -GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', -"," = 'sound/vox_fem/,.ogg', -"." = 'sound/vox_fem/..ogg', -"a" = 'sound/vox_fem/a.ogg', -"abortions" = 'sound/vox_fem/abortions.ogg', -"above" = 'sound/vox_fem/above.ogg', -"abstain" = 'sound/vox_fem/abstain.ogg', -"accelerating" = 'sound/vox_fem/accelerating.ogg', -"accelerator" = 'sound/vox_fem/accelerator.ogg', -"accepted" = 'sound/vox_fem/accepted.ogg', -"access" = 'sound/vox_fem/access.ogg', -"acknowledge" = 'sound/vox_fem/acknowledge.ogg', -"acknowledged" = 'sound/vox_fem/acknowledged.ogg', -"acquired" = 'sound/vox_fem/acquired.ogg', -"acquisition" = 'sound/vox_fem/acquisition.ogg', -"across" = 'sound/vox_fem/across.ogg', -"activate" = 'sound/vox_fem/activate.ogg', -"activated" = 'sound/vox_fem/activated.ogg', -"activity" = 'sound/vox_fem/activity.ogg', -"adios" = 'sound/vox_fem/adios.ogg', -"administration" = 'sound/vox_fem/administration.ogg', -"advanced" = 'sound/vox_fem/advanced.ogg', -"advised" = 'sound/vox_fem/advised.ogg', -"aft" = 'sound/vox_fem/aft.ogg', -"after" = 'sound/vox_fem/after.ogg', -"agent" = 'sound/vox_fem/agent.ogg', -"ai" = 'sound/vox_fem/ai.ogg', -"air" = 'sound/vox_fem/air.ogg', -"airlock" = 'sound/vox_fem/airlock.ogg', -"alarm" = 'sound/vox_fem/alarm.ogg', -"alarmed" = 'sound/vox_fem/alarmed.ogg', -"alarming" = 'sound/vox_fem/alarming.ogg', -"alert" = 'sound/vox_fem/alert.ogg', -"alerted" = 'sound/vox_fem/alerted.ogg', -"alerting" = 'sound/vox_fem/alerting.ogg', -"alien" = 'sound/vox_fem/alien.ogg', -"aligned" = 'sound/vox_fem/aligned.ogg', -"all" = 'sound/vox_fem/all.ogg', -"alpha" = 'sound/vox_fem/alpha.ogg', -"also" = 'sound/vox_fem/also.ogg', -"am" = 'sound/vox_fem/am.ogg', -"amigo" = 'sound/vox_fem/amigo.ogg', -"ammunition" = 'sound/vox_fem/ammunition.ogg', -"an" = 'sound/vox_fem/an.ogg', -"and" = 'sound/vox_fem/and.ogg', -"animal" = 'sound/vox_fem/animal.ogg', -"announcement" = 'sound/vox_fem/announcement.ogg', -"anomalous" = 'sound/vox_fem/anomalous.ogg', -"answer" = 'sound/vox_fem/answer.ogg', -"antenna" = 'sound/vox_fem/antenna.ogg', -"any" = 'sound/vox_fem/any.ogg', -"apc" = 'sound/vox_fem/apc.ogg', -"apprehend" = 'sound/vox_fem/apprehend.ogg', -"approach" = 'sound/vox_fem/approach.ogg', -"are" = 'sound/vox_fem/are.ogg', -"area" = 'sound/vox_fem/area.ogg', -"arm" = 'sound/vox_fem/arm.ogg', -"armed" = 'sound/vox_fem/armed.ogg', -"armor" = 'sound/vox_fem/armor.ogg', -"armory" = 'sound/vox_fem/armory.ogg', -"array" = 'sound/vox_fem/array.ogg', -"arrest" = 'sound/vox_fem/arrest.ogg', -"artillery" = 'sound/vox_fem/artillery.ogg', -"asimov" = 'sound/vox_fem/asimov.ogg', -"ass" = 'sound/vox_fem/ass.ogg', -"asshole" = 'sound/vox_fem/asshole.ogg', -"assholes" = 'sound/vox_fem/assholes.ogg', -"assistance" = 'sound/vox_fem/assistance.ogg', -"assistant" = 'sound/vox_fem/assistant.ogg', -"at" = 'sound/vox_fem/at.ogg', -"atmosphere" = 'sound/vox_fem/atmosphere.ogg', -"atmospheric" = 'sound/vox_fem/atmospheric.ogg', -"atmospherics" = 'sound/vox_fem/atmospherics.ogg', -"atomic" = 'sound/vox_fem/atomic.ogg', -"attention" = 'sound/vox_fem/attention.ogg', -"authentication" = 'sound/vox_fem/authentication.ogg', -"authorize" = 'sound/vox_fem/authorize.ogg', -"authorized" = 'sound/vox_fem/authorized.ogg', -"automatic" = 'sound/vox_fem/automatic.ogg', -"away" = 'sound/vox_fem/away.ogg', -"awful" = 'sound/vox_fem/awful.ogg', -"b" = 'sound/vox_fem/b.ogg', -"back" = 'sound/vox_fem/back.ogg', -"backman" = 'sound/vox_fem/backman.ogg', -"bad" = 'sound/vox_fem/bad.ogg', -"bag" = 'sound/vox_fem/bag.ogg', -"bailey" = 'sound/vox_fem/bailey.ogg', -"bar" = 'sound/vox_fem/bar.ogg', -"barracks" = 'sound/vox_fem/barracks.ogg', -"bartender" = 'sound/vox_fem/bartender.ogg', -"base" = 'sound/vox_fem/base.ogg', -"bay" = 'sound/vox_fem/bay.ogg', -"be" = 'sound/vox_fem/be.ogg', -"beam" = 'sound/vox_fem/beam.ogg', -"been" = 'sound/vox_fem/been.ogg', -"beep" = 'sound/vox_fem/beep.ogg', -"before" = 'sound/vox_fem/before.ogg', -"below" = 'sound/vox_fem/below.ogg', -"beside" = 'sound/vox_fem/beside.ogg', -"beware" = 'sound/vox_fem/beware.ogg', -"beyond" = 'sound/vox_fem/beyond.ogg', -"big" = 'sound/vox_fem/big.ogg', -"billion" = 'sound/vox_fem/billion.ogg', -"biohazard" = 'sound/vox_fem/biohazard.ogg', -"biological" = 'sound/vox_fem/biological.ogg', -"birdwell" = 'sound/vox_fem/birdwell.ogg', -"bitch" = 'sound/vox_fem/bitch.ogg', -"bitches" = 'sound/vox_fem/bitches.ogg', -"bitcoin" = 'sound/vox_fem/bitcoin.ogg', -"bitrun" = 'sound/vox_fem/bitrun.ogg', -"bitrunner" = 'sound/vox_fem/bitrunner.ogg', -"bitrunning" = 'sound/vox_fem/bitrunning.ogg', -"black" = 'sound/vox_fem/black.ogg', -"blast" = 'sound/vox_fem/blast.ogg', -"bleed" = 'sound/vox_fem/bleed.ogg', -"blob" = 'sound/vox_fem/blob.ogg', -"blocked" = 'sound/vox_fem/blocked.ogg', -"blood" = 'sound/vox_fem/blood.ogg', -"bloop" = 'sound/vox_fem/bloop.ogg', -"blue" = 'sound/vox_fem/blue.ogg', -"bluespace" = 'sound/vox_fem/bluespace.ogg', -"bomb" = 'sound/vox_fem/bomb.ogg', -"bone" = 'sound/vox_fem/bone.ogg', -"botanist" = 'sound/vox_fem/botanist.ogg', -"botany" = 'sound/vox_fem/botany.ogg', -"bottom" = 'sound/vox_fem/bottom.ogg', -"bravo" = 'sound/vox_fem/bravo.ogg', -"breach" = 'sound/vox_fem/breach.ogg', -"breached" = 'sound/vox_fem/breached.ogg', -"break" = 'sound/vox_fem/break.ogg', -"bridge" = 'sound/vox_fem/bridge.ogg', -"brig" = 'sound/vox_fem/brig.ogg', -"bust" = 'sound/vox_fem/bust.ogg', -"but" = 'sound/vox_fem/but.ogg', -"button" = 'sound/vox_fem/button.ogg', -"bypass" = 'sound/vox_fem/bypass.ogg', -"c" = 'sound/vox_fem/c.ogg', -"cable" = 'sound/vox_fem/cable.ogg', -"call" = 'sound/vox_fem/call.ogg', -"called" = 'sound/vox_fem/called.ogg', -"canal" = 'sound/vox_fem/canal.ogg', -"canister" = 'sound/vox_fem/canister.ogg', -"cap" = 'sound/vox_fem/cap.ogg', -"captain" = 'sound/vox_fem/captain.ogg', -"capture" = 'sound/vox_fem/capture.ogg', -"carbon" = 'sound/vox_fem/carbon.ogg', -"cargo" = 'sound/vox_fem/cargo.ogg', -"cat" = 'sound/vox_fem/cat.ogg', -"ce" = 'sound/vox_fem/ce.ogg', -"cease" = 'sound/vox_fem/cease.ogg', -"ceiling" = 'sound/vox_fem/ceiling.ogg', -"celsius" = 'sound/vox_fem/celsius.ogg', -"centcom" = 'sound/vox_fem/centcom.ogg', -"center" = 'sound/vox_fem/center.ogg', -"centi" = 'sound/vox_fem/centi.ogg', -"central" = 'sound/vox_fem/central.ogg', -"challenge" = 'sound/vox_fem/challenge.ogg', -"chamber" = 'sound/vox_fem/chamber.ogg', -"change" = 'sound/vox_fem/change.ogg', -"changed" = 'sound/vox_fem/changed.ogg', -"changeling" = 'sound/vox_fem/changeling.ogg', -"chapel" = 'sound/vox_fem/chapel.ogg', -"chaplain" = 'sound/vox_fem/chaplain.ogg', -"charlie" = 'sound/vox_fem/charlie.ogg', -"check" = 'sound/vox_fem/check.ogg', -"checkpoint" = 'sound/vox_fem/checkpoint.ogg', -"chemical" = 'sound/vox_fem/chemical.ogg', -"chemist" = 'sound/vox_fem/chemist.ogg', -"chief" = 'sound/vox_fem/chief.ogg', -"christ" = 'sound/vox_fem/christ.ogg', -"christmas" = 'sound/vox_fem/christmas.ogg', -"chuckle" = 'sound/vox_fem/chuckle.ogg', -"circuit" = 'sound/vox_fem/circuit.ogg', -"cleanup" = 'sound/vox_fem/cleanup.ogg', -"clear" = 'sound/vox_fem/clear.ogg', -"clearance" = 'sound/vox_fem/clearance.ogg', -"clockwork" = 'sound/vox_fem/clockwork.ogg', -"close" = 'sound/vox_fem/close.ogg', -"closed" = 'sound/vox_fem/closed.ogg', -"closing" = 'sound/vox_fem/closing.ogg', -"clown" = 'sound/vox_fem/clown.ogg', -"clowning" = 'sound/vox_fem/clowning.ogg', -"cmo" = 'sound/vox_fem/cmo.ogg', -"code" = 'sound/vox_fem/code.ogg', -"coded" = 'sound/vox_fem/coded.ogg', -"cold" = 'sound/vox_fem/cold.ogg', -"collider" = 'sound/vox_fem/collider.ogg', -"come" = 'sound/vox_fem/come.ogg', -"command" = 'sound/vox_fem/command.ogg', -"communication" = 'sound/vox_fem/communication.ogg', -"complex" = 'sound/vox_fem/complex.ogg', -"comply" = 'sound/vox_fem/comply.ogg', -"computer" = 'sound/vox_fem/computer.ogg', -"condition" = 'sound/vox_fem/condition.ogg', -"condom" = 'sound/vox_fem/condom.ogg', -"confirmed" = 'sound/vox_fem/confirmed.ogg', -"connor" = 'sound/vox_fem/connor.ogg', -"console" = 'sound/vox_fem/console.ogg', -"console2" = 'sound/vox_fem/console2.ogg', -"construct" = 'sound/vox_fem/construct.ogg', -"containment" = 'sound/vox_fem/containment.ogg', -"contamination" = 'sound/vox_fem/contamination.ogg', -"contraband" = 'sound/vox_fem/contraband.ogg', -"control" = 'sound/vox_fem/control.ogg', -"cook" = 'sound/vox_fem/cook.ogg', -"coolant" = 'sound/vox_fem/coolant.ogg', -"coomer" = 'sound/vox_fem/coomer.ogg', -"core" = 'sound/vox_fem/core.ogg', -"corgi" = 'sound/vox_fem/corgi.ogg', -"corporation" = 'sound/vox_fem/corporation.ogg', -"correct" = 'sound/vox_fem/correct.ogg', -"corridor" = 'sound/vox_fem/corridor.ogg', -"corridors" = 'sound/vox_fem/corridors.ogg', -"coward" = 'sound/vox_fem/coward.ogg', -"cowards" = 'sound/vox_fem/cowards.ogg', -"crate" = 'sound/vox_fem/crate.ogg', -"created" = 'sound/vox_fem/created.ogg', -"creature" = 'sound/vox_fem/creature.ogg', -"crew" = 'sound/vox_fem/crew.ogg', -"critical" = 'sound/vox_fem/critical.ogg', -"cross" = 'sound/vox_fem/cross.ogg', -"cryogenic" = 'sound/vox_fem/cryogenic.ogg', -"crystal" = 'sound/vox_fem/crystal.ogg', -"cult" = 'sound/vox_fem/cult.ogg', -"cultist" = 'sound/vox_fem/cultist.ogg', -"cunt" = 'sound/vox_fem/cunt.ogg', -"curator" = 'sound/vox_fem/curator.ogg', -"cyborg" = 'sound/vox_fem/cyborg.ogg', -"cyborgs" = 'sound/vox_fem/cyborgs.ogg', -"d" = 'sound/vox_fem/d.ogg', -"damage" = 'sound/vox_fem/damage.ogg', -"damaged" = 'sound/vox_fem/damaged.ogg', -"danger" = 'sound/vox_fem/danger.ogg', -"dangerous" = 'sound/vox_fem/dangerous.ogg', -"day" = 'sound/vox_fem/day.ogg', -"deactivated" = 'sound/vox_fem/deactivated.ogg', -"dead" = 'sound/vox_fem/dead.ogg', -"death" = 'sound/vox_fem/death.ogg', -"decompression" = 'sound/vox_fem/decompression.ogg', -"decontamination" = 'sound/vox_fem/decontamination.ogg', -"deeoo" = 'sound/vox_fem/deeoo.ogg', -"defense" = 'sound/vox_fem/defense.ogg', -"degrees" = 'sound/vox_fem/degrees.ogg', -"delta" = 'sound/vox_fem/delta.ogg', -"demon" = 'sound/vox_fem/demon.ogg', -"denied" = 'sound/vox_fem/denied.ogg', -"departures" = 'sound/vox_fem/departures.ogg', -"deploy" = 'sound/vox_fem/deploy.ogg', -"deployed" = 'sound/vox_fem/deployed.ogg', -"desire" = 'sound/vox_fem/desire.ogg', -"desist" = 'sound/vox_fem/desist.ogg', -"destroy" = 'sound/vox_fem/destroy.ogg', -"destroyed" = 'sound/vox_fem/destroyed.ogg', -"destruction" = 'sound/vox_fem/destruction.ogg', -"detain" = 'sound/vox_fem/detain.ogg', -"detected" = 'sound/vox_fem/detected.ogg', -"detective" = 'sound/vox_fem/detective.ogg', -"detonation" = 'sound/vox_fem/detonation.ogg', -"device" = 'sound/vox_fem/device.ogg', -"devil" = 'sound/vox_fem/devil.ogg', -"did" = 'sound/vox_fem/did.ogg', -"die" = 'sound/vox_fem/die.ogg', -"died" = 'sound/vox_fem/died.ogg', -"dimensional" = 'sound/vox_fem/dimensional.ogg', -"dioxide" = 'sound/vox_fem/dioxide.ogg', -"director" = 'sound/vox_fem/director.ogg', -"dirt" = 'sound/vox_fem/dirt.ogg', -"disabled" = 'sound/vox_fem/disabled.ogg', -"disease" = 'sound/vox_fem/disease.ogg', -"disengaged" = 'sound/vox_fem/disengaged.ogg', -"dish" = 'sound/vox_fem/dish.ogg', -"disk" = 'sound/vox_fem/disk.ogg', -"disposal" = 'sound/vox_fem/disposal.ogg', -"distance" = 'sound/vox_fem/distance.ogg', -"distortion" = 'sound/vox_fem/distortion.ogg', -"do" = 'sound/vox_fem/do.ogg', -"doctor" = 'sound/vox_fem/doctor.ogg', -"dog" = 'sound/vox_fem/dog.ogg', -"doomsday" = 'sound/vox_fem/doomsday.ogg', -"doop" = 'sound/vox_fem/doop.ogg', -"door" = 'sound/vox_fem/door.ogg', -"dormitory" = 'sound/vox_fem/dormitory.ogg', -"dot" = 'sound/vox_fem/dot.ogg', -"down" = 'sound/vox_fem/down.ogg', -"drone" = 'sound/vox_fem/drone.ogg', -"dual" = 'sound/vox_fem/dual.ogg', -"duct" = 'sound/vox_fem/duct.ogg', -"e" = 'sound/vox_fem/e.ogg', -"east" = 'sound/vox_fem/east.ogg', -"echo" = 'sound/vox_fem/echo.ogg', -"ed" = 'sound/vox_fem/ed.ogg', -"effect" = 'sound/vox_fem/effect.ogg', -"egress" = 'sound/vox_fem/egress.ogg', -"eight" = 'sound/vox_fem/eight.ogg', -"eighteen" = 'sound/vox_fem/eighteen.ogg', -"eighty" = 'sound/vox_fem/eighty.ogg', -"electric" = 'sound/vox_fem/electric.ogg', -"electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', -"elevator" = 'sound/vox_fem/elevator.ogg', -"eleven" = 'sound/vox_fem/eleven.ogg', -"eliminate" = 'sound/vox_fem/eliminate.ogg', -"emergency" = 'sound/vox_fem/emergency.ogg', -"enabled" = 'sound/vox_fem/enabled.ogg', -"energy" = 'sound/vox_fem/energy.ogg', -"engage" = 'sound/vox_fem/engage.ogg', -"engaged" = 'sound/vox_fem/engaged.ogg', -"engine" = 'sound/vox_fem/engine.ogg', -"engineer" = 'sound/vox_fem/engineer.ogg', -"engineering" = 'sound/vox_fem/engineering.ogg', -"enormous" = 'sound/vox_fem/enormous.ogg', -"enter" = 'sound/vox_fem/enter.ogg', -"entity" = 'sound/vox_fem/entity.ogg', -"entry" = 'sound/vox_fem/entry.ogg', -"environment" = 'sound/vox_fem/environment.ogg', -"epic" = 'sound/vox_fem/epic.ogg', -"equipment" = 'sound/vox_fem/equipment.ogg', -"error" = 'sound/vox_fem/error.ogg', -"escape" = 'sound/vox_fem/escape.ogg', -"ethereal" = 'sound/vox_fem/ethereal.ogg', -"eva" = 'sound/vox_fem/eva.ogg', -"evacuate" = 'sound/vox_fem/evacuate.ogg', -"ever" = 'sound/vox_fem/ever.ogg', -"exchange" = 'sound/vox_fem/exchange.ogg', -"execute" = 'sound/vox_fem/execute.ogg', -"exit" = 'sound/vox_fem/exit.ogg', -"expect" = 'sound/vox_fem/expect.ogg', -"experiment" = 'sound/vox_fem/experiment.ogg', -"experimental" = 'sound/vox_fem/experimental.ogg', -"explode" = 'sound/vox_fem/explode.ogg', -"explosion" = 'sound/vox_fem/explosion.ogg', -"explosive" = 'sound/vox_fem/explosive.ogg', -"exposure" = 'sound/vox_fem/exposure.ogg', -"exterminate" = 'sound/vox_fem/exterminate.ogg', -"extinguish" = 'sound/vox_fem/extinguish.ogg', -"extinguisher" = 'sound/vox_fem/extinguisher.ogg', -"extreme" = 'sound/vox_fem/extreme.ogg', -"f" = 'sound/vox_fem/f.ogg', -"facility" = 'sound/vox_fem/facility.ogg', -"factory" = 'sound/vox_fem/factory.ogg', -"fahrenheit" = 'sound/vox_fem/fahrenheit.ogg', -"failed" = 'sound/vox_fem/failed.ogg', -"failure" = 'sound/vox_fem/failure.ogg', -"false" = 'sound/vox_fem/false.ogg', -"farthest" = 'sound/vox_fem/farthest.ogg', -"fast" = 'sound/vox_fem/fast.ogg', -"fauna" = 'sound/vox_fem/fauna.ogg', -"feet" = 'sound/vox_fem/feet.ogg', -"felinid" = 'sound/vox_fem/felinid.ogg', -"field" = 'sound/vox_fem/field.ogg', -"fifteen" = 'sound/vox_fem/fifteen.ogg', -"fifth" = 'sound/vox_fem/fifth.ogg', -"fifty" = 'sound/vox_fem/fifty.ogg', -"final" = 'sound/vox_fem/final.ogg', -"fine" = 'sound/vox_fem/fine.ogg', -"fire" = 'sound/vox_fem/fire.ogg', -"first" = 'sound/vox_fem/first.ogg', -"five" = 'sound/vox_fem/five.ogg', -"fix" = 'sound/vox_fem/fix.ogg', -"flooding" = 'sound/vox_fem/flooding.ogg', -"floor" = 'sound/vox_fem/floor.ogg', -"flyman" = 'sound/vox_fem/flyman.ogg', -"fool" = 'sound/vox_fem/fool.ogg', -"for" = 'sound/vox_fem/for.ogg', -"forbidden" = 'sound/vox_fem/forbidden.ogg', -"force" = 'sound/vox_fem/force.ogg', -"fore" = 'sound/vox_fem/fore.ogg', -"form" = 'sound/vox_fem/form.ogg', -"formed" = 'sound/vox_fem/formed.ogg', -"forms" = 'sound/vox_fem/forms.ogg', -"forty" = 'sound/vox_fem/forty.ogg', -"found" = 'sound/vox_fem/found.ogg', -"four" = 'sound/vox_fem/four.ogg', -"fourteen" = 'sound/vox_fem/fourteen.ogg', -"fourth" = 'sound/vox_fem/fourth.ogg', -"fourty" = 'sound/vox_fem/fourty.ogg', -"foxtrot" = 'sound/vox_fem/foxtrot.ogg', -"free" = 'sound/vox_fem/free.ogg', -"freeman" = 'sound/vox_fem/freeman.ogg', -"freeze" = 'sound/vox_fem/freeze.ogg', -"freezer" = 'sound/vox_fem/freezer.ogg', -"freezing" = 'sound/vox_fem/freezing.ogg', -"from" = 'sound/vox_fem/from.ogg', -"front" = 'sound/vox_fem/front.ogg', -"froze" = 'sound/vox_fem/froze.ogg', -"frozen" = 'sound/vox_fem/frozen.ogg', -"fuck" = 'sound/vox_fem/fuck.ogg', -"fucking" = 'sound/vox_fem/fucking.ogg', -"fucks" = 'sound/vox_fem/fucks.ogg', -"fuel" = 'sound/vox_fem/fuel.ogg', -"g" = 'sound/vox_fem/g.ogg', -"gas" = 'sound/vox_fem/gas.ogg', -"generator" = 'sound/vox_fem/generator.ogg', -"geneticist" = 'sound/vox_fem/geneticist.ogg', -"get" = 'sound/vox_fem/get.ogg', -"glory" = 'sound/vox_fem/glory.ogg', -"go" = 'sound/vox_fem/go.ogg', -"god" = 'sound/vox_fem/god.ogg', -"going" = 'sound/vox_fem/going.ogg', -"golem" = 'sound/vox_fem/golem.ogg', -"good" = 'sound/vox_fem/good.ogg', -"goodbye" = 'sound/vox_fem/goodbye.ogg', -"gordon" = 'sound/vox_fem/gordon.ogg', -"got" = 'sound/vox_fem/got.ogg', -"government" = 'sound/vox_fem/government.ogg', -"granted" = 'sound/vox_fem/granted.ogg', -"gravity" = 'sound/vox_fem/gravity.ogg', -"gray" = 'sound/vox_fem/gray.ogg', -"great" = 'sound/vox_fem/great.ogg', -"green" = 'sound/vox_fem/green.ogg', -"grenade" = 'sound/vox_fem/grenade.ogg', -"guard" = 'sound/vox_fem/guard.ogg', -"gulf" = 'sound/vox_fem/gulf.ogg', -"gun" = 'sound/vox_fem/gun.ogg', -"guthrie" = 'sound/vox_fem/guthrie.ogg', -"h" = 'sound/vox_fem/h.ogg', -"hacker" = 'sound/vox_fem/hacker.ogg', -"hackers" = 'sound/vox_fem/hackers.ogg', -"had" = 'sound/vox_fem/had.ogg', -"hall" = 'sound/vox_fem/hall.ogg', -"hallway" = 'sound/vox_fem/hallway.ogg', -"handling" = 'sound/vox_fem/handling.ogg', -"hangar" = 'sound/vox_fem/hangar.ogg', -"harm" = 'sound/vox_fem/harm.ogg', -"harmful" = 'sound/vox_fem/harmful.ogg', -"has" = 'sound/vox_fem/has.ogg', -"have" = 'sound/vox_fem/have.ogg', -"hazard" = 'sound/vox_fem/hazard.ogg', -"he" = 'sound/vox_fem/he.ogg', -"head" = 'sound/vox_fem/head.ogg', -"health" = 'sound/vox_fem/health.ogg', -"heat" = 'sound/vox_fem/heat.ogg', -"helicopter" = 'sound/vox_fem/helicopter.ogg', -"helium" = 'sound/vox_fem/helium.ogg', -"hello" = 'sound/vox_fem/hello.ogg', -"help" = 'sound/vox_fem/help.ogg', -"her" = 'sound/vox_fem/her.ogg', -"here" = 'sound/vox_fem/here.ogg', -"heretic" = 'sound/vox_fem/heretic.ogg', -"hide" = 'sound/vox_fem/hide.ogg', -"high" = 'sound/vox_fem/high.ogg', -"highest" = 'sound/vox_fem/highest.ogg', -"him" = 'sound/vox_fem/him.ogg', -"hit" = 'sound/vox_fem/hit.ogg', -"hole" = 'sound/vox_fem/hole.ogg', -"honk" = 'sound/vox_fem/honk.ogg', -"hop" = 'sound/vox_fem/hop.ogg', -"hos" = 'sound/vox_fem/hos.ogg', -"hostile" = 'sound/vox_fem/hostile.ogg', -"hot" = 'sound/vox_fem/hot.ogg', -"hotel" = 'sound/vox_fem/hotel.ogg', -"hour" = 'sound/vox_fem/hour.ogg', -"hours" = 'sound/vox_fem/hours.ogg', -"how" = 'sound/vox_fem/how.ogg', -"human" = 'sound/vox_fem/human.ogg', -"humanoid" = 'sound/vox_fem/humanoid.ogg', -"humans" = 'sound/vox_fem/humans.ogg', -"hundred" = 'sound/vox_fem/hundred.ogg', -"hunger" = 'sound/vox_fem/hunger.ogg', -"hurt" = 'sound/vox_fem/hurt.ogg', -"hydro" = 'sound/vox_fem/hydro.ogg', -"hydroponics" = 'sound/vox_fem/hydroponics.ogg', -"i" = 'sound/vox_fem/i.ogg', -"ian" = 'sound/vox_fem/ian.ogg', -"idiot" = 'sound/vox_fem/idiot.ogg', -"if" = 'sound/vox_fem/if.ogg', -"if2" = 'sound/vox_fem/if2.ogg', -"illegal" = 'sound/vox_fem/illegal.ogg', -"immediate" = 'sound/vox_fem/immediate.ogg', -"immediately" = 'sound/vox_fem/immediately.ogg', -"immortal" = 'sound/vox_fem/immortal.ogg', -"impossible" = 'sound/vox_fem/impossible.ogg', -"in" = 'sound/vox_fem/in.ogg', -"inches" = 'sound/vox_fem/inches.ogg', -"india" = 'sound/vox_fem/india.ogg', -"ing" = 'sound/vox_fem/ing.ogg', -"inoperative" = 'sound/vox_fem/inoperative.ogg', -"inside" = 'sound/vox_fem/inside.ogg', -"inspection" = 'sound/vox_fem/inspection.ogg', -"inspector" = 'sound/vox_fem/inspector.ogg', -"interchange" = 'sound/vox_fem/interchange.ogg', -"internals" = 'sound/vox_fem/internals.ogg', -"intruder" = 'sound/vox_fem/intruder.ogg', -"invalid" = 'sound/vox_fem/invalid.ogg', -"invalidate" = 'sound/vox_fem/invalidate.ogg', -"invasion" = 'sound/vox_fem/invasion.ogg', -"is" = 'sound/vox_fem/is.ogg', -"it" = 'sound/vox_fem/it.ogg', -"j" = 'sound/vox_fem/j.ogg', -"janitor" = 'sound/vox_fem/janitor.ogg', -"jesus" = 'sound/vox_fem/jesus.ogg', -"johnson" = 'sound/vox_fem/johnson.ogg', -"jolly" = 'sound/vox_fem/jolly.ogg', -"juliet" = 'sound/vox_fem/juliet.ogg', -"k" = 'sound/vox_fem/k.ogg', -"key" = 'sound/vox_fem/key.ogg', -"kidnapped" = 'sound/vox_fem/kidnapped.ogg', -"kidnapping" = 'sound/vox_fem/kidnapping.ogg', -"kill" = 'sound/vox_fem/kill.ogg', -"killed" = 'sound/vox_fem/killed.ogg', -"killer" = 'sound/vox_fem/killer.ogg', -"kilo" = 'sound/vox_fem/kilo.ogg', -"kit" = 'sound/vox_fem/kit.ogg', -"kitchen" = 'sound/vox_fem/kitchen.ogg', -"l" = 'sound/vox_fem/l.ogg', -"lab" = 'sound/vox_fem/lab.ogg', -"lambda" = 'sound/vox_fem/lambda.ogg', -"large" = 'sound/vox_fem/large.ogg', -"laser" = 'sound/vox_fem/laser.ogg', -"last" = 'sound/vox_fem/last.ogg', -"launch" = 'sound/vox_fem/launch.ogg', -"lavaland" = 'sound/vox_fem/lavaland.ogg', -"law" = 'sound/vox_fem/law.ogg', -"laws" = 'sound/vox_fem/laws.ogg', -"lawyer" = 'sound/vox_fem/lawyer.ogg', -"leak" = 'sound/vox_fem/leak.ogg', -"leave" = 'sound/vox_fem/leave.ogg', -"left" = 'sound/vox_fem/left.ogg', -"legal" = 'sound/vox_fem/legal.ogg', -"level" = 'sound/vox_fem/level.ogg', -"lever" = 'sound/vox_fem/lever.ogg', -"library" = 'sound/vox_fem/library.ogg', -"lie" = 'sound/vox_fem/lie.ogg', -"lieutenant" = 'sound/vox_fem/lieutenant.ogg', -"life" = 'sound/vox_fem/life.ogg', -"lifeform" = 'sound/vox_fem/lifeform.ogg', -"light" = 'sound/vox_fem/light.ogg', -"lightbulb" = 'sound/vox_fem/lightbulb.ogg', -"lima" = 'sound/vox_fem/lima.ogg', -"liquid" = 'sound/vox_fem/liquid.ogg', -"live" = 'sound/vox_fem/live.ogg', -"live2" = 'sound/vox_fem/live2.ogg', -"lizard" = 'sound/vox_fem/lizard.ogg', -"lizardperson" = 'sound/vox_fem/lizardperson.ogg', -"loading" = 'sound/vox_fem/loading.ogg', -"locate" = 'sound/vox_fem/locate.ogg', -"located" = 'sound/vox_fem/located.ogg', -"location" = 'sound/vox_fem/location.ogg', -"lock" = 'sound/vox_fem/lock.ogg', -"locked" = 'sound/vox_fem/locked.ogg', -"locker" = 'sound/vox_fem/locker.ogg', -"lockout" = 'sound/vox_fem/lockout.ogg', -"long" = 'sound/vox_fem/long.ogg', -"look" = 'sound/vox_fem/look.ogg', -"loop" = 'sound/vox_fem/loop.ogg', -"loose" = 'sound/vox_fem/loose.ogg', -"lot" = 'sound/vox_fem/lot.ogg', -"lower" = 'sound/vox_fem/lower.ogg', -"lowest" = 'sound/vox_fem/lowest.ogg', -"lusty" = 'sound/vox_fem/lusty.ogg', -"m" = 'sound/vox_fem/m.ogg', -"machine" = 'sound/vox_fem/machine.ogg', -"magic" = 'sound/vox_fem/magic.ogg', -"magnetic" = 'sound/vox_fem/magnetic.ogg', -"main" = 'sound/vox_fem/main.ogg', -"maintainer" = 'sound/vox_fem/maintainer.ogg', -"maintenance" = 'sound/vox_fem/maintenance.ogg', -"major" = 'sound/vox_fem/major.ogg', -"malfunction" = 'sound/vox_fem/malfunction.ogg', -"man" = 'sound/vox_fem/man.ogg', -"many" = 'sound/vox_fem/many.ogg', -"mass" = 'sound/vox_fem/mass.ogg', -"materials" = 'sound/vox_fem/materials.ogg', -"maximum" = 'sound/vox_fem/maximum.ogg', -"may" = 'sound/vox_fem/may.ogg', -"me" = 'sound/vox_fem/me.ogg', -"meat" = 'sound/vox_fem/meat.ogg', -"medbay" = 'sound/vox_fem/medbay.ogg', -"medical" = 'sound/vox_fem/medical.ogg', -"megafauna" = 'sound/vox_fem/megafauna.ogg', -"men" = 'sound/vox_fem/men.ogg', -"mercy" = 'sound/vox_fem/mercy.ogg', -"mesa" = 'sound/vox_fem/mesa.ogg', -"message" = 'sound/vox_fem/message.ogg', -"meter" = 'sound/vox_fem/meter.ogg', -"micro" = 'sound/vox_fem/micro.ogg', -"middle" = 'sound/vox_fem/middle.ogg', -"mike" = 'sound/vox_fem/mike.ogg', -"miles" = 'sound/vox_fem/miles.ogg', -"military" = 'sound/vox_fem/military.ogg', -"milli" = 'sound/vox_fem/milli.ogg', -"million" = 'sound/vox_fem/million.ogg', -"mime" = 'sound/vox_fem/mime.ogg', -"minefield" = 'sound/vox_fem/minefield.ogg', -"miner" = 'sound/vox_fem/miner.ogg', -"minimum" = 'sound/vox_fem/minimum.ogg', -"minor" = 'sound/vox_fem/minor.ogg', -"minutes" = 'sound/vox_fem/minutes.ogg', -"mister" = 'sound/vox_fem/mister.ogg', -"mode" = 'sound/vox_fem/mode.ogg', -"modification" = 'sound/vox_fem/modification.ogg', -"money" = 'sound/vox_fem/money.ogg', -"monkey" = 'sound/vox_fem/monkey.ogg', -"moth" = 'sound/vox_fem/moth.ogg', -"mothperson" = 'sound/vox_fem/mothperson.ogg', -"motor" = 'sound/vox_fem/motor.ogg', -"motorpool" = 'sound/vox_fem/motorpool.ogg', -"move" = 'sound/vox_fem/move.ogg', -"multitude" = 'sound/vox_fem/multitude.ogg', -"murder" = 'sound/vox_fem/murder.ogg', -"murderer" = 'sound/vox_fem/murderer.ogg', -"must" = 'sound/vox_fem/must.ogg', -"my" = 'sound/vox_fem/my.ogg', -"mythic" = 'sound/vox_fem/mythic.ogg', -"n" = 'sound/vox_fem/n.ogg', -"nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', -"nearest" = 'sound/vox_fem/nearest.ogg', -"need" = 'sound/vox_fem/need.ogg', -"never" = 'sound/vox_fem/never.ogg', -"nice" = 'sound/vox_fem/nice.ogg', -"night" = 'sound/vox_fem/night.ogg', -"nine" = 'sound/vox_fem/nine.ogg', -"nineteen" = 'sound/vox_fem/nineteen.ogg', -"ninety" = 'sound/vox_fem/ninety.ogg', -"nitrogen" = 'sound/vox_fem/nitrogen.ogg', -"no" = 'sound/vox_fem/no.ogg', -"nominal" = 'sound/vox_fem/nominal.ogg', -"north" = 'sound/vox_fem/north.ogg', -"northeast" = 'sound/vox_fem/northeast.ogg', -"northwest" = 'sound/vox_fem/northwest.ogg', -"not" = 'sound/vox_fem/not.ogg', -"november" = 'sound/vox_fem/november.ogg', -"now" = 'sound/vox_fem/now.ogg', -"nuclear" = 'sound/vox_fem/nuclear.ogg', -"nuke" = 'sound/vox_fem/nuke.ogg', -"number" = 'sound/vox_fem/number.ogg', -"o" = 'sound/vox_fem/o.ogg', -"objective" = 'sound/vox_fem/objective.ogg', -"obliterate" = 'sound/vox_fem/obliterate.ogg', -"obliterated" = 'sound/vox_fem/obliterated.ogg', -"obliterating" = 'sound/vox_fem/obliterating.ogg', -"observation" = 'sound/vox_fem/observation.ogg', -"obtain" = 'sound/vox_fem/obtain.ogg', -"of" = 'sound/vox_fem/of.ogg', -"off" = 'sound/vox_fem/off.ogg', -"office" = 'sound/vox_fem/office.ogg', -"officer" = 'sound/vox_fem/officer.ogg', -"oh" = 'sound/vox_fem/oh.ogg', -"ok" = 'sound/vox_fem/ok.ogg', -"okay" = 'sound/vox_fem/okay.ogg', -"on" = 'sound/vox_fem/on.ogg', -"once" = 'sound/vox_fem/once.ogg', -"one" = 'sound/vox_fem/one.ogg', -"oof" = 'sound/vox_fem/oof.ogg', -"open" = 'sound/vox_fem/open.ogg', -"opened" = 'sound/vox_fem/opened.ogg', -"opening" = 'sound/vox_fem/opening.ogg', -"operating" = 'sound/vox_fem/operating.ogg', -"operations" = 'sound/vox_fem/operations.ogg', -"operative" = 'sound/vox_fem/operative.ogg', -"option" = 'sound/vox_fem/option.ogg', -"or" = 'sound/vox_fem/or.ogg', -"order" = 'sound/vox_fem/order.ogg', -"organic" = 'sound/vox_fem/organic.ogg', -"oscar" = 'sound/vox_fem/oscar.ogg', -"out" = 'sound/vox_fem/out.ogg', -"outside" = 'sound/vox_fem/outside.ogg', -"over" = 'sound/vox_fem/over.ogg', -"overload" = 'sound/vox_fem/overload.ogg', -"override" = 'sound/vox_fem/override.ogg', -"oxygen" = 'sound/vox_fem/oxygen.ogg', -"p" = 'sound/vox_fem/p.ogg', -"pacification" = 'sound/vox_fem/pacification.ogg', -"pacify" = 'sound/vox_fem/pacify.ogg', -"pain" = 'sound/vox_fem/pain.ogg', -"pal" = 'sound/vox_fem/pal.ogg', -"panel" = 'sound/vox_fem/panel.ogg', -"panting" = 'sound/vox_fem/panting.ogg', -"pathetic" = 'sound/vox_fem/pathetic.ogg', -"percent" = 'sound/vox_fem/percent.ogg', -"perfect" = 'sound/vox_fem/perfect.ogg', -"perhaps" = 'sound/vox_fem/perhaps.ogg', -"perimeter" = 'sound/vox_fem/perimeter.ogg', -"permitted" = 'sound/vox_fem/permitted.ogg', -"personal" = 'sound/vox_fem/personal.ogg', -"personnel" = 'sound/vox_fem/personnel.ogg', -"pipe" = 'sound/vox_fem/pipe.ogg', -"piping" = 'sound/vox_fem/piping.ogg', -"piss" = 'sound/vox_fem/piss.ogg', -"plant" = 'sound/vox_fem/plant.ogg', -"plasma" = 'sound/vox_fem/plasma.ogg', -"plasmaman" = 'sound/vox_fem/plasmaman.ogg', -"platform" = 'sound/vox_fem/platform.ogg', -"plausible" = 'sound/vox_fem/plausible.ogg', -"please" = 'sound/vox_fem/please.ogg', -"point" = 'sound/vox_fem/point.ogg', -"port" = 'sound/vox_fem/port.ogg', -"portal" = 'sound/vox_fem/portal.ogg', -"possible" = 'sound/vox_fem/possible.ogg', -"power" = 'sound/vox_fem/power.ogg', -"presence" = 'sound/vox_fem/presence.ogg', -"present" = 'sound/vox_fem/present.ogg', -"presents" = 'sound/vox_fem/presents.ogg', -"press" = 'sound/vox_fem/press.ogg', -"pressure" = 'sound/vox_fem/pressure.ogg', -"primary" = 'sound/vox_fem/primary.ogg', -"prison" = 'sound/vox_fem/prison.ogg', -"prisoner" = 'sound/vox_fem/prisoner.ogg', -"proceed" = 'sound/vox_fem/proceed.ogg', -"processing" = 'sound/vox_fem/processing.ogg', -"progress" = 'sound/vox_fem/progress.ogg', -"proper" = 'sound/vox_fem/proper.ogg', -"propulsion" = 'sound/vox_fem/propulsion.ogg', -"prosecute" = 'sound/vox_fem/prosecute.ogg', -"protective" = 'sound/vox_fem/protective.ogg', -"push" = 'sound/vox_fem/push.ogg', -"put" = 'sound/vox_fem/put.ogg', -"q" = 'sound/vox_fem/q.ogg', -"quantum" = 'sound/vox_fem/quantum.ogg', -"quarantine" = 'sound/vox_fem/quarantine.ogg', -"quartermaster" = 'sound/vox_fem/quartermaster.ogg', -"quebec" = 'sound/vox_fem/quebec.ogg', -"queen" = 'sound/vox_fem/queen.ogg', -"question" = 'sound/vox_fem/question.ogg', -"questionable" = 'sound/vox_fem/questionable.ogg', -"questioning" = 'sound/vox_fem/questioning.ogg', -"quick" = 'sound/vox_fem/quick.ogg', -"quit" = 'sound/vox_fem/quit.ogg', -"r" = 'sound/vox_fem/r.ogg', -"radiation" = 'sound/vox_fem/radiation.ogg', -"radioactive" = 'sound/vox_fem/radioactive.ogg', -"rads" = 'sound/vox_fem/rads.ogg', -"raider" = 'sound/vox_fem/raider.ogg', -"raiders" = 'sound/vox_fem/raiders.ogg', -"rapid" = 'sound/vox_fem/rapid.ogg', -"reach" = 'sound/vox_fem/reach.ogg', -"reached" = 'sound/vox_fem/reached.ogg', -"reactor" = 'sound/vox_fem/reactor.ogg', -"red" = 'sound/vox_fem/red.ogg', -"relay" = 'sound/vox_fem/relay.ogg', -"released" = 'sound/vox_fem/released.ogg', -"remaining" = 'sound/vox_fem/remaining.ogg', -"removal" = 'sound/vox_fem/removal.ogg', -"renegade" = 'sound/vox_fem/renegade.ogg', -"repair" = 'sound/vox_fem/repair.ogg', -"report" = 'sound/vox_fem/report.ogg', -"reports" = 'sound/vox_fem/reports.ogg', -"request" = 'sound/vox_fem/request.ogg', -"requested" = 'sound/vox_fem/requested.ogg', -"requesting" = 'sound/vox_fem/requesting.ogg', -"require" = 'sound/vox_fem/require.ogg', -"required" = 'sound/vox_fem/required.ogg', -"research" = 'sound/vox_fem/research.ogg', -"resevoir" = 'sound/vox_fem/resevoir.ogg', -"resistance" = 'sound/vox_fem/resistance.ogg', -"rest" = 'sound/vox_fem/rest.ogg', -"restoration" = 'sound/vox_fem/restoration.ogg', -"revolution" = 'sound/vox_fem/revolution.ogg', -"revolutionary" = 'sound/vox_fem/revolutionary.ogg', -"right" = 'sound/vox_fem/right.ogg', -"riot" = 'sound/vox_fem/riot.ogg', -"roboticist" = 'sound/vox_fem/roboticist.ogg', -"rocket" = 'sound/vox_fem/rocket.ogg', -"roger" = 'sound/vox_fem/roger.ogg', -"rogue" = 'sound/vox_fem/rogue.ogg', -"romeo" = 'sound/vox_fem/romeo.ogg', -"room" = 'sound/vox_fem/room.ogg', -"round" = 'sound/vox_fem/round.ogg', -"run" = 'sound/vox_fem/run.ogg', -"rune" = 'sound/vox_fem/rune.ogg', -"runtime" = 'sound/vox_fem/runtime.ogg', -"s" = 'sound/vox_fem/s.ogg', -"sabotage" = 'sound/vox_fem/sabotage.ogg', -"safe" = 'sound/vox_fem/safe.ogg', -"safety" = 'sound/vox_fem/safety.ogg', -"sairhorn" = 'sound/vox_fem/sairhorn.ogg', -"sarah" = 'sound/vox_fem/sarah.ogg', -"sargeant" = 'sound/vox_fem/sargeant.ogg', -"satellite" = 'sound/vox_fem/satellite.ogg', -"save" = 'sound/vox_fem/save.ogg', -"scensor" = 'sound/vox_fem/scensor.ogg', -"science" = 'sound/vox_fem/science.ogg', -"scientist" = 'sound/vox_fem/scientist.ogg', -"scream" = 'sound/vox_fem/scream.ogg', -"screen" = 'sound/vox_fem/screen.ogg', -"search" = 'sound/vox_fem/search.ogg', -"second" = 'sound/vox_fem/second.ogg', -"secondary" = 'sound/vox_fem/secondary.ogg', -"seconds" = 'sound/vox_fem/seconds.ogg', -"section" = 'sound/vox_fem/section.ogg', -"sector" = 'sound/vox_fem/sector.ogg', -"secure" = 'sound/vox_fem/secure.ogg', -"secured" = 'sound/vox_fem/secured.ogg', -"security" = 'sound/vox_fem/security.ogg', -"select" = 'sound/vox_fem/select.ogg', -"selected" = 'sound/vox_fem/selected.ogg', -"self" = 'sound/vox_fem/self.ogg', -"sensors" = 'sound/vox_fem/sensors.ogg', -"server" = 'sound/vox_fem/server.ogg', -"service" = 'sound/vox_fem/service.ogg', -"seven" = 'sound/vox_fem/seven.ogg', -"seventeen" = 'sound/vox_fem/seventeen.ogg', -"seventy" = 'sound/vox_fem/seventy.ogg', -"severe" = 'sound/vox_fem/severe.ogg', -"sewage" = 'sound/vox_fem/sewage.ogg', -"sewer" = 'sound/vox_fem/sewer.ogg', -"shaft" = 'sound/vox_fem/shaft.ogg', -"she" = 'sound/vox_fem/she.ogg', -"shield" = 'sound/vox_fem/shield.ogg', -"shipment" = 'sound/vox_fem/shipment.ogg', -"shirt" = 'sound/vox_fem/shirt.ogg', -"shit" = 'sound/vox_fem/shit.ogg', -"shitlord" = 'sound/vox_fem/shitlord.ogg', -"shits" = 'sound/vox_fem/shits.ogg', -"shitting" = 'sound/vox_fem/shitting.ogg', -"shock" = 'sound/vox_fem/shock.ogg', -"shonk" = 'sound/vox_fem/shonk.ogg', -"shoot" = 'sound/vox_fem/shoot.ogg', -"shower" = 'sound/vox_fem/shower.ogg', -"shut" = 'sound/vox_fem/shut.ogg', -"shuttle" = 'sound/vox_fem/shuttle.ogg', -"sick" = 'sound/vox_fem/sick.ogg', -"side" = 'sound/vox_fem/side.ogg', -"sierra" = 'sound/vox_fem/sierra.ogg', -"sight" = 'sound/vox_fem/sight.ogg', -"silicon" = 'sound/vox_fem/silicon.ogg', -"silo" = 'sound/vox_fem/silo.ogg', -"singularity" = 'sound/vox_fem/singularity.ogg', -"six" = 'sound/vox_fem/six.ogg', -"sixteen" = 'sound/vox_fem/sixteen.ogg', -"sixty" = 'sound/vox_fem/sixty.ogg', -"skeleton" = 'sound/vox_fem/skeleton.ogg', -"slaughter" = 'sound/vox_fem/slaughter.ogg', -"slime" = 'sound/vox_fem/slime.ogg', -"slip" = 'sound/vox_fem/slip.ogg', -"slippery" = 'sound/vox_fem/slippery.ogg', -"slow" = 'sound/vox_fem/slow.ogg', -"sm" = 'sound/vox_fem/sm.ogg', -"small" = 'sound/vox_fem/small.ogg', -"sockmuncher" = 'sound/vox_fem/sockmuncher.ogg', -"solar" = 'sound/vox_fem/solar.ogg', -"solars" = 'sound/vox_fem/solars.ogg', -"soldier" = 'sound/vox_fem/soldier.ogg', -"some" = 'sound/vox_fem/some.ogg', -"someone" = 'sound/vox_fem/someone.ogg', -"something" = 'sound/vox_fem/something.ogg', -"son" = 'sound/vox_fem/son.ogg', -"sorry" = 'sound/vox_fem/sorry.ogg', -"south" = 'sound/vox_fem/south.ogg', -"southeast" = 'sound/vox_fem/southeast.ogg', -"southwest" = 'sound/vox_fem/southwest.ogg', -"space" = 'sound/vox_fem/space.ogg', -"squad" = 'sound/vox_fem/squad.ogg', -"square" = 'sound/vox_fem/square.ogg', -"ss13" = 'sound/vox_fem/ss13.ogg', -"stairway" = 'sound/vox_fem/stairway.ogg', -"starboard" = 'sound/vox_fem/starboard.ogg', -"station" = 'sound/vox_fem/station.ogg', -"status" = 'sound/vox_fem/status.ogg', -"stay" = 'sound/vox_fem/stay.ogg', -"sterile" = 'sound/vox_fem/sterile.ogg', -"sterilization" = 'sound/vox_fem/sterilization.ogg', -"stop" = 'sound/vox_fem/stop.ogg', -"storage" = 'sound/vox_fem/storage.ogg', -"strong" = 'sound/vox_fem/strong.ogg', -"stuck" = 'sound/vox_fem/stuck.ogg', -"sub" = 'sound/vox_fem/sub.ogg', -"subsurface" = 'sound/vox_fem/subsurface.ogg', -"sudden" = 'sound/vox_fem/sudden.ogg', -"suffer" = 'sound/vox_fem/suffer.ogg', -"suit" = 'sound/vox_fem/suit.ogg', -"superconducting" = 'sound/vox_fem/superconducting.ogg', -"supercooled" = 'sound/vox_fem/supercooled.ogg', -"supermatter" = 'sound/vox_fem/supermatter.ogg', -"supply" = 'sound/vox_fem/supply.ogg', -"surface" = 'sound/vox_fem/surface.ogg', -"surrender" = 'sound/vox_fem/surrender.ogg', -"surround" = 'sound/vox_fem/surround.ogg', -"surrounded" = 'sound/vox_fem/surrounded.ogg', -"sweating" = 'sound/vox_fem/sweating.ogg', -"swhitenoise" = 'sound/vox_fem/swhitenoise.ogg', -"switch" = 'sound/vox_fem/switch.ogg', -"syndicate" = 'sound/vox_fem/syndicate.ogg', -"system" = 'sound/vox_fem/system.ogg', -"systems" = 'sound/vox_fem/systems.ogg', -"t" = 'sound/vox_fem/t.ogg', -"table" = 'sound/vox_fem/table.ogg', -"tactical" = 'sound/vox_fem/tactical.ogg', -"taildragger" = 'sound/vox_fem/taildragger.ogg', -"take" = 'sound/vox_fem/take.ogg', -"talk" = 'sound/vox_fem/talk.ogg', -"tampered" = 'sound/vox_fem/tampered.ogg', -"tango" = 'sound/vox_fem/tango.ogg', -"tank" = 'sound/vox_fem/tank.ogg', -"target" = 'sound/vox_fem/target.ogg', -"team" = 'sound/vox_fem/team.ogg', -"tech" = 'sound/vox_fem/tech.ogg', -"technician" = 'sound/vox_fem/technician.ogg', -"technology" = 'sound/vox_fem/technology.ogg', -"teleporter" = 'sound/vox_fem/teleporter.ogg', -"temperature" = 'sound/vox_fem/temperature.ogg', -"temporal" = 'sound/vox_fem/temporal.ogg', -"ten" = 'sound/vox_fem/ten.ogg', -"terminal" = 'sound/vox_fem/terminal.ogg', -"terminate" = 'sound/vox_fem/terminate.ogg', -"terminated" = 'sound/vox_fem/terminated.ogg', -"termination" = 'sound/vox_fem/termination.ogg', -"test" = 'sound/vox_fem/test.ogg', -"text" = 'sound/vox_fem/text.ogg', -"thank" = 'sound/vox_fem/thank.ogg', -"thanks" = 'sound/vox_fem/thanks.ogg', -"that" = 'sound/vox_fem/that.ogg', -"the" = 'sound/vox_fem/the.ogg', -"theater" = 'sound/vox_fem/theater.ogg', -"them" = 'sound/vox_fem/them.ogg', -"then" = 'sound/vox_fem/then.ogg', -"there" = 'sound/vox_fem/there.ogg', -"they" = 'sound/vox_fem/they.ogg', -"third" = 'sound/vox_fem/third.ogg', -"thirteen" = 'sound/vox_fem/thirteen.ogg', -"thirty" = 'sound/vox_fem/thirty.ogg', -"this" = 'sound/vox_fem/this.ogg', -"those" = 'sound/vox_fem/those.ogg', -"thousand" = 'sound/vox_fem/thousand.ogg', -"threat" = 'sound/vox_fem/threat.ogg', -"three" = 'sound/vox_fem/three.ogg', -"through" = 'sound/vox_fem/through.ogg', -"tide" = 'sound/vox_fem/tide.ogg', -"time" = 'sound/vox_fem/time.ogg', -"tiny" = 'sound/vox_fem/tiny.ogg', -"to" = 'sound/vox_fem/to.ogg', -"top" = 'sound/vox_fem/top.ogg', -"topside" = 'sound/vox_fem/topside.ogg', -"touch" = 'sound/vox_fem/touch.ogg', -"towards" = 'sound/vox_fem/towards.ogg', -"toxins" = 'sound/vox_fem/toxins.ogg', -"track" = 'sound/vox_fem/track.ogg', -"train" = 'sound/vox_fem/train.ogg', -"traitor" = 'sound/vox_fem/traitor.ogg', -"transportation" = 'sound/vox_fem/transportation.ogg', -"truck" = 'sound/vox_fem/truck.ogg', -"true" = 'sound/vox_fem/true.ogg', -"tunnel" = 'sound/vox_fem/tunnel.ogg', -"turn" = 'sound/vox_fem/turn.ogg', -"turret" = 'sound/vox_fem/turret.ogg', -"twelve" = 'sound/vox_fem/twelve.ogg', -"twenty" = 'sound/vox_fem/twenty.ogg', -"two" = 'sound/vox_fem/two.ogg', -"u" = 'sound/vox_fem/u.ogg', -"ugh" = 'sound/vox_fem/ugh.ogg', -"ughh" = 'sound/vox_fem/ughh.ogg', -"unable" = 'sound/vox_fem/unable.ogg', -"unauthorized" = 'sound/vox_fem/unauthorized.ogg', -"under" = 'sound/vox_fem/under.ogg', -"uniform" = 'sound/vox_fem/uniform.ogg', -"unknown" = 'sound/vox_fem/unknown.ogg', -"unlocked" = 'sound/vox_fem/unlocked.ogg', -"unsafe" = 'sound/vox_fem/unsafe.ogg', -"until" = 'sound/vox_fem/until.ogg', -"up" = 'sound/vox_fem/up.ogg', -"update" = 'sound/vox_fem/update.ogg', -"updated" = 'sound/vox_fem/updated.ogg', -"updating" = 'sound/vox_fem/updating.ogg', -"upload" = 'sound/vox_fem/upload.ogg', -"upper" = 'sound/vox_fem/upper.ogg', -"uranium" = 'sound/vox_fem/uranium.ogg', -"us" = 'sound/vox_fem/us.ogg', -"usa" = 'sound/vox_fem/usa.ogg', -"use" = 'sound/vox_fem/use.ogg', -"used" = 'sound/vox_fem/used.ogg', -"user" = 'sound/vox_fem/user.ogg', -"v" = 'sound/vox_fem/v.ogg', -"vacate" = 'sound/vox_fem/vacate.ogg', -"vacuum" = 'sound/vox_fem/vacuum.ogg', -"valid" = 'sound/vox_fem/valid.ogg', -"validate" = 'sound/vox_fem/validate.ogg', -"vapor" = 'sound/vox_fem/vapor.ogg', -"vendor" = 'sound/vox_fem/vendor.ogg', -"vent" = 'sound/vox_fem/vent.ogg', -"ventilation" = 'sound/vox_fem/ventilation.ogg', -"very" = 'sound/vox_fem/very.ogg', -"victor" = 'sound/vox_fem/victor.ogg', -"violated" = 'sound/vox_fem/violated.ogg', -"violation" = 'sound/vox_fem/violation.ogg', -"virologist" = 'sound/vox_fem/virologist.ogg', -"virology" = 'sound/vox_fem/virology.ogg', -"virus" = 'sound/vox_fem/virus.ogg', -"vitals" = 'sound/vox_fem/vitals.ogg', -"voltage" = 'sound/vox_fem/voltage.ogg', -"vox" = 'sound/vox_fem/vox.ogg', -"vox_login" = 'sound/vox_fem/vox_login.ogg', -"voxtest" = 'sound/vox_fem/voxtest.ogg', -"w" = 'sound/vox_fem/w.ogg', -"walk" = 'sound/vox_fem/walk.ogg', -"wall" = 'sound/vox_fem/wall.ogg', -"wanker" = 'sound/vox_fem/wanker.ogg', -"want" = 'sound/vox_fem/want.ogg', -"wanted" = 'sound/vox_fem/wanted.ogg', -"warden" = 'sound/vox_fem/warden.ogg', -"warm" = 'sound/vox_fem/warm.ogg', -"warn" = 'sound/vox_fem/warn.ogg', -"warning" = 'sound/vox_fem/warning.ogg', -"was" = 'sound/vox_fem/was.ogg', -"waste" = 'sound/vox_fem/waste.ogg', -"water" = 'sound/vox_fem/water.ogg', -"we" = 'sound/vox_fem/we.ogg', -"weak" = 'sound/vox_fem/weak.ogg', -"weapon" = 'sound/vox_fem/weapon.ogg', -"welcome" = 'sound/vox_fem/welcome.ogg', -"west" = 'sound/vox_fem/west.ogg', -"wew" = 'sound/vox_fem/wew.ogg', -"what" = 'sound/vox_fem/what.ogg', -"when" = 'sound/vox_fem/when.ogg', -"where" = 'sound/vox_fem/where.ogg', -"while" = 'sound/vox_fem/while.ogg', -"whiskey" = 'sound/vox_fem/whiskey.ogg', -"white" = 'sound/vox_fem/white.ogg', -"why" = 'sound/vox_fem/why.ogg', -"wilco" = 'sound/vox_fem/wilco.ogg', -"will" = 'sound/vox_fem/will.ogg', -"wing" = 'sound/vox_fem/wing.ogg', -"wire" = 'sound/vox_fem/wire.ogg', -"with" = 'sound/vox_fem/with.ogg', -"without" = 'sound/vox_fem/without.ogg', -"wizard" = 'sound/vox_fem/wizard.ogg', -"wood" = 'sound/vox_fem/wood.ogg', -"woody" = 'sound/vox_fem/woody.ogg', -"woop" = 'sound/vox_fem/woop.ogg', -"wow" = 'sound/vox_fem/wow.ogg', -"x" = 'sound/vox_fem/x.ogg', -"xeno" = 'sound/vox_fem/xeno.ogg', -"xenobiology" = 'sound/vox_fem/xenobiology.ogg', -"xenomorph" = 'sound/vox_fem/xenomorph.ogg', -"xenomorphs" = 'sound/vox_fem/xenomorphs.ogg', -"y" = 'sound/vox_fem/y.ogg', -"yankee" = 'sound/vox_fem/yankee.ogg', -"yards" = 'sound/vox_fem/yards.ogg', -"year" = 'sound/vox_fem/year.ogg', -"yellow" = 'sound/vox_fem/yellow.ogg', -"yes" = 'sound/vox_fem/yes.ogg', -"you" = 'sound/vox_fem/you.ogg', -"your" = 'sound/vox_fem/your.ogg', -"yourself" = 'sound/vox_fem/yourself.ogg', -"z" = 'sound/vox_fem/z.ogg', -"zero" = 'sound/vox_fem/zero.ogg', -"zombie" = 'sound/vox_fem/zombie.ogg', -"zone" = 'sound/vox_fem/zone.ogg', -"zulu" = 'sound/vox_fem/zulu.ogg', +GLOBAL_LIST_INIT(vox_sounds, list( + "abduction" = 'sound/vox_fem/abduction.ogg', + "," = 'sound/vox_fem/,.ogg', + "." = 'sound/vox_fem/..ogg', + "a" = 'sound/vox_fem/a.ogg', + "abortions" = 'sound/vox_fem/abortions.ogg', + "above" = 'sound/vox_fem/above.ogg', + "abstain" = 'sound/vox_fem/abstain.ogg', + "accelerating" = 'sound/vox_fem/accelerating.ogg', + "accelerator" = 'sound/vox_fem/accelerator.ogg', + "accepted" = 'sound/vox_fem/accepted.ogg', + "access" = 'sound/vox_fem/access.ogg', + "acknowledge" = 'sound/vox_fem/acknowledge.ogg', + "acknowledged" = 'sound/vox_fem/acknowledged.ogg', + "acquired" = 'sound/vox_fem/acquired.ogg', + "acquisition" = 'sound/vox_fem/acquisition.ogg', + "across" = 'sound/vox_fem/across.ogg', + "activate" = 'sound/vox_fem/activate.ogg', + "activated" = 'sound/vox_fem/activated.ogg', + "activity" = 'sound/vox_fem/activity.ogg', + "adios" = 'sound/vox_fem/adios.ogg', + "administration" = 'sound/vox_fem/administration.ogg', + "advanced" = 'sound/vox_fem/advanced.ogg', + "advised" = 'sound/vox_fem/advised.ogg', + "aft" = 'sound/vox_fem/aft.ogg', + "after" = 'sound/vox_fem/after.ogg', + "agent" = 'sound/vox_fem/agent.ogg', + "ai" = 'sound/vox_fem/ai.ogg', + "air" = 'sound/vox_fem/air.ogg', + "airlock" = 'sound/vox_fem/airlock.ogg', + "alarm" = 'sound/vox_fem/alarm.ogg', + "alarmed" = 'sound/vox_fem/alarmed.ogg', + "alarming" = 'sound/vox_fem/alarming.ogg', + "alert" = 'sound/vox_fem/alert.ogg', + "alerted" = 'sound/vox_fem/alerted.ogg', + "alerting" = 'sound/vox_fem/alerting.ogg', + "alien" = 'sound/vox_fem/alien.ogg', + "aligned" = 'sound/vox_fem/aligned.ogg', + "all" = 'sound/vox_fem/all.ogg', + "alpha" = 'sound/vox_fem/alpha.ogg', + "also" = 'sound/vox_fem/also.ogg', + "am" = 'sound/vox_fem/am.ogg', + "amigo" = 'sound/vox_fem/amigo.ogg', + "ammunition" = 'sound/vox_fem/ammunition.ogg', + "an" = 'sound/vox_fem/an.ogg', + "and" = 'sound/vox_fem/and.ogg', + "animal" = 'sound/vox_fem/animal.ogg', + "announcement" = 'sound/vox_fem/announcement.ogg', + "anomalous" = 'sound/vox_fem/anomalous.ogg', + "answer" = 'sound/vox_fem/answer.ogg', + "antenna" = 'sound/vox_fem/antenna.ogg', + "any" = 'sound/vox_fem/any.ogg', + "apc" = 'sound/vox_fem/apc.ogg', + "apprehend" = 'sound/vox_fem/apprehend.ogg', + "approach" = 'sound/vox_fem/approach.ogg', + "are" = 'sound/vox_fem/are.ogg', + "area" = 'sound/vox_fem/area.ogg', + "arm" = 'sound/vox_fem/arm.ogg', + "armed" = 'sound/vox_fem/armed.ogg', + "armor" = 'sound/vox_fem/armor.ogg', + "armory" = 'sound/vox_fem/armory.ogg', + "array" = 'sound/vox_fem/array.ogg', + "arrest" = 'sound/vox_fem/arrest.ogg', + "artillery" = 'sound/vox_fem/artillery.ogg', + "asimov" = 'sound/vox_fem/asimov.ogg', + "ass" = 'sound/vox_fem/ass.ogg', + "asshole" = 'sound/vox_fem/asshole.ogg', + "assholes" = 'sound/vox_fem/assholes.ogg', + "assistance" = 'sound/vox_fem/assistance.ogg', + "assistant" = 'sound/vox_fem/assistant.ogg', + "at" = 'sound/vox_fem/at.ogg', + "atmosphere" = 'sound/vox_fem/atmosphere.ogg', + "atmospheric" = 'sound/vox_fem/atmospheric.ogg', + "atmospherics" = 'sound/vox_fem/atmospherics.ogg', + "atomic" = 'sound/vox_fem/atomic.ogg', + "attention" = 'sound/vox_fem/attention.ogg', + "authentication" = 'sound/vox_fem/authentication.ogg', + "authorize" = 'sound/vox_fem/authorize.ogg', + "authorized" = 'sound/vox_fem/authorized.ogg', + "automatic" = 'sound/vox_fem/automatic.ogg', + "away" = 'sound/vox_fem/away.ogg', + "awful" = 'sound/vox_fem/awful.ogg', + "b" = 'sound/vox_fem/b.ogg', + "back" = 'sound/vox_fem/back.ogg', + "backman" = 'sound/vox_fem/backman.ogg', + "bad" = 'sound/vox_fem/bad.ogg', + "bag" = 'sound/vox_fem/bag.ogg', + "bailey" = 'sound/vox_fem/bailey.ogg', + "bar" = 'sound/vox_fem/bar.ogg', + "barracks" = 'sound/vox_fem/barracks.ogg', + "bartender" = 'sound/vox_fem/bartender.ogg', + "base" = 'sound/vox_fem/base.ogg', + "bay" = 'sound/vox_fem/bay.ogg', + "be" = 'sound/vox_fem/be.ogg', + "beam" = 'sound/vox_fem/beam.ogg', + "been" = 'sound/vox_fem/been.ogg', + "beep" = 'sound/vox_fem/beep.ogg', + "before" = 'sound/vox_fem/before.ogg', + "below" = 'sound/vox_fem/below.ogg', + "beside" = 'sound/vox_fem/beside.ogg', + "beware" = 'sound/vox_fem/beware.ogg', + "beyond" = 'sound/vox_fem/beyond.ogg', + "big" = 'sound/vox_fem/big.ogg', + "billion" = 'sound/vox_fem/billion.ogg', + "biohazard" = 'sound/vox_fem/biohazard.ogg', + "biological" = 'sound/vox_fem/biological.ogg', + "birdwell" = 'sound/vox_fem/birdwell.ogg', + "bitch" = 'sound/vox_fem/bitch.ogg', + "bitches" = 'sound/vox_fem/bitches.ogg', + "bitcoin" = 'sound/vox_fem/bitcoin.ogg', + "bitrun" = 'sound/vox_fem/bitrun.ogg', + "bitrunner" = 'sound/vox_fem/bitrunner.ogg', + "bitrunning" = 'sound/vox_fem/bitrunning.ogg', + "black" = 'sound/vox_fem/black.ogg', + "blast" = 'sound/vox_fem/blast.ogg', + "bleed" = 'sound/vox_fem/bleed.ogg', + "blob" = 'sound/vox_fem/blob.ogg', + "blocked" = 'sound/vox_fem/blocked.ogg', + "blood" = 'sound/vox_fem/blood.ogg', + "bloop" = 'sound/vox_fem/bloop.ogg', + "blue" = 'sound/vox_fem/blue.ogg', + "bluespace" = 'sound/vox_fem/bluespace.ogg', + "bomb" = 'sound/vox_fem/bomb.ogg', + "bone" = 'sound/vox_fem/bone.ogg', + "botanist" = 'sound/vox_fem/botanist.ogg', + "botany" = 'sound/vox_fem/botany.ogg', + "bottom" = 'sound/vox_fem/bottom.ogg', + "bravo" = 'sound/vox_fem/bravo.ogg', + "breach" = 'sound/vox_fem/breach.ogg', + "breached" = 'sound/vox_fem/breached.ogg', + "break" = 'sound/vox_fem/break.ogg', + "bridge" = 'sound/vox_fem/bridge.ogg', + "brig" = 'sound/vox_fem/brig.ogg', + "bust" = 'sound/vox_fem/bust.ogg', + "but" = 'sound/vox_fem/but.ogg', + "button" = 'sound/vox_fem/button.ogg', + "bypass" = 'sound/vox_fem/bypass.ogg', + "c" = 'sound/vox_fem/c.ogg', + "cable" = 'sound/vox_fem/cable.ogg', + "call" = 'sound/vox_fem/call.ogg', + "called" = 'sound/vox_fem/called.ogg', + "canal" = 'sound/vox_fem/canal.ogg', + "canister" = 'sound/vox_fem/canister.ogg', + "cap" = 'sound/vox_fem/cap.ogg', + "captain" = 'sound/vox_fem/captain.ogg', + "capture" = 'sound/vox_fem/capture.ogg', + "carbon" = 'sound/vox_fem/carbon.ogg', + "cargo" = 'sound/vox_fem/cargo.ogg', + "cat" = 'sound/vox_fem/cat.ogg', + "ce" = 'sound/vox_fem/ce.ogg', + "cease" = 'sound/vox_fem/cease.ogg', + "ceiling" = 'sound/vox_fem/ceiling.ogg', + "celsius" = 'sound/vox_fem/celsius.ogg', + "centcom" = 'sound/vox_fem/centcom.ogg', + "center" = 'sound/vox_fem/center.ogg', + "centi" = 'sound/vox_fem/centi.ogg', + "central" = 'sound/vox_fem/central.ogg', + "challenge" = 'sound/vox_fem/challenge.ogg', + "chamber" = 'sound/vox_fem/chamber.ogg', + "change" = 'sound/vox_fem/change.ogg', + "changed" = 'sound/vox_fem/changed.ogg', + "changeling" = 'sound/vox_fem/changeling.ogg', + "chapel" = 'sound/vox_fem/chapel.ogg', + "chaplain" = 'sound/vox_fem/chaplain.ogg', + "charlie" = 'sound/vox_fem/charlie.ogg', + "check" = 'sound/vox_fem/check.ogg', + "checkpoint" = 'sound/vox_fem/checkpoint.ogg', + "chemical" = 'sound/vox_fem/chemical.ogg', + "chemist" = 'sound/vox_fem/chemist.ogg', + "chief" = 'sound/vox_fem/chief.ogg', + "christ" = 'sound/vox_fem/christ.ogg', + "christmas" = 'sound/vox_fem/christmas.ogg', + "chuckle" = 'sound/vox_fem/chuckle.ogg', + "circuit" = 'sound/vox_fem/circuit.ogg', + "cleanup" = 'sound/vox_fem/cleanup.ogg', + "clear" = 'sound/vox_fem/clear.ogg', + "clearance" = 'sound/vox_fem/clearance.ogg', + "clockwork" = 'sound/vox_fem/clockwork.ogg', + "close" = 'sound/vox_fem/close.ogg', + "closed" = 'sound/vox_fem/closed.ogg', + "closing" = 'sound/vox_fem/closing.ogg', + "clown" = 'sound/vox_fem/clown.ogg', + "clowning" = 'sound/vox_fem/clowning.ogg', + "cmo" = 'sound/vox_fem/cmo.ogg', + "code" = 'sound/vox_fem/code.ogg', + "coded" = 'sound/vox_fem/coded.ogg', + "cold" = 'sound/vox_fem/cold.ogg', + "collider" = 'sound/vox_fem/collider.ogg', + "come" = 'sound/vox_fem/come.ogg', + "command" = 'sound/vox_fem/command.ogg', + "communication" = 'sound/vox_fem/communication.ogg', + "complex" = 'sound/vox_fem/complex.ogg', + "comply" = 'sound/vox_fem/comply.ogg', + "computer" = 'sound/vox_fem/computer.ogg', + "condition" = 'sound/vox_fem/condition.ogg', + "condom" = 'sound/vox_fem/condom.ogg', + "confirmed" = 'sound/vox_fem/confirmed.ogg', + "connor" = 'sound/vox_fem/connor.ogg', + "console" = 'sound/vox_fem/console.ogg', + "console2" = 'sound/vox_fem/console2.ogg', + "construct" = 'sound/vox_fem/construct.ogg', + "containment" = 'sound/vox_fem/containment.ogg', + "contamination" = 'sound/vox_fem/contamination.ogg', + "contraband" = 'sound/vox_fem/contraband.ogg', + "control" = 'sound/vox_fem/control.ogg', + "cook" = 'sound/vox_fem/cook.ogg', + "coolant" = 'sound/vox_fem/coolant.ogg', + "coomer" = 'sound/vox_fem/coomer.ogg', + "core" = 'sound/vox_fem/core.ogg', + "corgi" = 'sound/vox_fem/corgi.ogg', + "corporation" = 'sound/vox_fem/corporation.ogg', + "correct" = 'sound/vox_fem/correct.ogg', + "corridor" = 'sound/vox_fem/corridor.ogg', + "corridors" = 'sound/vox_fem/corridors.ogg', + "coward" = 'sound/vox_fem/coward.ogg', + "cowards" = 'sound/vox_fem/cowards.ogg', + "crate" = 'sound/vox_fem/crate.ogg', + "created" = 'sound/vox_fem/created.ogg', + "creature" = 'sound/vox_fem/creature.ogg', + "crew" = 'sound/vox_fem/crew.ogg', + "critical" = 'sound/vox_fem/critical.ogg', + "cross" = 'sound/vox_fem/cross.ogg', + "cryogenic" = 'sound/vox_fem/cryogenic.ogg', + "crystal" = 'sound/vox_fem/crystal.ogg', + "cult" = 'sound/vox_fem/cult.ogg', + "cultist" = 'sound/vox_fem/cultist.ogg', + "cunt" = 'sound/vox_fem/cunt.ogg', + "curator" = 'sound/vox_fem/curator.ogg', + "cyborg" = 'sound/vox_fem/cyborg.ogg', + "cyborgs" = 'sound/vox_fem/cyborgs.ogg', + "d" = 'sound/vox_fem/d.ogg', + "damage" = 'sound/vox_fem/damage.ogg', + "damaged" = 'sound/vox_fem/damaged.ogg', + "danger" = 'sound/vox_fem/danger.ogg', + "dangerous" = 'sound/vox_fem/dangerous.ogg', + "day" = 'sound/vox_fem/day.ogg', + "deactivated" = 'sound/vox_fem/deactivated.ogg', + "dead" = 'sound/vox_fem/dead.ogg', + "death" = 'sound/vox_fem/death.ogg', + "decompression" = 'sound/vox_fem/decompression.ogg', + "decontamination" = 'sound/vox_fem/decontamination.ogg', + "deeoo" = 'sound/vox_fem/deeoo.ogg', + "defense" = 'sound/vox_fem/defense.ogg', + "degrees" = 'sound/vox_fem/degrees.ogg', + "delta" = 'sound/vox_fem/delta.ogg', + "demon" = 'sound/vox_fem/demon.ogg', + "denied" = 'sound/vox_fem/denied.ogg', + "departures" = 'sound/vox_fem/departures.ogg', + "deploy" = 'sound/vox_fem/deploy.ogg', + "deployed" = 'sound/vox_fem/deployed.ogg', + "desire" = 'sound/vox_fem/desire.ogg', + "desist" = 'sound/vox_fem/desist.ogg', + "destroy" = 'sound/vox_fem/destroy.ogg', + "destroyed" = 'sound/vox_fem/destroyed.ogg', + "destruction" = 'sound/vox_fem/destruction.ogg', + "detain" = 'sound/vox_fem/detain.ogg', + "detected" = 'sound/vox_fem/detected.ogg', + "detective" = 'sound/vox_fem/detective.ogg', + "detonation" = 'sound/vox_fem/detonation.ogg', + "device" = 'sound/vox_fem/device.ogg', + "devil" = 'sound/vox_fem/devil.ogg', + "did" = 'sound/vox_fem/did.ogg', + "die" = 'sound/vox_fem/die.ogg', + "died" = 'sound/vox_fem/died.ogg', + "dimensional" = 'sound/vox_fem/dimensional.ogg', + "dioxide" = 'sound/vox_fem/dioxide.ogg', + "director" = 'sound/vox_fem/director.ogg', + "dirt" = 'sound/vox_fem/dirt.ogg', + "disabled" = 'sound/vox_fem/disabled.ogg', + "disease" = 'sound/vox_fem/disease.ogg', + "disengaged" = 'sound/vox_fem/disengaged.ogg', + "dish" = 'sound/vox_fem/dish.ogg', + "disk" = 'sound/vox_fem/disk.ogg', + "disposal" = 'sound/vox_fem/disposal.ogg', + "distance" = 'sound/vox_fem/distance.ogg', + "distortion" = 'sound/vox_fem/distortion.ogg', + "do" = 'sound/vox_fem/do.ogg', + "doctor" = 'sound/vox_fem/doctor.ogg', + "dog" = 'sound/vox_fem/dog.ogg', + "doomsday" = 'sound/vox_fem/doomsday.ogg', + "doop" = 'sound/vox_fem/doop.ogg', + "door" = 'sound/vox_fem/door.ogg', + "dormitory" = 'sound/vox_fem/dormitory.ogg', + "dot" = 'sound/vox_fem/dot.ogg', + "down" = 'sound/vox_fem/down.ogg', + "drone" = 'sound/vox_fem/drone.ogg', + "dual" = 'sound/vox_fem/dual.ogg', + "duct" = 'sound/vox_fem/duct.ogg', + "e" = 'sound/vox_fem/e.ogg', + "east" = 'sound/vox_fem/east.ogg', + "echo" = 'sound/vox_fem/echo.ogg', + "ed" = 'sound/vox_fem/ed.ogg', + "effect" = 'sound/vox_fem/effect.ogg', + "egress" = 'sound/vox_fem/egress.ogg', + "eight" = 'sound/vox_fem/eight.ogg', + "eighteen" = 'sound/vox_fem/eighteen.ogg', + "eighty" = 'sound/vox_fem/eighty.ogg', + "electric" = 'sound/vox_fem/electric.ogg', + "electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', + "elevator" = 'sound/vox_fem/elevator.ogg', + "eleven" = 'sound/vox_fem/eleven.ogg', + "eliminate" = 'sound/vox_fem/eliminate.ogg', + "emergency" = 'sound/vox_fem/emergency.ogg', + "enabled" = 'sound/vox_fem/enabled.ogg', + "energy" = 'sound/vox_fem/energy.ogg', + "engage" = 'sound/vox_fem/engage.ogg', + "engaged" = 'sound/vox_fem/engaged.ogg', + "engine" = 'sound/vox_fem/engine.ogg', + "engineer" = 'sound/vox_fem/engineer.ogg', + "engineering" = 'sound/vox_fem/engineering.ogg', + "enormous" = 'sound/vox_fem/enormous.ogg', + "enter" = 'sound/vox_fem/enter.ogg', + "entity" = 'sound/vox_fem/entity.ogg', + "entry" = 'sound/vox_fem/entry.ogg', + "environment" = 'sound/vox_fem/environment.ogg', + "epic" = 'sound/vox_fem/epic.ogg', + "equipment" = 'sound/vox_fem/equipment.ogg', + "error" = 'sound/vox_fem/error.ogg', + "escape" = 'sound/vox_fem/escape.ogg', + "ethereal" = 'sound/vox_fem/ethereal.ogg', + "eva" = 'sound/vox_fem/eva.ogg', + "evacuate" = 'sound/vox_fem/evacuate.ogg', + "ever" = 'sound/vox_fem/ever.ogg', + "exchange" = 'sound/vox_fem/exchange.ogg', + "execute" = 'sound/vox_fem/execute.ogg', + "exit" = 'sound/vox_fem/exit.ogg', + "expect" = 'sound/vox_fem/expect.ogg', + "experiment" = 'sound/vox_fem/experiment.ogg', + "experimental" = 'sound/vox_fem/experimental.ogg', + "explode" = 'sound/vox_fem/explode.ogg', + "explosion" = 'sound/vox_fem/explosion.ogg', + "explosive" = 'sound/vox_fem/explosive.ogg', + "exposure" = 'sound/vox_fem/exposure.ogg', + "exterminate" = 'sound/vox_fem/exterminate.ogg', + "extinguish" = 'sound/vox_fem/extinguish.ogg', + "extinguisher" = 'sound/vox_fem/extinguisher.ogg', + "extreme" = 'sound/vox_fem/extreme.ogg', + "f" = 'sound/vox_fem/f.ogg', + "facility" = 'sound/vox_fem/facility.ogg', + "factory" = 'sound/vox_fem/factory.ogg', + "fahrenheit" = 'sound/vox_fem/fahrenheit.ogg', + "failed" = 'sound/vox_fem/failed.ogg', + "failure" = 'sound/vox_fem/failure.ogg', + "false" = 'sound/vox_fem/false.ogg', + "farthest" = 'sound/vox_fem/farthest.ogg', + "fast" = 'sound/vox_fem/fast.ogg', + "fauna" = 'sound/vox_fem/fauna.ogg', + "feet" = 'sound/vox_fem/feet.ogg', + "felinid" = 'sound/vox_fem/felinid.ogg', + "field" = 'sound/vox_fem/field.ogg', + "fifteen" = 'sound/vox_fem/fifteen.ogg', + "fifth" = 'sound/vox_fem/fifth.ogg', + "fifty" = 'sound/vox_fem/fifty.ogg', + "final" = 'sound/vox_fem/final.ogg', + "fine" = 'sound/vox_fem/fine.ogg', + "fire" = 'sound/vox_fem/fire.ogg', + "first" = 'sound/vox_fem/first.ogg', + "five" = 'sound/vox_fem/five.ogg', + "fix" = 'sound/vox_fem/fix.ogg', + "flooding" = 'sound/vox_fem/flooding.ogg', + "floor" = 'sound/vox_fem/floor.ogg', + "flyman" = 'sound/vox_fem/flyman.ogg', + "fool" = 'sound/vox_fem/fool.ogg', + "for" = 'sound/vox_fem/for.ogg', + "forbidden" = 'sound/vox_fem/forbidden.ogg', + "force" = 'sound/vox_fem/force.ogg', + "fore" = 'sound/vox_fem/fore.ogg', + "form" = 'sound/vox_fem/form.ogg', + "formed" = 'sound/vox_fem/formed.ogg', + "forms" = 'sound/vox_fem/forms.ogg', + "forty" = 'sound/vox_fem/forty.ogg', + "found" = 'sound/vox_fem/found.ogg', + "four" = 'sound/vox_fem/four.ogg', + "fourteen" = 'sound/vox_fem/fourteen.ogg', + "fourth" = 'sound/vox_fem/fourth.ogg', + "fourty" = 'sound/vox_fem/fourty.ogg', + "foxtrot" = 'sound/vox_fem/foxtrot.ogg', + "free" = 'sound/vox_fem/free.ogg', + "freeman" = 'sound/vox_fem/freeman.ogg', + "freeze" = 'sound/vox_fem/freeze.ogg', + "freezer" = 'sound/vox_fem/freezer.ogg', + "freezing" = 'sound/vox_fem/freezing.ogg', + "from" = 'sound/vox_fem/from.ogg', + "front" = 'sound/vox_fem/front.ogg', + "froze" = 'sound/vox_fem/froze.ogg', + "frozen" = 'sound/vox_fem/frozen.ogg', + "fuck" = 'sound/vox_fem/fuck.ogg', + "fucking" = 'sound/vox_fem/fucking.ogg', + "fucks" = 'sound/vox_fem/fucks.ogg', + "fuel" = 'sound/vox_fem/fuel.ogg', + "g" = 'sound/vox_fem/g.ogg', + "gas" = 'sound/vox_fem/gas.ogg', + "generator" = 'sound/vox_fem/generator.ogg', + "geneticist" = 'sound/vox_fem/geneticist.ogg', + "get" = 'sound/vox_fem/get.ogg', + "glory" = 'sound/vox_fem/glory.ogg', + "go" = 'sound/vox_fem/go.ogg', + "god" = 'sound/vox_fem/god.ogg', + "going" = 'sound/vox_fem/going.ogg', + "golem" = 'sound/vox_fem/golem.ogg', + "good" = 'sound/vox_fem/good.ogg', + "goodbye" = 'sound/vox_fem/goodbye.ogg', + "gordon" = 'sound/vox_fem/gordon.ogg', + "got" = 'sound/vox_fem/got.ogg', + "government" = 'sound/vox_fem/government.ogg', + "granted" = 'sound/vox_fem/granted.ogg', + "gravity" = 'sound/vox_fem/gravity.ogg', + "gray" = 'sound/vox_fem/gray.ogg', + "great" = 'sound/vox_fem/great.ogg', + "green" = 'sound/vox_fem/green.ogg', + "grenade" = 'sound/vox_fem/grenade.ogg', + "guard" = 'sound/vox_fem/guard.ogg', + "gulf" = 'sound/vox_fem/gulf.ogg', + "gun" = 'sound/vox_fem/gun.ogg', + "guthrie" = 'sound/vox_fem/guthrie.ogg', + "h" = 'sound/vox_fem/h.ogg', + "hacker" = 'sound/vox_fem/hacker.ogg', + "hackers" = 'sound/vox_fem/hackers.ogg', + "had" = 'sound/vox_fem/had.ogg', + "hall" = 'sound/vox_fem/hall.ogg', + "hallway" = 'sound/vox_fem/hallway.ogg', + "handling" = 'sound/vox_fem/handling.ogg', + "hangar" = 'sound/vox_fem/hangar.ogg', + "harm" = 'sound/vox_fem/harm.ogg', + "harmful" = 'sound/vox_fem/harmful.ogg', + "has" = 'sound/vox_fem/has.ogg', + "have" = 'sound/vox_fem/have.ogg', + "hazard" = 'sound/vox_fem/hazard.ogg', + "he" = 'sound/vox_fem/he.ogg', + "head" = 'sound/vox_fem/head.ogg', + "health" = 'sound/vox_fem/health.ogg', + "heat" = 'sound/vox_fem/heat.ogg', + "helicopter" = 'sound/vox_fem/helicopter.ogg', + "helium" = 'sound/vox_fem/helium.ogg', + "hello" = 'sound/vox_fem/hello.ogg', + "help" = 'sound/vox_fem/help.ogg', + "her" = 'sound/vox_fem/her.ogg', + "here" = 'sound/vox_fem/here.ogg', + "heretic" = 'sound/vox_fem/heretic.ogg', + "hide" = 'sound/vox_fem/hide.ogg', + "high" = 'sound/vox_fem/high.ogg', + "highest" = 'sound/vox_fem/highest.ogg', + "him" = 'sound/vox_fem/him.ogg', + "hit" = 'sound/vox_fem/hit.ogg', + "hole" = 'sound/vox_fem/hole.ogg', + "honk" = 'sound/vox_fem/honk.ogg', + "hop" = 'sound/vox_fem/hop.ogg', + "hos" = 'sound/vox_fem/hos.ogg', + "hostile" = 'sound/vox_fem/hostile.ogg', + "hot" = 'sound/vox_fem/hot.ogg', + "hotel" = 'sound/vox_fem/hotel.ogg', + "hour" = 'sound/vox_fem/hour.ogg', + "hours" = 'sound/vox_fem/hours.ogg', + "how" = 'sound/vox_fem/how.ogg', + "human" = 'sound/vox_fem/human.ogg', + "humanoid" = 'sound/vox_fem/humanoid.ogg', + "humans" = 'sound/vox_fem/humans.ogg', + "hundred" = 'sound/vox_fem/hundred.ogg', + "hunger" = 'sound/vox_fem/hunger.ogg', + "hurt" = 'sound/vox_fem/hurt.ogg', + "hydro" = 'sound/vox_fem/hydro.ogg', + "hydroponics" = 'sound/vox_fem/hydroponics.ogg', + "i" = 'sound/vox_fem/i.ogg', + "ian" = 'sound/vox_fem/ian.ogg', + "idiot" = 'sound/vox_fem/idiot.ogg', + "if" = 'sound/vox_fem/if.ogg', + "if2" = 'sound/vox_fem/if2.ogg', + "illegal" = 'sound/vox_fem/illegal.ogg', + "immediate" = 'sound/vox_fem/immediate.ogg', + "immediately" = 'sound/vox_fem/immediately.ogg', + "immortal" = 'sound/vox_fem/immortal.ogg', + "impossible" = 'sound/vox_fem/impossible.ogg', + "in" = 'sound/vox_fem/in.ogg', + "inches" = 'sound/vox_fem/inches.ogg', + "india" = 'sound/vox_fem/india.ogg', + "ing" = 'sound/vox_fem/ing.ogg', + "inoperative" = 'sound/vox_fem/inoperative.ogg', + "inside" = 'sound/vox_fem/inside.ogg', + "inspection" = 'sound/vox_fem/inspection.ogg', + "inspector" = 'sound/vox_fem/inspector.ogg', + "interchange" = 'sound/vox_fem/interchange.ogg', + "internals" = 'sound/vox_fem/internals.ogg', + "intruder" = 'sound/vox_fem/intruder.ogg', + "invalid" = 'sound/vox_fem/invalid.ogg', + "invalidate" = 'sound/vox_fem/invalidate.ogg', + "invasion" = 'sound/vox_fem/invasion.ogg', + "is" = 'sound/vox_fem/is.ogg', + "it" = 'sound/vox_fem/it.ogg', + "j" = 'sound/vox_fem/j.ogg', + "janitor" = 'sound/vox_fem/janitor.ogg', + "jesus" = 'sound/vox_fem/jesus.ogg', + "johnson" = 'sound/vox_fem/johnson.ogg', + "jolly" = 'sound/vox_fem/jolly.ogg', + "juliet" = 'sound/vox_fem/juliet.ogg', + "k" = 'sound/vox_fem/k.ogg', + "key" = 'sound/vox_fem/key.ogg', + "kidnapped" = 'sound/vox_fem/kidnapped.ogg', + "kidnapping" = 'sound/vox_fem/kidnapping.ogg', + "kill" = 'sound/vox_fem/kill.ogg', + "killed" = 'sound/vox_fem/killed.ogg', + "killer" = 'sound/vox_fem/killer.ogg', + "kilo" = 'sound/vox_fem/kilo.ogg', + "kit" = 'sound/vox_fem/kit.ogg', + "kitchen" = 'sound/vox_fem/kitchen.ogg', + "l" = 'sound/vox_fem/l.ogg', + "lab" = 'sound/vox_fem/lab.ogg', + "lambda" = 'sound/vox_fem/lambda.ogg', + "large" = 'sound/vox_fem/large.ogg', + "laser" = 'sound/vox_fem/laser.ogg', + "last" = 'sound/vox_fem/last.ogg', + "launch" = 'sound/vox_fem/launch.ogg', + "lavaland" = 'sound/vox_fem/lavaland.ogg', + "law" = 'sound/vox_fem/law.ogg', + "laws" = 'sound/vox_fem/laws.ogg', + "lawyer" = 'sound/vox_fem/lawyer.ogg', + "leak" = 'sound/vox_fem/leak.ogg', + "leave" = 'sound/vox_fem/leave.ogg', + "left" = 'sound/vox_fem/left.ogg', + "legal" = 'sound/vox_fem/legal.ogg', + "level" = 'sound/vox_fem/level.ogg', + "lever" = 'sound/vox_fem/lever.ogg', + "library" = 'sound/vox_fem/library.ogg', + "lie" = 'sound/vox_fem/lie.ogg', + "lieutenant" = 'sound/vox_fem/lieutenant.ogg', + "life" = 'sound/vox_fem/life.ogg', + "lifeform" = 'sound/vox_fem/lifeform.ogg', + "light" = 'sound/vox_fem/light.ogg', + "lightbulb" = 'sound/vox_fem/lightbulb.ogg', + "lima" = 'sound/vox_fem/lima.ogg', + "liquid" = 'sound/vox_fem/liquid.ogg', + "live" = 'sound/vox_fem/live.ogg', + "live2" = 'sound/vox_fem/live2.ogg', + "lizard" = 'sound/vox_fem/lizard.ogg', + "lizardperson" = 'sound/vox_fem/lizardperson.ogg', + "loading" = 'sound/vox_fem/loading.ogg', + "locate" = 'sound/vox_fem/locate.ogg', + "located" = 'sound/vox_fem/located.ogg', + "location" = 'sound/vox_fem/location.ogg', + "lock" = 'sound/vox_fem/lock.ogg', + "locked" = 'sound/vox_fem/locked.ogg', + "locker" = 'sound/vox_fem/locker.ogg', + "lockout" = 'sound/vox_fem/lockout.ogg', + "long" = 'sound/vox_fem/long.ogg', + "look" = 'sound/vox_fem/look.ogg', + "loop" = 'sound/vox_fem/loop.ogg', + "loose" = 'sound/vox_fem/loose.ogg', + "lot" = 'sound/vox_fem/lot.ogg', + "lower" = 'sound/vox_fem/lower.ogg', + "lowest" = 'sound/vox_fem/lowest.ogg', + "lusty" = 'sound/vox_fem/lusty.ogg', + "m" = 'sound/vox_fem/m.ogg', + "machine" = 'sound/vox_fem/machine.ogg', + "magic" = 'sound/vox_fem/magic.ogg', + "magnetic" = 'sound/vox_fem/magnetic.ogg', + "main" = 'sound/vox_fem/main.ogg', + "maintainer" = 'sound/vox_fem/maintainer.ogg', + "maintenance" = 'sound/vox_fem/maintenance.ogg', + "major" = 'sound/vox_fem/major.ogg', + "malfunction" = 'sound/vox_fem/malfunction.ogg', + "man" = 'sound/vox_fem/man.ogg', + "many" = 'sound/vox_fem/many.ogg', + "mass" = 'sound/vox_fem/mass.ogg', + "materials" = 'sound/vox_fem/materials.ogg', + "maximum" = 'sound/vox_fem/maximum.ogg', + "may" = 'sound/vox_fem/may.ogg', + "me" = 'sound/vox_fem/me.ogg', + "meat" = 'sound/vox_fem/meat.ogg', + "medbay" = 'sound/vox_fem/medbay.ogg', + "medical" = 'sound/vox_fem/medical.ogg', + "megafauna" = 'sound/vox_fem/megafauna.ogg', + "men" = 'sound/vox_fem/men.ogg', + "mercy" = 'sound/vox_fem/mercy.ogg', + "mesa" = 'sound/vox_fem/mesa.ogg', + "message" = 'sound/vox_fem/message.ogg', + "meter" = 'sound/vox_fem/meter.ogg', + "micro" = 'sound/vox_fem/micro.ogg', + "middle" = 'sound/vox_fem/middle.ogg', + "mike" = 'sound/vox_fem/mike.ogg', + "miles" = 'sound/vox_fem/miles.ogg', + "military" = 'sound/vox_fem/military.ogg', + "milli" = 'sound/vox_fem/milli.ogg', + "million" = 'sound/vox_fem/million.ogg', + "mime" = 'sound/vox_fem/mime.ogg', + "minefield" = 'sound/vox_fem/minefield.ogg', + "miner" = 'sound/vox_fem/miner.ogg', + "minimum" = 'sound/vox_fem/minimum.ogg', + "minor" = 'sound/vox_fem/minor.ogg', + "minutes" = 'sound/vox_fem/minutes.ogg', + "mister" = 'sound/vox_fem/mister.ogg', + "mode" = 'sound/vox_fem/mode.ogg', + "modification" = 'sound/vox_fem/modification.ogg', + "money" = 'sound/vox_fem/money.ogg', + "monkey" = 'sound/vox_fem/monkey.ogg', + "moth" = 'sound/vox_fem/moth.ogg', + "mothperson" = 'sound/vox_fem/mothperson.ogg', + "motor" = 'sound/vox_fem/motor.ogg', + "motorpool" = 'sound/vox_fem/motorpool.ogg', + "move" = 'sound/vox_fem/move.ogg', + "multitude" = 'sound/vox_fem/multitude.ogg', + "murder" = 'sound/vox_fem/murder.ogg', + "murderer" = 'sound/vox_fem/murderer.ogg', + "must" = 'sound/vox_fem/must.ogg', + "my" = 'sound/vox_fem/my.ogg', + "mythic" = 'sound/vox_fem/mythic.ogg', + "n" = 'sound/vox_fem/n.ogg', + "nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', + "nearest" = 'sound/vox_fem/nearest.ogg', + "need" = 'sound/vox_fem/need.ogg', + "never" = 'sound/vox_fem/never.ogg', + "nice" = 'sound/vox_fem/nice.ogg', + "night" = 'sound/vox_fem/night.ogg', + "nine" = 'sound/vox_fem/nine.ogg', + "nineteen" = 'sound/vox_fem/nineteen.ogg', + "ninety" = 'sound/vox_fem/ninety.ogg', + "nitrogen" = 'sound/vox_fem/nitrogen.ogg', + "no" = 'sound/vox_fem/no.ogg', + "nominal" = 'sound/vox_fem/nominal.ogg', + "north" = 'sound/vox_fem/north.ogg', + "northeast" = 'sound/vox_fem/northeast.ogg', + "northwest" = 'sound/vox_fem/northwest.ogg', + "not" = 'sound/vox_fem/not.ogg', + "november" = 'sound/vox_fem/november.ogg', + "now" = 'sound/vox_fem/now.ogg', + "nuclear" = 'sound/vox_fem/nuclear.ogg', + "nuke" = 'sound/vox_fem/nuke.ogg', + "number" = 'sound/vox_fem/number.ogg', + "o" = 'sound/vox_fem/o.ogg', + "objective" = 'sound/vox_fem/objective.ogg', + "obliterate" = 'sound/vox_fem/obliterate.ogg', + "obliterated" = 'sound/vox_fem/obliterated.ogg', + "obliterating" = 'sound/vox_fem/obliterating.ogg', + "observation" = 'sound/vox_fem/observation.ogg', + "obtain" = 'sound/vox_fem/obtain.ogg', + "of" = 'sound/vox_fem/of.ogg', + "off" = 'sound/vox_fem/off.ogg', + "office" = 'sound/vox_fem/office.ogg', + "officer" = 'sound/vox_fem/officer.ogg', + "oh" = 'sound/vox_fem/oh.ogg', + "ok" = 'sound/vox_fem/ok.ogg', + "okay" = 'sound/vox_fem/okay.ogg', + "on" = 'sound/vox_fem/on.ogg', + "once" = 'sound/vox_fem/once.ogg', + "one" = 'sound/vox_fem/one.ogg', + "oof" = 'sound/vox_fem/oof.ogg', + "open" = 'sound/vox_fem/open.ogg', + "opened" = 'sound/vox_fem/opened.ogg', + "opening" = 'sound/vox_fem/opening.ogg', + "operating" = 'sound/vox_fem/operating.ogg', + "operations" = 'sound/vox_fem/operations.ogg', + "operative" = 'sound/vox_fem/operative.ogg', + "option" = 'sound/vox_fem/option.ogg', + "or" = 'sound/vox_fem/or.ogg', + "order" = 'sound/vox_fem/order.ogg', + "organic" = 'sound/vox_fem/organic.ogg', + "oscar" = 'sound/vox_fem/oscar.ogg', + "out" = 'sound/vox_fem/out.ogg', + "outside" = 'sound/vox_fem/outside.ogg', + "over" = 'sound/vox_fem/over.ogg', + "overload" = 'sound/vox_fem/overload.ogg', + "override" = 'sound/vox_fem/override.ogg', + "oxygen" = 'sound/vox_fem/oxygen.ogg', + "p" = 'sound/vox_fem/p.ogg', + "pacification" = 'sound/vox_fem/pacification.ogg', + "pacify" = 'sound/vox_fem/pacify.ogg', + "pain" = 'sound/vox_fem/pain.ogg', + "pal" = 'sound/vox_fem/pal.ogg', + "panel" = 'sound/vox_fem/panel.ogg', + "panting" = 'sound/vox_fem/panting.ogg', + "pathetic" = 'sound/vox_fem/pathetic.ogg', + "percent" = 'sound/vox_fem/percent.ogg', + "perfect" = 'sound/vox_fem/perfect.ogg', + "perhaps" = 'sound/vox_fem/perhaps.ogg', + "perimeter" = 'sound/vox_fem/perimeter.ogg', + "permitted" = 'sound/vox_fem/permitted.ogg', + "personal" = 'sound/vox_fem/personal.ogg', + "personnel" = 'sound/vox_fem/personnel.ogg', + "pipe" = 'sound/vox_fem/pipe.ogg', + "piping" = 'sound/vox_fem/piping.ogg', + "piss" = 'sound/vox_fem/piss.ogg', + "plant" = 'sound/vox_fem/plant.ogg', + "plasma" = 'sound/vox_fem/plasma.ogg', + "plasmaman" = 'sound/vox_fem/plasmaman.ogg', + "platform" = 'sound/vox_fem/platform.ogg', + "plausible" = 'sound/vox_fem/plausible.ogg', + "please" = 'sound/vox_fem/please.ogg', + "point" = 'sound/vox_fem/point.ogg', + "port" = 'sound/vox_fem/port.ogg', + "portal" = 'sound/vox_fem/portal.ogg', + "possible" = 'sound/vox_fem/possible.ogg', + "power" = 'sound/vox_fem/power.ogg', + "presence" = 'sound/vox_fem/presence.ogg', + "present" = 'sound/vox_fem/present.ogg', + "presents" = 'sound/vox_fem/presents.ogg', + "press" = 'sound/vox_fem/press.ogg', + "pressure" = 'sound/vox_fem/pressure.ogg', + "primary" = 'sound/vox_fem/primary.ogg', + "prison" = 'sound/vox_fem/prison.ogg', + "prisoner" = 'sound/vox_fem/prisoner.ogg', + "proceed" = 'sound/vox_fem/proceed.ogg', + "processing" = 'sound/vox_fem/processing.ogg', + "progress" = 'sound/vox_fem/progress.ogg', + "proper" = 'sound/vox_fem/proper.ogg', + "propulsion" = 'sound/vox_fem/propulsion.ogg', + "prosecute" = 'sound/vox_fem/prosecute.ogg', + "protective" = 'sound/vox_fem/protective.ogg', + "push" = 'sound/vox_fem/push.ogg', + "put" = 'sound/vox_fem/put.ogg', + "q" = 'sound/vox_fem/q.ogg', + "quantum" = 'sound/vox_fem/quantum.ogg', + "quarantine" = 'sound/vox_fem/quarantine.ogg', + "quartermaster" = 'sound/vox_fem/quartermaster.ogg', + "quebec" = 'sound/vox_fem/quebec.ogg', + "queen" = 'sound/vox_fem/queen.ogg', + "question" = 'sound/vox_fem/question.ogg', + "questionable" = 'sound/vox_fem/questionable.ogg', + "questioning" = 'sound/vox_fem/questioning.ogg', + "quick" = 'sound/vox_fem/quick.ogg', + "quit" = 'sound/vox_fem/quit.ogg', + "r" = 'sound/vox_fem/r.ogg', + "radiation" = 'sound/vox_fem/radiation.ogg', + "radioactive" = 'sound/vox_fem/radioactive.ogg', + "rads" = 'sound/vox_fem/rads.ogg', + "raider" = 'sound/vox_fem/raider.ogg', + "raiders" = 'sound/vox_fem/raiders.ogg', + "rapid" = 'sound/vox_fem/rapid.ogg', + "reach" = 'sound/vox_fem/reach.ogg', + "reached" = 'sound/vox_fem/reached.ogg', + "reactor" = 'sound/vox_fem/reactor.ogg', + "red" = 'sound/vox_fem/red.ogg', + "relay" = 'sound/vox_fem/relay.ogg', + "released" = 'sound/vox_fem/released.ogg', + "remaining" = 'sound/vox_fem/remaining.ogg', + "removal" = 'sound/vox_fem/removal.ogg', + "renegade" = 'sound/vox_fem/renegade.ogg', + "repair" = 'sound/vox_fem/repair.ogg', + "report" = 'sound/vox_fem/report.ogg', + "reports" = 'sound/vox_fem/reports.ogg', + "request" = 'sound/vox_fem/request.ogg', + "requested" = 'sound/vox_fem/requested.ogg', + "requesting" = 'sound/vox_fem/requesting.ogg', + "require" = 'sound/vox_fem/require.ogg', + "required" = 'sound/vox_fem/required.ogg', + "research" = 'sound/vox_fem/research.ogg', + "resevoir" = 'sound/vox_fem/resevoir.ogg', + "resistance" = 'sound/vox_fem/resistance.ogg', + "rest" = 'sound/vox_fem/rest.ogg', + "restoration" = 'sound/vox_fem/restoration.ogg', + "revolution" = 'sound/vox_fem/revolution.ogg', + "revolutionary" = 'sound/vox_fem/revolutionary.ogg', + "right" = 'sound/vox_fem/right.ogg', + "riot" = 'sound/vox_fem/riot.ogg', + "roboticist" = 'sound/vox_fem/roboticist.ogg', + "rocket" = 'sound/vox_fem/rocket.ogg', + "roger" = 'sound/vox_fem/roger.ogg', + "rogue" = 'sound/vox_fem/rogue.ogg', + "romeo" = 'sound/vox_fem/romeo.ogg', + "room" = 'sound/vox_fem/room.ogg', + "round" = 'sound/vox_fem/round.ogg', + "run" = 'sound/vox_fem/run.ogg', + "rune" = 'sound/vox_fem/rune.ogg', + "runtime" = 'sound/vox_fem/runtime.ogg', + "s" = 'sound/vox_fem/s.ogg', + "sabotage" = 'sound/vox_fem/sabotage.ogg', + "safe" = 'sound/vox_fem/safe.ogg', + "safety" = 'sound/vox_fem/safety.ogg', + "sairhorn" = 'sound/vox_fem/sairhorn.ogg', + "sarah" = 'sound/vox_fem/sarah.ogg', + "sargeant" = 'sound/vox_fem/sargeant.ogg', + "satellite" = 'sound/vox_fem/satellite.ogg', + "save" = 'sound/vox_fem/save.ogg', + "scensor" = 'sound/vox_fem/scensor.ogg', + "science" = 'sound/vox_fem/science.ogg', + "scientist" = 'sound/vox_fem/scientist.ogg', + "scream" = 'sound/vox_fem/scream.ogg', + "screen" = 'sound/vox_fem/screen.ogg', + "search" = 'sound/vox_fem/search.ogg', + "second" = 'sound/vox_fem/second.ogg', + "secondary" = 'sound/vox_fem/secondary.ogg', + "seconds" = 'sound/vox_fem/seconds.ogg', + "section" = 'sound/vox_fem/section.ogg', + "sector" = 'sound/vox_fem/sector.ogg', + "secure" = 'sound/vox_fem/secure.ogg', + "secured" = 'sound/vox_fem/secured.ogg', + "security" = 'sound/vox_fem/security.ogg', + "select" = 'sound/vox_fem/select.ogg', + "selected" = 'sound/vox_fem/selected.ogg', + "self" = 'sound/vox_fem/self.ogg', + "sensors" = 'sound/vox_fem/sensors.ogg', + "server" = 'sound/vox_fem/server.ogg', + "service" = 'sound/vox_fem/service.ogg', + "seven" = 'sound/vox_fem/seven.ogg', + "seventeen" = 'sound/vox_fem/seventeen.ogg', + "seventy" = 'sound/vox_fem/seventy.ogg', + "severe" = 'sound/vox_fem/severe.ogg', + "sewage" = 'sound/vox_fem/sewage.ogg', + "sewer" = 'sound/vox_fem/sewer.ogg', + "shaft" = 'sound/vox_fem/shaft.ogg', + "she" = 'sound/vox_fem/she.ogg', + "shield" = 'sound/vox_fem/shield.ogg', + "shipment" = 'sound/vox_fem/shipment.ogg', + "shirt" = 'sound/vox_fem/shirt.ogg', + "shit" = 'sound/vox_fem/shit.ogg', + "shitlord" = 'sound/vox_fem/shitlord.ogg', + "shits" = 'sound/vox_fem/shits.ogg', + "shitting" = 'sound/vox_fem/shitting.ogg', + "shock" = 'sound/vox_fem/shock.ogg', + "shonk" = 'sound/vox_fem/shonk.ogg', + "shoot" = 'sound/vox_fem/shoot.ogg', + "shower" = 'sound/vox_fem/shower.ogg', + "shut" = 'sound/vox_fem/shut.ogg', + "shuttle" = 'sound/vox_fem/shuttle.ogg', + "sick" = 'sound/vox_fem/sick.ogg', + "side" = 'sound/vox_fem/side.ogg', + "sierra" = 'sound/vox_fem/sierra.ogg', + "sight" = 'sound/vox_fem/sight.ogg', + "silicon" = 'sound/vox_fem/silicon.ogg', + "silo" = 'sound/vox_fem/silo.ogg', + "singularity" = 'sound/vox_fem/singularity.ogg', + "six" = 'sound/vox_fem/six.ogg', + "sixteen" = 'sound/vox_fem/sixteen.ogg', + "sixty" = 'sound/vox_fem/sixty.ogg', + "skeleton" = 'sound/vox_fem/skeleton.ogg', + "slaughter" = 'sound/vox_fem/slaughter.ogg', + "slime" = 'sound/vox_fem/slime.ogg', + "slip" = 'sound/vox_fem/slip.ogg', + "slippery" = 'sound/vox_fem/slippery.ogg', + "slow" = 'sound/vox_fem/slow.ogg', + "sm" = 'sound/vox_fem/sm.ogg', + "small" = 'sound/vox_fem/small.ogg', + "sockmuncher" = 'sound/vox_fem/sockmuncher.ogg', + "solar" = 'sound/vox_fem/solar.ogg', + "solars" = 'sound/vox_fem/solars.ogg', + "soldier" = 'sound/vox_fem/soldier.ogg', + "some" = 'sound/vox_fem/some.ogg', + "someone" = 'sound/vox_fem/someone.ogg', + "something" = 'sound/vox_fem/something.ogg', + "son" = 'sound/vox_fem/son.ogg', + "sorry" = 'sound/vox_fem/sorry.ogg', + "south" = 'sound/vox_fem/south.ogg', + "southeast" = 'sound/vox_fem/southeast.ogg', + "southwest" = 'sound/vox_fem/southwest.ogg', + "space" = 'sound/vox_fem/space.ogg', + "squad" = 'sound/vox_fem/squad.ogg', + "square" = 'sound/vox_fem/square.ogg', + "ss13" = 'sound/vox_fem/ss13.ogg', + "stairway" = 'sound/vox_fem/stairway.ogg', + "starboard" = 'sound/vox_fem/starboard.ogg', + "station" = 'sound/vox_fem/station.ogg', + "status" = 'sound/vox_fem/status.ogg', + "stay" = 'sound/vox_fem/stay.ogg', + "sterile" = 'sound/vox_fem/sterile.ogg', + "sterilization" = 'sound/vox_fem/sterilization.ogg', + "stop" = 'sound/vox_fem/stop.ogg', + "storage" = 'sound/vox_fem/storage.ogg', + "strong" = 'sound/vox_fem/strong.ogg', + "stuck" = 'sound/vox_fem/stuck.ogg', + "sub" = 'sound/vox_fem/sub.ogg', + "subsurface" = 'sound/vox_fem/subsurface.ogg', + "sudden" = 'sound/vox_fem/sudden.ogg', + "suffer" = 'sound/vox_fem/suffer.ogg', + "suit" = 'sound/vox_fem/suit.ogg', + "superconducting" = 'sound/vox_fem/superconducting.ogg', + "supercooled" = 'sound/vox_fem/supercooled.ogg', + "supermatter" = 'sound/vox_fem/supermatter.ogg', + "supply" = 'sound/vox_fem/supply.ogg', + "surface" = 'sound/vox_fem/surface.ogg', + "surrender" = 'sound/vox_fem/surrender.ogg', + "surround" = 'sound/vox_fem/surround.ogg', + "surrounded" = 'sound/vox_fem/surrounded.ogg', + "sweating" = 'sound/vox_fem/sweating.ogg', + "swhitenoise" = 'sound/vox_fem/swhitenoise.ogg', + "switch" = 'sound/vox_fem/switch.ogg', + "syndicate" = 'sound/vox_fem/syndicate.ogg', + "system" = 'sound/vox_fem/system.ogg', + "systems" = 'sound/vox_fem/systems.ogg', + "t" = 'sound/vox_fem/t.ogg', + "table" = 'sound/vox_fem/table.ogg', + "tactical" = 'sound/vox_fem/tactical.ogg', + "taildragger" = 'sound/vox_fem/taildragger.ogg', + "take" = 'sound/vox_fem/take.ogg', + "talk" = 'sound/vox_fem/talk.ogg', + "tampered" = 'sound/vox_fem/tampered.ogg', + "tango" = 'sound/vox_fem/tango.ogg', + "tank" = 'sound/vox_fem/tank.ogg', + "target" = 'sound/vox_fem/target.ogg', + "team" = 'sound/vox_fem/team.ogg', + "tech" = 'sound/vox_fem/tech.ogg', + "technician" = 'sound/vox_fem/technician.ogg', + "technology" = 'sound/vox_fem/technology.ogg', + "teleporter" = 'sound/vox_fem/teleporter.ogg', + "temperature" = 'sound/vox_fem/temperature.ogg', + "temporal" = 'sound/vox_fem/temporal.ogg', + "ten" = 'sound/vox_fem/ten.ogg', + "terminal" = 'sound/vox_fem/terminal.ogg', + "terminate" = 'sound/vox_fem/terminate.ogg', + "terminated" = 'sound/vox_fem/terminated.ogg', + "termination" = 'sound/vox_fem/termination.ogg', + "test" = 'sound/vox_fem/test.ogg', + "text" = 'sound/vox_fem/text.ogg', + "thank" = 'sound/vox_fem/thank.ogg', + "thanks" = 'sound/vox_fem/thanks.ogg', + "that" = 'sound/vox_fem/that.ogg', + "the" = 'sound/vox_fem/the.ogg', + "theater" = 'sound/vox_fem/theater.ogg', + "them" = 'sound/vox_fem/them.ogg', + "then" = 'sound/vox_fem/then.ogg', + "there" = 'sound/vox_fem/there.ogg', + "they" = 'sound/vox_fem/they.ogg', + "third" = 'sound/vox_fem/third.ogg', + "thirteen" = 'sound/vox_fem/thirteen.ogg', + "thirty" = 'sound/vox_fem/thirty.ogg', + "this" = 'sound/vox_fem/this.ogg', + "those" = 'sound/vox_fem/those.ogg', + "thousand" = 'sound/vox_fem/thousand.ogg', + "threat" = 'sound/vox_fem/threat.ogg', + "three" = 'sound/vox_fem/three.ogg', + "through" = 'sound/vox_fem/through.ogg', + "tide" = 'sound/vox_fem/tide.ogg', + "time" = 'sound/vox_fem/time.ogg', + "tiny" = 'sound/vox_fem/tiny.ogg', + "to" = 'sound/vox_fem/to.ogg', + "top" = 'sound/vox_fem/top.ogg', + "topside" = 'sound/vox_fem/topside.ogg', + "touch" = 'sound/vox_fem/touch.ogg', + "towards" = 'sound/vox_fem/towards.ogg', + "toxins" = 'sound/vox_fem/toxins.ogg', + "track" = 'sound/vox_fem/track.ogg', + "train" = 'sound/vox_fem/train.ogg', + "traitor" = 'sound/vox_fem/traitor.ogg', + "transportation" = 'sound/vox_fem/transportation.ogg', + "truck" = 'sound/vox_fem/truck.ogg', + "true" = 'sound/vox_fem/true.ogg', + "tunnel" = 'sound/vox_fem/tunnel.ogg', + "turn" = 'sound/vox_fem/turn.ogg', + "turret" = 'sound/vox_fem/turret.ogg', + "twelve" = 'sound/vox_fem/twelve.ogg', + "twenty" = 'sound/vox_fem/twenty.ogg', + "two" = 'sound/vox_fem/two.ogg', + "u" = 'sound/vox_fem/u.ogg', + "ugh" = 'sound/vox_fem/ugh.ogg', + "ughh" = 'sound/vox_fem/ughh.ogg', + "unable" = 'sound/vox_fem/unable.ogg', + "unauthorized" = 'sound/vox_fem/unauthorized.ogg', + "under" = 'sound/vox_fem/under.ogg', + "uniform" = 'sound/vox_fem/uniform.ogg', + "unknown" = 'sound/vox_fem/unknown.ogg', + "unlocked" = 'sound/vox_fem/unlocked.ogg', + "unsafe" = 'sound/vox_fem/unsafe.ogg', + "until" = 'sound/vox_fem/until.ogg', + "up" = 'sound/vox_fem/up.ogg', + "update" = 'sound/vox_fem/update.ogg', + "updated" = 'sound/vox_fem/updated.ogg', + "updating" = 'sound/vox_fem/updating.ogg', + "upload" = 'sound/vox_fem/upload.ogg', + "upper" = 'sound/vox_fem/upper.ogg', + "uranium" = 'sound/vox_fem/uranium.ogg', + "us" = 'sound/vox_fem/us.ogg', + "usa" = 'sound/vox_fem/usa.ogg', + "use" = 'sound/vox_fem/use.ogg', + "used" = 'sound/vox_fem/used.ogg', + "user" = 'sound/vox_fem/user.ogg', + "v" = 'sound/vox_fem/v.ogg', + "vacate" = 'sound/vox_fem/vacate.ogg', + "vacuum" = 'sound/vox_fem/vacuum.ogg', + "valid" = 'sound/vox_fem/valid.ogg', + "validate" = 'sound/vox_fem/validate.ogg', + "vapor" = 'sound/vox_fem/vapor.ogg', + "vendor" = 'sound/vox_fem/vendor.ogg', + "vent" = 'sound/vox_fem/vent.ogg', + "ventilation" = 'sound/vox_fem/ventilation.ogg', + "very" = 'sound/vox_fem/very.ogg', + "victor" = 'sound/vox_fem/victor.ogg', + "violated" = 'sound/vox_fem/violated.ogg', + "violation" = 'sound/vox_fem/violation.ogg', + "virologist" = 'sound/vox_fem/virologist.ogg', + "virology" = 'sound/vox_fem/virology.ogg', + "virus" = 'sound/vox_fem/virus.ogg', + "vitals" = 'sound/vox_fem/vitals.ogg', + "voltage" = 'sound/vox_fem/voltage.ogg', + "vox" = 'sound/vox_fem/vox.ogg', + "vox_login" = 'sound/vox_fem/vox_login.ogg', + "voxtest" = 'sound/vox_fem/voxtest.ogg', + "w" = 'sound/vox_fem/w.ogg', + "walk" = 'sound/vox_fem/walk.ogg', + "wall" = 'sound/vox_fem/wall.ogg', + "wanker" = 'sound/vox_fem/wanker.ogg', + "want" = 'sound/vox_fem/want.ogg', + "wanted" = 'sound/vox_fem/wanted.ogg', + "warden" = 'sound/vox_fem/warden.ogg', + "warm" = 'sound/vox_fem/warm.ogg', + "warn" = 'sound/vox_fem/warn.ogg', + "warning" = 'sound/vox_fem/warning.ogg', + "was" = 'sound/vox_fem/was.ogg', + "waste" = 'sound/vox_fem/waste.ogg', + "water" = 'sound/vox_fem/water.ogg', + "we" = 'sound/vox_fem/we.ogg', + "weak" = 'sound/vox_fem/weak.ogg', + "weapon" = 'sound/vox_fem/weapon.ogg', + "welcome" = 'sound/vox_fem/welcome.ogg', + "west" = 'sound/vox_fem/west.ogg', + "wew" = 'sound/vox_fem/wew.ogg', + "what" = 'sound/vox_fem/what.ogg', + "when" = 'sound/vox_fem/when.ogg', + "where" = 'sound/vox_fem/where.ogg', + "while" = 'sound/vox_fem/while.ogg', + "whiskey" = 'sound/vox_fem/whiskey.ogg', + "white" = 'sound/vox_fem/white.ogg', + "why" = 'sound/vox_fem/why.ogg', + "wilco" = 'sound/vox_fem/wilco.ogg', + "will" = 'sound/vox_fem/will.ogg', + "wing" = 'sound/vox_fem/wing.ogg', + "wire" = 'sound/vox_fem/wire.ogg', + "with" = 'sound/vox_fem/with.ogg', + "without" = 'sound/vox_fem/without.ogg', + "wizard" = 'sound/vox_fem/wizard.ogg', + "wood" = 'sound/vox_fem/wood.ogg', + "woody" = 'sound/vox_fem/woody.ogg', + "woop" = 'sound/vox_fem/woop.ogg', + "wow" = 'sound/vox_fem/wow.ogg', + "x" = 'sound/vox_fem/x.ogg', + "xeno" = 'sound/vox_fem/xeno.ogg', + "xenobiology" = 'sound/vox_fem/xenobiology.ogg', + "xenomorph" = 'sound/vox_fem/xenomorph.ogg', + "xenomorphs" = 'sound/vox_fem/xenomorphs.ogg', + "y" = 'sound/vox_fem/y.ogg', + "yankee" = 'sound/vox_fem/yankee.ogg', + "yards" = 'sound/vox_fem/yards.ogg', + "year" = 'sound/vox_fem/year.ogg', + "yellow" = 'sound/vox_fem/yellow.ogg', + "yes" = 'sound/vox_fem/yes.ogg', + "you" = 'sound/vox_fem/you.ogg', + "your" = 'sound/vox_fem/your.ogg', + "yourself" = 'sound/vox_fem/yourself.ogg', + "z" = 'sound/vox_fem/z.ogg', + "zero" = 'sound/vox_fem/zero.ogg', + "zombie" = 'sound/vox_fem/zombie.ogg', + "zone" = 'sound/vox_fem/zone.ogg', + "zulu" = 'sound/vox_fem/zulu.ogg', )) #endif diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index c766ac080d1..58e5a244eaf 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -25,7 +25,7 @@ return FALSE -/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, forced = FALSE, required_biotype) +/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) if(isAI(src)) //ditto return ..() diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 1cd7035b8a0..229ad70bb84 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -5,8 +5,6 @@ new /obj/effect/decal/remains/robot(loc) /mob/living/silicon/death(gibbed) - if(!gibbed) - INVOKE_ASYNC(src, PROC_REF(emote), "deathgasp") diag_hud_set_status() diag_hud_set_health() update_health_hud() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 074f9d0049a..722b92835c8 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -207,24 +207,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real ..() return -/mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime shock - flash_act() - var/stunprob = M.powerlevel * 7 + 10 - if(prob(stunprob) && M.powerlevel >= 8) - adjustBruteLoss(M.powerlevel * rand(6,10)) - - var/damage = rand(1, 3) - - if(M.is_adult) - damage = rand(20, 40) - else - damage = rand(5, 35) - damage = round(damage / 2) // borgs receive half damage - adjustBruteLoss(damage) - - return - /mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user, list/modifiers) add_fingerprint(user) if(!opened) @@ -247,6 +229,11 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real step_away(src, user, 15) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_step_away), src, get_turf(user), 15), 3) +/mob/living/silicon/robot/get_shove_flags(mob/living/shover, obj/item/weapon) + . = ..() + if(isnull(weapon) || stat != CONSCIOUS) + . &= ~(SHOVE_CAN_MOVE|SHOVE_CAN_HIT_SOMETHING) + /mob/living/silicon/robot/welder_act(mob/living/user, obj/item/tool) if(user.combat_mode && usr != src) return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index e5ec22091b9..d31e041baa3 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -723,6 +723,7 @@ /obj/item/gun/energy/recharge/kinetic_accelerator/cyborg, /obj/item/gps/cyborg, /obj/item/stack/marker_beacon, + /obj/item/t_scanner/adv_mining_scanner/cyborg, ) radio_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY) emag_modules = list( @@ -736,16 +737,6 @@ "Spider Miner" = list(SKIN_ICON_STATE = "spidermin"), "Lavaland Miner" = list(SKIN_ICON_STATE = "miner"), ) - var/obj/item/t_scanner/adv_mining_scanner/cyborg/mining_scanner //built in memes. //fuck you - -/obj/item/robot_model/miner/rebuild_modules() - . = ..() - if(!mining_scanner) - mining_scanner = new(src) - -/obj/item/robot_model/miner/Destroy() - QDEL_NULL(mining_scanner) - return ..() /obj/item/robot_model/peacekeeper name = "Peacekeeper" diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 7e6dda33d8e..12f9a293b45 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -75,6 +75,7 @@ TRAIT_MADNESS_IMMUNE, TRAIT_MARTIAL_ARTS_IMMUNE, TRAIT_NOFIRE_SPREAD, + TRAIT_SHOVE_KNOCKDOWN_BLOCKED, ) add_traits(traits_to_apply, ROUNDSTART_TRAIT) diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index cf894e21baf..6292d7e0947 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/grippedby(mob/living/user, instant = FALSE) +/mob/living/silicon/grippedby(mob/living/carbon/user, instant = FALSE) return //can't upgrade a simple pull into a more aggressive grab. /mob/living/silicon/get_ear_protection()//no ears @@ -56,29 +56,35 @@ span_userdanger("[user] punches you!"), null, COMBAT_MESSAGE_RANGE, user) to_chat(user, span_danger("You punch [src]!")) -//ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/silicon/attack_hand(mob/living/carbon/human/user, list/modifiers) - . = FALSE - if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) - . = TRUE + . = ..() + if(.) + return TRUE + + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + user.disarm(src) + return TRUE + if(has_buckled_mobs() && !user.combat_mode) user_unbuckle_mob(buckled_mobs[1], user) + return TRUE + if(user.combat_mode) + user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + playsound(src.loc, 'sound/effects/bang.ogg', 10, TRUE) + visible_message(span_danger("[user] punches [src], but doesn't leave a dent!"), \ + span_warning("[user] punches you, but doesn't leave a dent!"), null, COMBAT_MESSAGE_RANGE, user) + to_chat(user, span_danger("You punch [src], but don't leave a dent!")) + return TRUE else - if(user.combat_mode) - user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - playsound(src.loc, 'sound/effects/bang.ogg', 10, TRUE) - visible_message(span_danger("[user] punches [src], but doesn't leave a dent!"), \ - span_warning("[user] punches you, but doesn't leave a dent!"), null, COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("You punch [src], but don't leave a dent!")) - else // SKYRAT EDIT ADDITION START - if(HAS_TRAIT(src, TRAIT_QUICKREFLEXES) && (src.stat != UNCONSCIOUS) && !src.incapacitated(IGNORE_RESTRAINTS)) - visible_message(span_warning("[user] tries to pet [src], but it moves out of the way.")) - return - // SKYRAT EDIT ADDITION END - visible_message(span_notice("[user] pets [src]."), \ - span_notice("[user] pets you."), null, null, user) - to_chat(user, span_notice("You pet [src].")) - SEND_SIGNAL(user, COMSIG_MOB_PAT_BORG) + // SKYRAT EDIT ADDITION START + if(HAS_TRAIT(src, TRAIT_QUICKREFLEXES) && (src.stat != UNCONSCIOUS) && !src.incapacitated(IGNORE_RESTRAINTS)) + visible_message(span_warning("[user] tries to pet [src], but it moves out of the way.")) + return + // SKYRAT EDIT ADDITION END + visible_message(span_notice("[user] pets [src]."), span_notice("[user] pets you."), null, null, user) + to_chat(user, span_notice("You pet [src].")) + SEND_SIGNAL(user, COMSIG_MOB_PAT_BORG) + return TRUE /mob/living/silicon/check_block(atom/hitby, damage, attack_text, attack_type, armour_penetration, damage_type, attack_flag) . = ..() diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 01d144aea88..2fea2871c03 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -4,21 +4,7 @@ return TRUE if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if(user.move_force < move_resist) - return - user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - playsound(src, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - var/shove_dir = get_dir(user, src) - if(!Move(get_step(src, shove_dir), shove_dir)) - log_combat(user, src, "shoved", "failing to move it") - user.visible_message(span_danger("[user.name] shoves [src]!"), - span_danger("You shove [src]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src)) - to_chat(src, span_userdanger("You're shoved by [user.name]!")) - return TRUE - log_combat(user, src, "shoved", "pushing it") - user.visible_message(span_danger("[user.name] shoves [src], pushing [p_them()]!"), - span_danger("You shove [src], pushing [p_them()]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src)) - to_chat(src, span_userdanger("You're pushed by [user.name]!")) + user.disarm(src) return TRUE if(!user.combat_mode) @@ -44,6 +30,19 @@ updatehealth() return TRUE +/mob/living/simple_animal/get_shoving_message(mob/living/shover, obj/item/weapon, shove_flags) + if(weapon) // no "gently pushing aside" if you're pressing a shield at them. + return ..() + var/moved = !(shove_flags & SHOVE_BLOCKED) + shover.visible_message( + span_danger("[shover.name] [response_disarm_continuous] [src][moved ? ", pushing [p_them()]" : ""]!"), + span_danger("You [response_disarm_simple] [src][moved ? ", pushing [p_them()]" : ""]!"), + span_hear("You hear aggressive shuffling!"), + COMBAT_MESSAGE_RANGE, + list(src), + ) + to_chat(src, span_userdanger("You're [moved ? "pushed" : "shoved"] by [shover.name]!")) + /mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) @@ -91,13 +90,6 @@ if(damage_done > 0) L.amount_grown = min(L.amount_grown + damage_done, L.max_grown) -/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - if(..()) //successful slime attack - var/damage = rand(15, 25) - if(user.is_adult) - damage = rand(20, 35) - return apply_damage(damage, user.melee_damage_type) - /mob/living/simple_animal/attack_drone(mob/living/basic/drone/user) if(user.combat_mode) //No kicking dogs even as a rogue drone. Use a weapon. return diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 98d34fc2f71..da07d6f0efd 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -77,7 +77,7 @@ /mob/living/simple_animal/bot/firebot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) if(!(bot_mode_flags & BOT_MODE_ON)) return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(internal_ext) internal_ext.afterattack(A, src) @@ -316,4 +316,3 @@ #undef SPEECH_INTERVAL #undef DETECTED_VOICE_INTERVAL #undef FOAM_INTERVAL - diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 2884b0a0486..e6554b4caea 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -397,7 +397,7 @@ return ..() /mob/living/simple_animal/bot/floorbot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(isturf(A)) repair(A) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index af505f53caa..7e3b0ab0c2e 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -769,7 +769,7 @@ unload() /mob/living/simple_animal/bot/mulebot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(isturf(A) && isturf(loc) && loc.Adjacent(A) && load) unload(get_dir(loc, A)) @@ -815,39 +815,37 @@ load(AM) -/mob/living/simple_animal/bot/mulebot/paranormal/load(atom/movable/AM) - if(load || AM.anchored) +/mob/living/simple_animal/bot/mulebot/paranormal/load(atom/movable/movable_atom) + if(load || movable_atom.anchored) return - if(!isturf(AM.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. + if(!isturf(movable_atom.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. return - if(isobserver(AM)) + if(isobserver(movable_atom)) visible_message(span_warning("A ghostly figure appears on [src]!")) - RegisterSignal(AM, COMSIG_MOVABLE_MOVED, PROC_REF(ghostmoved)) - AM.forceMove(src) + movable_atom.forceMove(src) + RegisterSignal(movable_atom, COMSIG_MOVABLE_MOVED, PROC_REF(ghostmoved)) else if(!wires.is_cut(WIRE_LOADCHECK)) buzz(SIGH) return // if not hacked, only allow ghosts to be loaded - else if(isobj(AM)) - var/obj/O = AM - if(O.has_buckled_mobs() || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it. + else if(isobj(movable_atom)) + if(movable_atom.has_buckled_mobs() || (locate(/mob) in movable_atom)) //can't load non crates objects with mobs buckled to it or inside it. buzz(SIGH) return - if(istype(O, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/crate = O + if(istype(movable_atom, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/crate = movable_atom crate.close() //make sure it's closed - O.forceMove(src) + movable_atom.forceMove(src) - else if(isliving(AM)) - if(!load_mob(AM)) //buckling is handled in forceMove() - return + else if(isliving(movable_atom) && !load_mob(movable_atom)) + return - load = AM + load = movable_atom mode = BOT_IDLE update_appearance() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index b4cd4d25498..f4241809b33 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -278,7 +278,7 @@ /mob/living/simple_animal/bot/secbot/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(!(bot_mode_flags & BOT_MODE_ON)) return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(!iscarbon(attack_target)) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9d215ed35fc..e8d2fd6be50 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -555,6 +555,8 @@ A.attack_animal(src)//Bang on it till we get out /mob/living/simple_animal/hostile/proc/FindHidden() + if(isnull(target)) + return FALSE if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper)) var/atom/A = target.loc var/atom/target_from = GET_TARGETS_FROM(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm index 200800f3d05..bc8134aac15 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -49,6 +49,8 @@ var/chosen_attack = 1 /// Attack actions, sets chosen_attack to the number in the action var/list/attack_action_types = list() + /// Summoning line, said when summoned via megafauna vents. + var/summon_line = "I'll kick your ass!" /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() @@ -120,33 +122,34 @@ if(recovery_time >= world.time) return . = ..() - if(. && isliving(target)) - var/mob/living/L = target - if(L.stat != DEAD) - if(!client && ranged && ranged_cooldown <= world.time) - OpenFire() - - if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still kills yall - devour(L) - else - devour(L) + if(!.) + LoseTarget() + return + if(!isliving(target)) + return + var/mob/living/living_target = target + if(living_target.stat == DEAD || (living_target.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(living_target, TRAIT_NODEATH))) + devour(living_target) + return + if(isnull(client) && ranged && ranged_cooldown <= world.time) + OpenFire() /// Devours a target and restores health to the megafauna -/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L) - if(!L || L.has_status_effect(/datum/status_effect/gutted)) +/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/victim) + if(isnull(victim) || victim.has_status_effect(/datum/status_effect/gutted)) + LoseTarget() return FALSE - celebrate_kill(L) + celebrate_kill(victim) if(!is_station_level(z) || client) //NPC monsters won't heal while on station - adjustBruteLoss(-L.maxHealth/2) - L.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS) - var/mob/living/carbon/carbonTarget = L - if(istype(carbonTarget)) - qdel(L.get_organ_slot(ORGAN_SLOT_LUNGS)) - qdel(L.get_organ_slot(ORGAN_SLOT_HEART)) - qdel(L.get_organ_slot(ORGAN_SLOT_LIVER)) - L.adjustBruteLoss(500) - L.death() //make sure they die - L.apply_status_effect(/datum/status_effect/gutted) + heal_overall_damage(victim.maxHealth * 0.5) + victim.investigate_log("has been devoured by [src].", INVESTIGATE_DEATHS) + if(iscarbon(victim)) + qdel(victim.get_organ_slot(ORGAN_SLOT_LUNGS)) + qdel(victim.get_organ_slot(ORGAN_SLOT_HEART)) + qdel(victim.get_organ_slot(ORGAN_SLOT_LIVER)) + victim.adjustBruteLoss(500) + victim.death() //make sure they die + victim.apply_status_effect(/datum/status_effect/gutted) LoseTarget() return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 2e562eb5659..4c6605cd839 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -190,7 +190,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget(atom/attacked_target) . = ..() if(. && prob(12)) - INVOKE_ASYNC(dash, TYPE_PROC_REF(/datum/action, Trigger), target) + INVOKE_ASYNC(dash, TYPE_PROC_REF(/datum/action, Trigger), NONE, target) /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom name = "hostile-environment miner" 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 eaeaddc3e03..91cf152acb0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -68,6 +68,7 @@ Difficulty: Hard death_message = "sinks into a pool of blood, fleeing the battle. You've won, for now... " death_sound = 'sound/magic/enter_blood.ogg' faction = list(FACTION_MINING, FACTION_BOSS, FACTION_HELL) + summon_line = "GRAAAAAAAHHHHHHHHH!" /// Check to see if we should spawn blood var/spawn_blood = TRUE /// Actual time where enrage ends diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index f726fcb9819..e256e4f2921 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -55,6 +55,7 @@ loot = list(/obj/structure/closet/crate/necropolis/colossus) death_message = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' + summon_line = "Your trial begins now." /// Spiral shots ability var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus/spiral_shots /// Random shots ablity @@ -154,8 +155,8 @@ return FALSE if(isgolem(victim) && victim.has_status_effect(/datum/status_effect/golem/gold)) return TRUE - var/mob/living/carbon/human/human_victim = victim - return human_victim.mind && istype(human_victim.mind.martial_art, /datum/martial_art/the_sleeping_carp) + + return istype(victim.mind?.martial_art, /datum/martial_art/the_sleeping_carp) /obj/effect/temp_visual/at_shield name = "anti-toolbox field" @@ -238,7 +239,6 @@ var/use_time = 0 /// If we are being used var/active = FALSE - var/list/affected_targets = list() var/activation_sound = 'sound/effects/break_stone.ogg' COOLDOWN_DECLARE(cooldown_timer) @@ -320,14 +320,28 @@ possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) activation_sound = 'sound/items/bikehorn.ogg' use_time = 3 SECONDS + /// List of REFs to mobs that have been turned into a clown + var/list/clowned_mob_refs = list() /obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user) - if(..() && ishuman(user) && !(user in affected_targets) && (user in viewers(src))) - var/mob/living/carbon/human/new_clown = user - for(var/obj/item/to_strip in new_clown) - new_clown.dropItemToGround(to_strip) - new_clown.dress_up_as_job(SSjob.GetJobType(/datum/job/clown)) - affected_targets.Add(new_clown) + . = ..() + if(!.) + return FALSE + + if(!ishuman(user)) + return FALSE + if(!(user in viewers(src))) + return FALSE + var/clown_ref = REF(user) + if(clown_ref in clowned_mob_refs) + return FALSE + + var/mob/living/carbon/human/new_clown = user + for(var/obj/item/to_strip in new_clown.get_equipped_items()) + new_clown.dropItemToGround(to_strip) + new_clown.dress_up_as_job(SSjob.GetJobType(/datum/job/clown)) + clowned_mob_refs += clown_ref + return TRUE /// Transforms the area to look like a new one /obj/machinery/anomalous_crystal/theme_warp @@ -335,130 +349,32 @@ activation_method = ACTIVATE_TOUCH cooldown_add = 20 SECONDS use_time = 5 SECONDS - var/datum/crystal_warp_theme/terrain_theme + /// Theme which we turn areas into on activation + var/datum/dimension_theme/terrain_theme + /// List of all areas we've affected + var/list/converted_areas = list() /obj/machinery/anomalous_crystal/theme_warp/Initialize(mapload) . = ..() - var/terrain_type = pick(subtypesof(/datum/crystal_warp_theme)) + var/terrain_type = pick(subtypesof(/datum/dimension_theme)) terrain_theme = new terrain_type() - observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"." + observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme.name]\"." /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) . = ..() if (!.) return FALSE var/area/current_area = get_area(src) - if (current_area in affected_targets) + if (current_area in converted_areas) return FALSE - if (terrain_theme.transform_area(current_area)) - affected_targets += current_area + terrain_theme.apply_theme_to_list_of_turfs(current_area.get_turfs_from_all_zlevels()) + converted_areas += current_area return TRUE -/// Transforms an area's turfs and objects into a different theme -/datum/crystal_warp_theme - /// Friendly name of theme - var/name = "" - /// Typepath of floor to replace open turfs with - var/floor - /// Typepath of wall to replace closed turfs with - var/wall - /// Typepath of object to replace chairs with - var/chair - /// Typepath of object to replace tables with - var/table - /// Typepath of things to potentially spawn on transformed open turfs - var/list/flora_and_fauna = list() - /// Chance per turf to create the things in the list above - var/flora_and_fauna_chance = 8 - -/// Change appropriate objects in provided area to those matching our theme, and spawn some plants or animals -/datum/crystal_warp_theme/proc/transform_area(area/target_area) - if (target_area.outdoors) - return FALSE - for(var/atom/thing in target_area) - if(isturf(thing)) - replace_turf(thing) - continue - if(chair && istype(thing, /obj/structure/chair)) - replace_object(thing, chair) - continue - if(table && istype(thing, /obj/structure/table)) - replace_object(thing, table) - continue - return TRUE - -/// Replaces a turf with a different themed turf -/datum/crystal_warp_theme/proc/replace_turf(turf/target_turf) - if(isindestructiblefloor(target_turf) || isindestructiblewall(target_turf) || isopenspaceturf(target_turf)) - return - - if(wall && iswallturf(target_turf)) - target_turf.ChangeTurf(wall) - return - - if(!isopenturf(target_turf)) - return - - if(length(flora_and_fauna) && !target_turf.is_blocked_turf(exclude_mobs = TRUE) && prob(flora_and_fauna_chance)) - var/atom/new_flora_and_fauna = pick(flora_and_fauna) - new new_flora_and_fauna(target_turf) - - if(floor) - var/turf/open/open_turf = target_turf - open_turf.replace_floor(floor, flags = CHANGETURF_IGNORE_AIR) - -/// Replaces an object with a different themed object -/datum/crystal_warp_theme/proc/replace_object(atom/original, new_type) - var/atom/new_thing = new new_type(original.loc) - new_thing.setDir(original.dir) - qdel(original) - -// Depressurizes the place... and free cult metal, I guess. -/datum/crystal_warp_theme/lavaland - name = "lavaland" - floor = /turf/open/floor/fakebasalt - wall = /turf/closed/wall/mineral/cult - flora_and_fauna = list(/mob/living/basic/mining/goldgrub) - flora_and_fauna_chance = 1 - -// Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway. -/datum/crystal_warp_theme/winter - name = "winter" - floor = /turf/open/misc/snow/actually_safe - wall = /turf/closed/wall/mineral/wood - chair = /obj/structure/chair/wood - table = /obj/structure/table/glass - flora_and_fauna = list( - /obj/structure/flora/grass/both/style_random, - /obj/structure/flora/grass/brown/style_random, - /obj/structure/flora/grass/green/style_random, - ) - -// Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows. -/datum/crystal_warp_theme/jungle - name = "jungle" - floor = /turf/open/floor/grass - wall = /turf/closed/wall/mineral/wood - chair = /obj/structure/chair/wood - table = /obj/structure/table/wood - flora_and_fauna = list( - /mob/living/carbon/human/species/monkey, - /obj/structure/flora/bush/ferny/style_random, - /obj/structure/flora/bush/grassy/style_random, - /obj/structure/flora/bush/leavy/style_random, - /obj/structure/flora/tree/palm/style_random, - /obj/structure/flora/bush/sparsegrass/style_random, - /obj/structure/flora/bush/sunny/style_random, - ) - flora_and_fauna_chance = 20 - -// Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos. -/datum/crystal_warp_theme/ayylmao - name = "ayy lmao" - floor = /turf/open/floor/mineral/abductor - wall = /turf/closed/wall/mineral/abductor - chair = /obj/structure/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline. - table = /obj/structure/table/abductor +/obj/machinery/anomalous_crystal/theme_warp/Destroy() + QDEL_NULL(terrain_theme) + converted_areas.Cut() + return ..() /obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with observer_desc = "This crystal generates a projectile when activated." diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index dc49d71f796..3415c45d12b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -43,6 +43,7 @@ Difficulty: Extremely Hard death_message = "falls to the ground, decaying into plasma particles." death_sound = SFX_BODYFALL footstep_type = FOOTSTEP_MOB_HEAVY + summon_line = "I'M WIDE AWAKE! AND YOU'RE WIIIIIIIDE OPEN!" /// If the demonic frost miner is in its enraged state var/enraged = FALSE /// If the demonic frost miner is currently transforming to its enraged state @@ -320,7 +321,7 @@ Difficulty: Extremely Hard /obj/item/pickaxe/drill/jackhammer/demonic/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks) var/turf/T = get_turf(target) - mineral_scan_pulse(T, world.view + 1) + mineral_scan_pulse(T, world.view + 1, src) . = ..() /obj/item/crusher_trophy/ice_block_talisman diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 3cda123814c..cf573c3a574 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -69,6 +69,7 @@ death_message = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' footstep_type = FOOTSTEP_MOB_HEAVY + summon_line = "ROOOOOOOOAAAAAAAAAAAR!" /// Fire cone ability var/datum/action/cooldown/mob_cooldown/fire_breath/cone/fire_cone /// Meteors ability diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index eda344ad1da..5077b3781e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -57,15 +57,31 @@ elimination = TRUE appearance_flags = LONG_GLIDE mouse_opacity = MOUSE_OPACITY_ICON - attack_action_types = list(/datum/action/innate/megafauna_attack/create_skull, - /datum/action/innate/megafauna_attack/charge_target, - /datum/action/innate/megafauna_attack/create_turrets) var/size = LEGION_LARGE - var/charging = FALSE + /// Create Skulls ability + var/datum/action/cooldown/mob_cooldown/create_legion_skull/create_legion_skull + /// Charge Target Ability + var/datum/action/cooldown/mob_cooldown/chase_target/chase_target + /// Create Turrets Ability + var/datum/action/cooldown/mob_cooldown/create_legion_turrets/create_legion_turrets /mob/living/simple_animal/hostile/megafauna/legion/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) + create_legion_skull = new(src) + chase_target = new(src) + chase_target.size = size + create_legion_turrets = new(src) + create_legion_turrets.maximum_turrets = size * 2 + create_legion_skull.Grant(src) + chase_target.Grant(src) + create_legion_turrets.Grant(src) + +/mob/living/simple_animal/hostile/megafauna/legion/Destroy() + create_legion_skull = null + chase_target = null + create_legion_turrets = null + return ..() /mob/living/simple_animal/hostile/megafauna/legion/medium icon = 'icons/mob/simple/lavaland/64x64megafauna.dmi' @@ -91,80 +107,17 @@ maxHealth = 200 size = LEGION_SMALL - - -/datum/action/innate/megafauna_attack/create_skull - name = "Create Legion Skull" - button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - button_icon_state = "legion_head" - chosen_message = "You are now creating legion skulls." - chosen_attack_num = 1 - -/datum/action/innate/megafauna_attack/charge_target - name = "Charge Target" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - chosen_message = "You are now charging at your target." - chosen_attack_num = 2 - -/datum/action/innate/megafauna_attack/create_turrets - name = "Create Sentinels" - button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - button_icon_state = "legion_turret" - chosen_message = "You are now creating legion sentinels." - chosen_attack_num = 3 - /mob/living/simple_animal/hostile/megafauna/legion/OpenFire(the_target) - if(charging) - return - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = ranged_cooldown_time), ignore_staggered = TRUE) - if(client) - switch(chosen_attack) - if(1) - create_legion_skull() - if(2) - charge_target() - if(3) - create_legion_turrets() return switch(rand(4)) //Larger skulls use more attacks. if(0 to 2) - create_legion_skull() + create_legion_skull.Trigger(target = target) if(3) - charge_target() + chase_target.Trigger(target = target) if(4) - create_legion_turrets() - -//SKULLS - -///Attack proc. Spawns a singular legion skull. -/mob/living/simple_animal/hostile/megafauna/legion/proc/create_legion_skull() - var/mob/living/basic/legion_brood/minion = new(loc) - minion.assign_creator(src) - minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target - -//CHARGE - -///Attack proc. Gives legion some movespeed buffs and switches the AI to melee. At lower sizes, this also throws the skull at the player. -/mob/living/simple_animal/hostile/megafauna/legion/proc/charge_target() - visible_message(span_warning("[src] charges!")) - SpinAnimation(speed = 20, loops = 3, parallel = FALSE) - ranged = FALSE - retreat_distance = 0 - minimum_distance = 0 - set_varspeed(0) - charging = TRUE - addtimer(CALLBACK(src, PROC_REF(reset_charge)), 60) - var/mob/living/L = target - if(!istype(L) || L.stat != DEAD) //I know, weird syntax, but it just works. - addtimer(CALLBACK(src, PROC_REF(throw_thyself)), 20) - -///This is the proc that actually does the throwing. Charge only adds a timer for this. -/mob/living/simple_animal/hostile/megafauna/legion/proc/throw_thyself() - playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) - throw_at(target, 7, 1.1, src, FALSE, FALSE, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY) + create_legion_turrets.Trigger(target = target) ///Deals some extra damage on throw impact. /mob/living/simple_animal/hostile/megafauna/legion/throw_impact(mob/living/hit_atom, datum/thrownthing/throwingdatum) @@ -174,21 +127,6 @@ hit_atom.apply_damage(22 * size / 2, wound_bonus = CANT_WOUND) //It gets pretty hard to dodge the skulls when there are a lot of them. Scales down with size hit_atom.safe_throw_at(get_step(src, get_dir(src, hit_atom)), 2) //Some knockback. Prevent the legion from melee directly after the throw. -//TURRETS - -///Attack proc. Creates up to three legion turrets on suitable turfs nearby. -/mob/living/simple_animal/hostile/megafauna/legion/proc/create_legion_turrets(minimum = 2, maximum = size * 2) - playsound(src, 'sound/magic/RATTLEMEBONES.ogg', 100, TRUE) - var/list/possiblelocations = list() - for(var/turf/T in oview(src, 4)) //Only place the turrets on open turfs - if(T.is_blocked_turf()) - continue - possiblelocations += T - for(var/i in 1 to min(rand(minimum, maximum), LAZYLEN(possiblelocations))) //Makes sure aren't spawning in nullspace. - var/chosen = pick(possiblelocations) - new /obj/structure/legionturret(chosen) - possiblelocations -= chosen - /mob/living/simple_animal/hostile/megafauna/legion/GiveTarget(new_target) . = ..() if(target) @@ -212,15 +150,6 @@ var/mob/living/basic/legion_brood/legion = new(loc) legion.infest(living_target) - -///Resets the charge buffs. -/mob/living/simple_animal/hostile/megafauna/legion/proc/reset_charge() - ranged = TRUE - retreat_distance = 5 - minimum_distance = 5 - set_varspeed(2) - charging = FALSE - ///Special snowflake death() here. Can only die if size is 1 or lower and HP is 0 or below. /mob/living/simple_animal/hostile/megafauna/legion/death() //Make sure we didn't get cheesed @@ -255,93 +184,6 @@ new /mob/living/simple_animal/hostile/megafauna/legion/medium/right(loc) new /mob/living/simple_animal/hostile/megafauna/legion/medium/eye(loc) -///A basic turret that shoots at nearby mobs. Intended to be used for the legion megafauna. -/obj/structure/legionturret - name = "\improper Legion sentinel" - desc = "The eye pierces your soul." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "legion_turret" - light_power = 0.5 - light_range = 2 - max_integrity = 80 - luminosity = 6 - anchored = TRUE - density = TRUE - layer = ABOVE_OBJ_LAYER - armor_type = /datum/armor/structure_legionturret - //Compared with the targeted mobs. If they have the faction, turret won't shoot. - faction = list(FACTION_MINING) - ///What kind of projectile the actual damaging part should be. - var/projectile_type = /obj/projectile/beam/legion - ///Time until the tracer gets shot - var/initial_firing_time = 18 - ///How long it takes between shooting the tracer and the projectile. - var/shot_delay = 8 - -/datum/armor/structure_legionturret - laser = 100 - -/obj/structure/legionturret/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(set_up_shot)), initial_firing_time) - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -///Handles an extremely basic AI -/obj/structure/legionturret/proc/set_up_shot() - for(var/mob/living/L in oview(9, src)) - if(L.stat == DEAD || L.stat == UNCONSCIOUS) - continue - if(faction_check(faction, L.faction)) - continue - fire(L) - return - fire(get_edge_target_turf(src, pick(GLOB.cardinals))) - -///Called when attacking a target. Shoots a projectile at the turf underneath the target. -/obj/structure/legionturret/proc/fire(atom/target) - var/turf/T = get_turf(target) - var/turf/T1 = get_turf(src) - if(!T || !T1) - return - //Now we generate the tracer. - var/angle = get_angle(T1, T) - var/datum/point/vector/V = new(T1.x, T1.y, T1.z, 0, 0, angle) - generate_tracer_between_points(V, V.return_vector_after_increments(6), /obj/effect/projectile/tracer/legion/tracer, 0, shot_delay, 0, 0, 0, null) - playsound(src, 'sound/machines/airlockopen.ogg', 100, TRUE) - addtimer(CALLBACK(src, PROC_REF(fire_beam), angle), shot_delay) - -///Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction. -/obj/structure/legionturret/proc/fire_beam(angle) - var/obj/projectile/ouchie = new projectile_type(loc) - ouchie.firer = src - ouchie.fire(angle) - playsound(src, 'sound/effects/bin_close.ogg', 100, TRUE) - QDEL_IN(src, 5) - -///Used for the legion turret. -/obj/projectile/beam/legion - name = "blood pulse" - hitsound = 'sound/magic/magic_missile.ogg' - damage = 19 - range = 6 - light_color = COLOR_SOFT_RED - impact_effect_type = /obj/effect/temp_visual/kinetic_blast - tracer_type = /obj/effect/projectile/tracer/legion - muzzle_type = /obj/effect/projectile/tracer/legion - impact_type = /obj/effect/projectile/tracer/legion - hitscan = TRUE - projectile_piercing = ALL - -///Used for the legion turret tracer. -/obj/effect/projectile/tracer/legion/tracer - icon = 'icons/effects/beam.dmi' - icon_state = "blood_light" - -///Used for the legion turret beam. -/obj/effect/projectile/tracer/legion - icon = 'icons/effects/beam.dmi' - icon_state = "blood" - #undef LEGION_LARGE #undef LEGION_MEDIUM #undef LEGION_SMALL diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index 50a6cee44ce..342713ee960 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -54,6 +54,7 @@ Difficulty: Hard attack_action_types = list(/datum/action/innate/megafauna_attack/heavy_stomp, /datum/action/innate/megafauna_attack/teleport, /datum/action/innate/megafauna_attack/shockwave_scream) + summon_line = "GwaHOOOOOOOOOOOOOOOOOOOOO" /// Saves the turf the megafauna was created at (spawns exit portal here) var/turf/starting /// Range for wendigo stomping when it moves diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 9540f5e1a4b..a1f77098152 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -1,3 +1,11 @@ +/// Mimics can't be made out of these objects +GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( + /obj/structure/table, + /obj/structure/cable, + /obj/structure/window, + /obj/structure/blob, +))) + /mob/living/simple_animal/hostile/mimic name = "crate" desc = "A rectangular steel crate." @@ -98,9 +106,6 @@ O.forceMove(C) ..() -/// Mimics can't be made out of these objects -GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/structure/blob)) - /mob/living/simple_animal/hostile/mimic/copy health = 100 maxHealth = 100 @@ -138,19 +143,21 @@ GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure /mob/living/simple_animal/hostile/mimic/copy/wabbajack(what_to_randomize, change_flags = WABBAJACK) visible_message(span_warning("[src] resists polymorphing into a new creature!")) -/mob/living/simple_animal/hostile/mimic/copy/proc/ChangeOwner(mob/owner) - if(owner != creator) - LoseTarget() - creator = owner - faction |= "[REF(owner)]" +/mob/living/simple_animal/hostile/mimic/copy/animate_atom_living(mob/living/owner) + change_owner(owner) -/mob/living/simple_animal/hostile/mimic/copy/proc/CheckObject(obj/O) - if((isitem(O) || isstructure(O)) && !is_type_in_list(O, GLOB.animatable_blacklist)) - return TRUE - return FALSE +/mob/living/simple_animal/hostile/mimic/copy/proc/change_owner(mob/owner) + if(isnull(owner) || creator == owner) + return + LoseTarget() + creator = owner + faction |= REF(owner) + +/mob/living/simple_animal/hostile/mimic/copy/proc/check_object(obj/target) + return ((isitem(target) || isstructure(target)) && !is_type_in_typecache(target, GLOB.animatable_blacklist)) /mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/user, destroy_original = 0) - if(destroy_original || CheckObject(O)) + if(destroy_original || check_object(O)) O.forceMove(src) name = O.name desc = O.desc diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index a3d56af8b89..3a838ac58cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -119,8 +119,6 @@ IGNORE_PROC_IF_NOT_TARGET(attack_larva) IGNORE_PROC_IF_NOT_TARGET(attack_animal) -IGNORE_PROC_IF_NOT_TARGET(attack_slime) - /mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/projectile/Proj) if(Proj.firer != set_target) return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c061fa8e5ce..9f79c8a680c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -413,10 +413,8 @@ new /obj/effect/temp_visual/gib_animation/animal(loc, icon_gib) -/mob/living/simple_animal/say_mod(input, list/message_mods = list()) - if(length(speak_emote)) - verb_say = pick(speak_emote) - return ..() +/mob/living/simple_animal/get_default_say_verb() + return length(speak_emote) ? pick(speak_emote) : ..() /mob/living/simple_animal/proc/set_varspeed(var_value) speed = var_value diff --git a/code/modules/mob/living/simple_animal/slime/ai.dm b/code/modules/mob/living/simple_animal/slime/ai.dm new file mode 100644 index 00000000000..0272a4e467b --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/ai.dm @@ -0,0 +1,494 @@ +#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends))) +#define SLIME_HUNGER_NONE 0 +#define SLIME_HUNGER_HUNGRY 1 +#define SLIME_HUNGER_STARVING 2 + +/mob/living/simple_animal/slime/handle_automated_movement() + return //slime random movement is currently handled in handle_targets() + +/mob/living/simple_animal/slime/handle_automated_speech() + return //slime random speech is currently handled in handle_speech() + +///Handles slime mood +/mob/living/simple_animal/slime/proc/handle_mood(seconds_per_tick, times_fired) + #define SLIME_MOOD_NONE "" + #define SLIME_MOOD_ANGRY "angry" + #define SLIME_MOOD_MISCHIEVOUS "mischievous" + #define SLIME_MOOD_POUT "pout" + #define SLIME_MOOD_SAD "sad" + #define SLIME_MOOD_SMILE ":3" + + var/newmood = SLIME_MOOD_NONE + if (rabid || attacked_stacks) + newmood = SLIME_MOOD_ANGRY + else if (docile) + newmood = SLIME_MOOD_SMILE + else if (Target) + newmood = SLIME_MOOD_MISCHIEVOUS + + if (!newmood) + if (discipline_stacks && SPT_PROB(13, seconds_per_tick)) + newmood = SLIME_MOOD_POUT + else if (SPT_PROB(0.5, seconds_per_tick)) + newmood = pick(SLIME_MOOD_SAD, ":3", SLIME_MOOD_POUT) + + if ((current_mood == SLIME_MOOD_SAD || current_mood == SLIME_MOOD_SMILE || current_mood == SLIME_MOOD_POUT) && !newmood) + if(SPT_PROB(50, seconds_per_tick)) + newmood = current_mood + + if (newmood != current_mood) // This is so we don't redraw them every time + current_mood = newmood + regenerate_icons() + + #undef SLIME_MOOD_NONE + #undef SLIME_MOOD_ANGRY + #undef SLIME_MOOD_MISCHIEVOUS + #undef SLIME_MOOD_POUT + #undef SLIME_MOOD_SAD + #undef SLIME_MOOD_SMILE + +///Handles the slime understanding commends spoken to it +/mob/living/simple_animal/slime/proc/handle_speech(seconds_per_tick, times_fired) + //Speech understanding starts here + var/to_say + if (speech_buffer.len > 0) + var/who = speech_buffer[1] // Who said it? + var/phrase = speech_buffer[2] // What did they say? + if ((findtext(phrase, num2text(slime_id)) || findtext(phrase, "slimes"))) // Talking to us + if (findtext(phrase, "hello") || findtext(phrase, "hi")) + to_say = pick("Hello...", "Hi...") + else if (findtext(phrase, "follow")) + if (Leader) + if (Leader == who) // Already following him + to_say = pick("Yes...", "Lead...", "Follow...") + else if (Friends[who] > Friends[Leader]) // VIVA + set_leader(who) + to_say = "Yes... I follow [who]..." + else + to_say = "No... I follow [Leader]..." + else + if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) + set_leader(who) + to_say = "I follow..." + else // Not friendly enough + to_say = pick("No...", "I no follow...") + else if (findtext(phrase, "stop")) + if (buckled) // We are asked to stop feeding + if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) + stop_feeding() + set_target(null) + if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) + add_friendship(who, -1) + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if (Target) // We are asked to stop chasing + if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) + set_target(null) + if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) + add_friendship(who, -1) + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if (Leader) // We are asked to stop following + if (Leader == who) + to_say = "Yes... I stay..." + set_leader(null) + else + if (Friends[who] > Friends[Leader]) + set_leader(null) + to_say = "Yes... I stop..." + else + to_say = "No... keep follow..." + else if (findtext(phrase, "stay")) + if (Leader) + if (Leader == who) + holding_still = Friends[who] * 10 + to_say = "Yes... stay..." + else if (Friends[who] > Friends[Leader]) + holding_still = (Friends[who] - Friends[Leader]) * 10 + to_say = "Yes... stay..." + else + to_say = "No... keep follow..." + else + if (Friends[who] >= SLIME_FRIENDSHIP_STAY) + holding_still = Friends[who] * 10 + to_say = "Yes... stay..." + else + to_say = "No... won't stay..." + else if (findtext(phrase, "attack")) + if (rabid && prob(20)) + set_target(who) + process_slime_ai() //Wake up the slime's Target AI, needed otherwise this doesn't work + to_say = "ATTACK!?!?" + else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK) + for (var/mob/living/possible_target in view(7,src)-list(src,who)) + if (findtext(phrase, lowertext(possible_target.name))) + if (isslime(possible_target)) + to_say = "NO... [possible_target] slime friend" + add_friendship(who, -1) //Don't ask a slime to attack its friend + else if(!Friends[possible_target] || Friends[possible_target] < 1) + set_target(possible_target) + process_slime_ai()//Wake up the slime's Target AI, needed otherwise this doesn't work + to_say = "Ok... I attack [Target]" + else + to_say = "No... like [possible_target] ..." + add_friendship(who, -1) //Don't ask a slime to attack its friend + break + else + to_say = "No... no listen" + + speech_buffer = list() + + //Speech starts here + if (to_say) + say (to_say) + else if(SPT_PROB(0.5, seconds_per_tick)) + emote(pick("bounce","sway","light","vibrate","jiggle")) + else + var/speech_chance = 10 + var/slimes_near = 0 + var/dead_slimes = 0 + var/friends_near = list() + for (var/mob/living/seen_mob in view(7,src)) + if(isslime(seen_mob) && seen_mob != src) + ++slimes_near + if (seen_mob.stat == DEAD) + ++dead_slimes + if (seen_mob in Friends) + speech_chance += 20 + friends_near += seen_mob + if (nutrition < hunger_nutrition) + speech_chance += 10 + if (nutrition < starve_nutrition) + speech_chance += 10 + if (SPT_PROB(1, seconds_per_tick) && prob(speech_chance)) + var/phrases = list() + if (Target) + phrases += "[Target]... look yummy..." + if (nutrition < starve_nutrition) + phrases += "So... hungry..." + phrases += "Very... hungry..." + phrases += "Need... food..." + phrases += "Must... eat..." + else if (nutrition < hunger_nutrition) + phrases += "Hungry..." + phrases += "Where food?" + phrases += "I want to eat..." + phrases += "Rawr..." + phrases += "Blop..." + phrases += "Blorble..." + if (rabid || attacked_stacks) + phrases += "Hrr..." + phrases += "Nhuu..." + phrases += "Unn..." + if (current_mood == ":3") + phrases += "Purr..." + if (attacked_stacks) + phrases += "Grrr..." + if (bodytemperature < T0C) + phrases += "Cold..." + if (bodytemperature < T0C - 30) + phrases += "So... cold..." + phrases += "Very... cold..." + if (bodytemperature < T0C - 50) + phrases += "..." + phrases += "C... c..." + if (buckled) + phrases += "Nom..." + phrases += "Yummy..." + if (powerlevel > 3) + phrases += "Bzzz..." + if (powerlevel > 5) + phrases += "Zap..." + if (powerlevel > 8) + phrases += "Zap... Bzz..." + if (current_mood == "sad") + phrases += "Bored..." + if (slimes_near) + phrases += "Slime friend..." + if (slimes_near > 1) + phrases += "Slime friends..." + if (dead_slimes) + phrases += "What happened?" + if (!slimes_near) + phrases += "Lonely..." + for (var/friend in friends_near) + phrases += "[friend]... friend..." + if (nutrition < hunger_nutrition) + phrases += "[friend]... feed me..." + if(!stat) + say (pick(phrases)) + +///Sets the slime's current attack target +/mob/living/simple_animal/slime/proc/set_target(new_target) + var/old_target = Target + Target = new_target + if(old_target && !SLIME_CARES_ABOUT(old_target)) + UnregisterSignal(old_target, COMSIG_QDELETING) + if(Target) + RegisterSignal(Target, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) + +///Sets the person the slime is following around +/mob/living/simple_animal/slime/proc/set_leader(new_leader) + var/old_leader = Leader + Leader = new_leader + if(old_leader && !SLIME_CARES_ABOUT(old_leader)) + UnregisterSignal(old_leader, COMSIG_QDELETING) + if(Leader) + RegisterSignal(Leader, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) + +///Alters the friendship value of the target +/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1) + if(!Friends[new_friend]) + Friends[new_friend] = 0 + Friends[new_friend] += amount + if(new_friend) + RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) + +///Sets the friendship value of the target +/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1) + Friends[new_friend] = amount + if(new_friend) + RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) + +///Removes someone from the friendlist +/mob/living/simple_animal/slime/proc/remove_friend(friend) + Friends -= friend + if(friend && !SLIME_CARES_ABOUT(friend)) + UnregisterSignal(friend, COMSIG_QDELETING) + +///Adds someone to the friend list +/mob/living/simple_animal/slime/proc/set_friends(new_buds) + clear_friends() + for(var/mob/friend as anything in new_buds) + set_friendship(friend, new_buds[friend]) + +///Removes everyone from the friend list +/mob/living/simple_animal/slime/proc/clear_friends() + for(var/mob/friend as anything in Friends) + remove_friend(friend) + +///The passed source will be no longer be the slime's target, leader, or one of its friends +/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source) + SIGNAL_HANDLER + if(source == Target) + set_target(null) + if(source == Leader) + set_leader(null) + remove_friend(source) + +///Handles selecting targets +/mob/living/simple_animal/slime/proc/handle_targets(seconds_per_tick, times_fired) + if(attacked_stacks > 50) + attacked_stacks = 50 + + if(attacked_stacks > 0) + attacked_stacks-- + + if(discipline_stacks > 0) + + if(discipline_stacks >= 5 && rabid) + if(SPT_PROB(37, seconds_per_tick)) + rabid = FALSE + + if(SPT_PROB(5, seconds_per_tick)) + discipline_stacks-- + + if(client) //player controlled slimes can decide for themselves + return + + if(!(mobility_flags & MOBILITY_MOVE)) + return + + if(buckled) + return // if it's eating someone already, continue eating! + + if(Target) + --target_patience + if (target_patience <= 0 || stunned_until > world.time || discipline_stacks || attacked_stacks || docile) // Tired of chasing or something draws out attention + target_patience = 0 + set_target(null) + + if(slime_ai_processing && stunned_until > world.time) + return + + var/hungry = SLIME_HUNGER_NONE // determines if the slime is hungry + + if (nutrition < starve_nutrition) + hungry = SLIME_HUNGER_STARVING + else if (nutrition < grow_nutrition && SPT_PROB(13, seconds_per_tick) || nutrition < hunger_nutrition) + hungry = SLIME_HUNGER_HUNGRY + + if(hungry == SLIME_HUNGER_STARVING && !client) // if a slime is starving, it starts losing its friends + if(Friends.len > 0 && SPT_PROB(0.5, seconds_per_tick)) + var/mob/nofriend = pick(Friends) + add_friendship(nofriend, -1) + + if(!Target) //If we have no target, try to add a target + if(will_hunt() && hungry || attacked_stacks || rabid) // Only add to the list if we need to + var/list/targets = list() + + for(var/mob/living/L in view(7,src)) + + if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs + continue + + if(L in Friends) // No eating friends! + continue + + var/ally = FALSE + for(var/F in faction) + if(F == FACTION_NEUTRAL) //slimes are neutral so other mobs not target them, but they can target neutral mobs + continue + if(F in L.faction) + ally = TRUE + break + if(ally) + continue + + if(issilicon(L) && (rabid || attacked_stacks)) // They can't eat silicons, but they can glomp them in defence + targets += L // Possible target found! + + if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time. + continue + + targets += L // Possible target found! + + if(targets.len > 0) + if(attacked_stacks || rabid || hungry == SLIME_HUNGER_STARVING) + set_target(targets[1]) // I am attacked and am fighting back or so hungry I don't even care + else + for(var/mob/living/carbon/C in targets) + if(!discipline_stacks && SPT_PROB(2.5, seconds_per_tick)) + if(ishuman(C) || isalienadult(C)) + set_target(C) + break + + if(islarva(C) || ismonkey(C)) + set_target(C) + break + + if (Target) + target_patience = rand(5, 7) + if (life_stage == SLIME_LIFE_STAGE_ADULT) + target_patience += 3 + + if(!Target) // If we have no target, we are wandering or following orders + if (Leader) + if(holding_still) + holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) + else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc)) + step_to(src, Leader) + + else if(hungry) + if (holding_still) + holding_still = max(holding_still - (0.5 * hungry * seconds_per_tick), 0) + else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(50)) + step(src, pick(GLOB.cardinals)) + + else + if(holding_still) + holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) + else if (docile && pulledby) + holding_still = 10 + else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33)) + step(src, pick(GLOB.cardinals)) + else if(!slime_ai_processing) + INVOKE_ASYNC(src, PROC_REF(process_slime_ai)) + +/// Check for being stopped from feeding and chasing +/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) + if (docile) + return FALSE + if (hunger == SLIME_HUNGER_STARVING || rabid || attacked_stacks) + return TRUE + if (Leader) + return FALSE + if (holding_still) + return FALSE + return TRUE + +/// the master AI process +/mob/living/simple_animal/slime/proc/process_slime_ai() + + if(slime_ai_processing || stat || client) + return + + var/hungry = SLIME_HUNGER_NONE + if (nutrition < starve_nutrition) + hungry = SLIME_HUNGER_STARVING + else if (nutrition < grow_nutrition && prob(25) || nutrition < hunger_nutrition) + hungry = SLIME_HUNGER_HUNGRY + + slime_ai_processing = TRUE + + while(slime_ai_processing && stat != DEAD && (attacked_stacks || hungry || rabid || buckled)) + if(!(mobility_flags & MOBILITY_MOVE)) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly + break + + if(!Target || client) + break + + if(Target.health <= -70 || Target.stat == DEAD) + set_target(null) + slime_ai_processing = FALSE + break + + if(Target) + if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) + set_target(null) + slime_ai_processing = FALSE + break + if(!slime_ai_processing) + break + + if(Target in view(1,src)) + if(!can_feed_on(Target)) //If they're not able to be fed upon, ignore them. + if(!is_attack_on_cooldown) + is_attack_on_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) + + if(Target.Adjacent(src)) + Target.attack_animal(src) + break + if((Target.body_position == STANDING_UP) && prob(80)) + + if(Target.client && Target.health >= 20) + if(!is_attack_on_cooldown) + is_attack_on_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) + + if(Target.Adjacent(src)) + Target.attack_animal(src) + + else + if(!is_attack_on_cooldown && Target.Adjacent(src)) + start_feeding(Target) + + else + if(!is_attack_on_cooldown && Target.Adjacent(src)) + start_feeding(Target) + + else if(Target in view(7, src)) + if(!Target.Adjacent(src)) + // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them + step_to(src, Target) + else + set_target(null) + slime_ai_processing = FALSE + break + + var/sleeptime = cached_multiplicative_slowdown + if(sleeptime <= 0) + sleeptime = 1 + + sleep(sleeptime + 2) // this is about as fast as a player slime can go + + slime_ai_processing = FALSE + +#undef SLIME_CARES_ABOUT + +#undef SLIME_HUNGER_NONE +#undef SLIME_HUNGER_HUNGRY +#undef SLIME_HUNGER_STARVING diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index 033d7d2414e..a072299d663 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -1,22 +1,17 @@ /mob/living/simple_animal/slime/death(gibbed) if(stat == DEAD) return - if(!gibbed) - if(is_adult) - var/mob/living/simple_animal/slime/new_slime = new(drop_location(), slime_type.type) - new_slime.rabid = TRUE - new_slime.regenerate_icons() + if(!gibbed && life_stage == SLIME_LIFE_STAGE_ADULT) + var/mob/living/simple_animal/slime/new_slime = new(drop_location(), slime_type.type) + new_slime.rabid = TRUE + new_slime.regenerate_icons() - is_adult = FALSE - maxHealth = 150 - for(var/datum/action/innate/slime/reproduce/reproduce_action in actions) - reproduce_action.Remove(src) - var/datum/action/innate/slime/evolve/evolve_action = new - evolve_action.Grant(src) - revive(HEAL_ALL) - regenerate_icons() - update_name() - return + //revives us as a baby + set_life_stage(SLIME_LIFE_STAGE_BABY) + revive(HEAL_ALL) + regenerate_icons() + update_name() + return if(buckled) stop_feeding(silent = TRUE) //releases ourselves from the mob we fed on. diff --git a/code/modules/mob/living/simple_animal/slime/defense.dm b/code/modules/mob/living/simple_animal/slime/defense.dm new file mode 100644 index 00000000000..dd94e4e2bab --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/defense.dm @@ -0,0 +1,131 @@ + +/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!forced) + amount = -abs(amount) + return ..() //Heals them + +/mob/living/simple_animal/slime/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + powerlevel = 0 // oh no, the power! + +/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/user, list/modifiers) + . = ..() + if(.) + attacked_stacks += 10 + +/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/human/user, list/modifiers) + if(..()) //successful monkey bite. + attacked_stacks += 10 + +/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L, list/modifiers) + if(..()) //successful larva bite. + attacked_stacks += 10 + +/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) + . = ..() + if(!.) + return + discipline_slime(user) + +/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/user, list/modifiers) + if(buckled) + user.do_attack_animation(src, ATTACK_EFFECT_DISARM) + if(buckled == user) + if(prob(60)) + user.visible_message(span_warning("[user] attempts to wrestle \the [name] off!"), \ + span_danger("You attempt to wrestle \the [name] off!")) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + + else + user.visible_message(span_warning("[user] manages to wrestle \the [name] off!"), \ + span_notice("You manage to wrestle \the [name] off!")) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + discipline_slime(user) + + else + if(prob(30)) + buckled.visible_message(span_warning("[user] attempts to wrestle \the [name] off of [buckled]!"), \ + span_warning("[user] attempts to wrestle \the [name] off of you!")) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + + else + buckled.visible_message(span_warning("[user] manages to wrestle \the [name] off of [buckled]!"), \ + span_notice("[user] manage to wrestle \the [name] off of you!")) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + discipline_slime(user) + else + if(stat == DEAD && surgeries.len) + if(!user.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) + for(var/datum/surgery/operations as anything in surgeries) + if(operations.next_step(user, modifiers)) + return TRUE + if(..()) //successful attack + attacked_stacks += 10 + +/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) + if(..()) //if harm or disarm intent. + attacked_stacks += 10 + discipline_slime(user) + +/mob/living/simple_animal/slime/attackby(obj/item/attacking_item, mob/living/user, params) + if(stat == DEAD && surgeries.len) + var/list/modifiers = params2list(params) + if(!user.combat_mode || (LAZYACCESS(modifiers, RIGHT_CLICK))) + for(var/datum/surgery/operations as anything in surgeries) + if(operations.next_step(user, modifiers)) + return TRUE + if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma) && !stat) //Lets you feed slimes plasma. + add_friendship(user, 1) + to_chat(user, span_notice("You feed the slime the plasma. It chirps happily.")) + var/obj/item/stack/sheet/mineral/plasma/sheet = attacking_item + sheet.use(1) + return + if(attacking_item.force > 0) + attacked_stacks += 10 + if(prob(25)) + user.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + to_chat(user, span_danger("[attacking_item] passes right through [src]!")) + return + if(discipline_stacks && prob(50)) // wow, buddy, why am I getting attacked?? + discipline_stacks = 0 + if(attacking_item.force >= 3) + var/force_effect = attacking_item.force * (life_stage == SLIME_LIFE_STAGE_BABY ? 2 : 1) + if(prob(10 + force_effect)) + discipline_slime(user) + + if(!istype(attacking_item, /obj/item/storage/bag/xeno)) + return ..() + + var/obj/item/storage/xeno_bag = attacking_item + if(!crossbreed_modification) + to_chat(user, span_warning("The slime is not currently being mutated.")) + return + var/has_output = FALSE //Have we outputted text? + var/has_found = FALSE //Have we found an extract to be added? + for(var/obj/item/slime_extract/extract in xeno_bag.contents) + if(extract.crossbreed_modification == crossbreed_modification) + xeno_bag.atom_storage.attempt_remove(extract, get_turf(src), silent = TRUE) + qdel(extract) + applied_crossbreed_amount++ + has_found = TRUE + if(applied_crossbreed_amount >= SLIME_EXTRACT_CROSSING_REQUIRED) + to_chat(user, span_notice("You feed the slime as many of the extracts from the bag as you can, and it mutates!")) + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + spawn_corecross() + has_output = TRUE + break + + if(has_output) + return + + if(!has_found) + to_chat(user, span_warning("There are no extracts in the bag that this slime will accept!")) + else + to_chat(user, span_notice("You feed the slime some extracts from the bag.")) + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + return diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index e17fd09e0fa..be158abaed5 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -1,6 +1,4 @@ -#define SLIME_HUNGER_NONE 0 -#define SLIME_HUNGER_HUNGRY 1 -#define SLIME_HUNGER_STARVING 2 + /mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) @@ -34,84 +32,6 @@ return return ..() -/// the master AI process -/mob/living/simple_animal/slime/proc/process_slime_ai() - - if(slime_ai_processing || stat || client) - return - - var/hungry = SLIME_HUNGER_NONE - if (nutrition < get_starve_nutrition()) - hungry = SLIME_HUNGER_STARVING - else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = SLIME_HUNGER_HUNGRY - - slime_ai_processing = TRUE - - while(slime_ai_processing && stat != DEAD && (attacked_stacks || hungry || rabid || buckled)) - if(!(mobility_flags & MOBILITY_MOVE)) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == DEAD) - set_target(null) - slime_ai_processing = FALSE - break - - if(Target) - if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) - set_target(null) - slime_ai_processing = FALSE - break - if(!slime_ai_processing) - break - - if(Target in view(1,src)) - if(!can_feed_on(Target)) //If they're not able to be fed upon, ignore them. - if(!is_attack_on_cooldown) - is_attack_on_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) - - if(Target.Adjacent(src)) - Target.attack_slime(src) - break - if((Target.body_position == STANDING_UP) && prob(80)) - - if(Target.client && Target.health >= 20) - if(!is_attack_on_cooldown) - is_attack_on_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) - - if(Target.Adjacent(src)) - Target.attack_slime(src) - - else - if(!is_attack_on_cooldown && Target.Adjacent(src)) - start_feeding(Target) - - else - if(!is_attack_on_cooldown && Target.Adjacent(src)) - start_feeding(Target) - - else if(Target in view(7, src)) - if(!Target.Adjacent(src)) - // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - else - set_target(null) - slime_ai_processing = FALSE - break - - var/sleeptime = cached_multiplicative_slowdown - if(sleeptime <= 0) - sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - slime_ai_processing = FALSE - /mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) var/loc_temp = get_temperature(environment) var/divisor = 10 /// The divisor controls how fast body temperature changes, lower causes faster changes @@ -209,7 +129,7 @@ if(need_mob_update) animal_victim.updatehealth() - if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop + if(totaldamage >= 0) // AdjustBruteLoss returns a negative value on succesful damage adjustment stop_feeding(FALSE, FALSE) return @@ -230,411 +150,32 @@ return if(SPT_PROB(7.5, seconds_per_tick)) - adjust_nutrition(-0.5 * (1 + is_adult) * seconds_per_tick) + adjust_nutrition((life_stage == SLIME_LIFE_STAGE_ADULT ? -1 : -0.5) * seconds_per_tick) if(nutrition <= 0) set_nutrition(0) if(SPT_PROB(50, seconds_per_tick)) adjustBruteLoss(rand(0,5)) - else if (nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD) + else if (nutrition >= grow_nutrition && amount_grown < SLIME_EVOLUTION_THRESHOLD) adjust_nutrition(-10 * seconds_per_tick) amount_grown++ update_mob_action_buttons() if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey) - if(is_adult && loc.AllowDrop()) + if(life_stage == SLIME_LIFE_STAGE_ADULT && loc.AllowDrop()) Reproduce() else Evolve() ///Adds nutrition to the slime's nutrition level. Has a chance to increase its electric levels. /mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) - set_nutrition(min((nutrition + nutrition_to_add), get_max_nutrition())) - if(nutrition >= get_grow_nutrition()) - if(powerlevel<10) + set_nutrition(min((nutrition + nutrition_to_add), max_nutrition)) + if(nutrition >= grow_nutrition) + if(powerlevel= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level. - if(powerlevel<5) + else if(nutrition >= hunger_nutrition + 100) //can't get power levels unless you're a bit above hunger level. + if(powerlevel 50) - attacked_stacks = 50 - - if(attacked_stacks > 0) - attacked_stacks-- - - if(discipline_stacks > 0) - - if(discipline_stacks >= 5 && rabid) - if(SPT_PROB(37, seconds_per_tick)) - rabid = FALSE - - if(SPT_PROB(5, seconds_per_tick)) - discipline_stacks-- - - if(client) //player controlled slimes can decide for themselves - return - - if(!(mobility_flags & MOBILITY_MOVE)) - return - - if(buckled) - return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if (target_patience <= 0 || stunned_until > world.time || discipline_stacks || attacked_stacks || docile) // Tired of chasing or something draws out attention - target_patience = 0 - set_target(null) - - if(slime_ai_processing && stunned_until > world.time) - return - - var/hungry = SLIME_HUNGER_NONE // determines if the slime is hungry - - if (nutrition < get_starve_nutrition()) - hungry = SLIME_HUNGER_STARVING - else if (nutrition < get_grow_nutrition() && SPT_PROB(13, seconds_per_tick) || nutrition < get_hunger_nutrition()) - hungry = SLIME_HUNGER_HUNGRY - - if(hungry == SLIME_HUNGER_STARVING && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && SPT_PROB(0.5, seconds_per_tick)) - var/mob/nofriend = pick(Friends) - add_friendship(nofriend, -1) - - if(!Target) //If we have no target, try to add a target - if(will_hunt() && hungry || attacked_stacks || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - var/ally = FALSE - for(var/F in faction) - if(F == FACTION_NEUTRAL) //slimes are neutral so other mobs not target them, but they can target neutral mobs - continue - if(F in L.faction) - ally = TRUE - break - if(ally) - continue - - if(issilicon(L) && (rabid || attacked_stacks)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time. - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked_stacks || rabid || hungry == SLIME_HUNGER_STARVING) - set_target(targets[1]) // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!discipline_stacks && SPT_PROB(2.5, seconds_per_tick)) - if(ishuman(C) || isalienadult(C)) - set_target(C) - break - - if(islarva(C) || ismonkey(C)) - set_target(C) - break - - if (Target) - target_patience = rand(5, 7) - if (is_adult) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if (Leader) - if(holding_still) - holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if (holding_still) - holding_still = max(holding_still - (0.5 * hungry * seconds_per_tick), 0) - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(50)) - step(src, pick(GLOB.cardinals)) - - else - if(holding_still) - holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) - else if (docile && pulledby) - holding_still = 10 - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33)) - step(src, pick(GLOB.cardinals)) - else if(!slime_ai_processing) - INVOKE_ASYNC(src, PROC_REF(process_slime_ai)) - -/mob/living/simple_animal/slime/handle_automated_movement() - return //slime random movement is currently handled in handle_targets() - -/mob/living/simple_animal/slime/handle_automated_speech() - return //slime random speech is currently handled in handle_speech() - -///Handles slime mood -/mob/living/simple_animal/slime/proc/handle_mood(seconds_per_tick, times_fired) - #define SLIME_MOOD_NONE "" - #define SLIME_MOOD_ANGRY "angry" - #define SLIME_MOOD_MISCHIEVOUS "mischievous" - #define SLIME_MOOD_POUT "pout" - #define SLIME_MOOD_SAD "sad" - #define SLIME_MOOD_SMILE ":3" - - var/newmood = SLIME_MOOD_NONE - if (rabid || attacked_stacks) - newmood = SLIME_MOOD_ANGRY - else if (docile) - newmood = SLIME_MOOD_SMILE - else if (Target) - newmood = SLIME_MOOD_MISCHIEVOUS - - if (!newmood) - if (discipline_stacks && SPT_PROB(13, seconds_per_tick)) - newmood = SLIME_MOOD_POUT - else if (SPT_PROB(0.5, seconds_per_tick)) - newmood = pick(SLIME_MOOD_SAD, ":3", SLIME_MOOD_POUT) - - if ((current_mood == SLIME_MOOD_SAD || current_mood == SLIME_MOOD_SMILE || current_mood == SLIME_MOOD_POUT) && !newmood) - if(SPT_PROB(50, seconds_per_tick)) - newmood = current_mood - - if (newmood != current_mood) // This is so we don't redraw them every time - current_mood = newmood - regenerate_icons() - - #undef SLIME_MOOD_NONE - #undef SLIME_MOOD_ANGRY - #undef SLIME_MOOD_MISCHIEVOUS - #undef SLIME_MOOD_POUT - #undef SLIME_MOOD_SAD - #undef SLIME_MOOD_SMILE - -///Handles the slime understanding commends spoken to it -/mob/living/simple_animal/slime/proc/handle_speech(seconds_per_tick, times_fired) - //Speech understanding starts here - var/to_say - if (speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if ((findtext(phrase, num2text(slime_id)) || findtext(phrase, "slimes"))) // Talking to us - if (findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if (findtext(phrase, "follow")) - if (Leader) - if (Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Follow...") - else if (Friends[who] > Friends[Leader]) // VIVA - set_leader(who) - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) - set_leader(who) - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I no follow...") - else if (findtext(phrase, "stop")) - if (buckled) // We are asked to stop feeding - if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) - stop_feeding() - set_target(null) - if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) - add_friendship(who, -1) - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Target) // We are asked to stop chasing - if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) - set_target(null) - if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) - add_friendship(who, -1) - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Leader) // We are asked to stop following - if (Leader == who) - to_say = "Yes... I stay..." - set_leader(null) - else - if (Friends[who] > Friends[Leader]) - set_leader(null) - to_say = "Yes... I stop..." - else - to_say = "No... keep follow..." - else if (findtext(phrase, "stay")) - if (Leader) - if (Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... stay..." - else if (Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... stay..." - else - to_say = "No... keep follow..." - else - if (Friends[who] >= SLIME_FRIENDSHIP_STAY) - holding_still = Friends[who] * 10 - to_say = "Yes... stay..." - else - to_say = "No... won't stay..." - else if (findtext(phrase, "attack")) - if (rabid && prob(20)) - set_target(who) - process_slime_ai() //Wake up the slime's Target AI, needed otherwise this doesn't work - to_say = "ATTACK!?!?" - else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK) - for (var/mob/living/possible_target in view(7,src)-list(src,who)) - if (findtext(phrase, lowertext(possible_target.name))) - if (isslime(possible_target)) - to_say = "NO... [possible_target] slime friend" - add_friendship(who, -1) //Don't ask a slime to attack its friend - else if(!Friends[possible_target] || Friends[possible_target] < 1) - set_target(possible_target) - process_slime_ai()//Wake up the slime's Target AI, needed otherwise this doesn't work - to_say = "Ok... I attack [Target]" - else - to_say = "No... like [possible_target] ..." - add_friendship(who, -1) //Don't ask a slime to attack its friend - break - else - to_say = "No... no listen" - - speech_buffer = list() - - //Speech starts here - if (to_say) - say (to_say) - else if(SPT_PROB(0.5, seconds_per_tick)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/speech_chance = 10 - var/slimes_near = 0 - var/dead_slimes = 0 - var/friends_near = list() - for (var/mob/living/seen_mob in view(7,src)) - if(isslime(seen_mob) && seen_mob != src) - ++slimes_near - if (seen_mob.stat == DEAD) - ++dead_slimes - if (seen_mob in Friends) - speech_chance += 20 - friends_near += seen_mob - if (nutrition < get_hunger_nutrition()) - speech_chance += 10 - if (nutrition < get_starve_nutrition()) - speech_chance += 10 - if (SPT_PROB(1, seconds_per_tick) && prob(speech_chance)) - var/phrases = list() - if (Target) - phrases += "[Target]... look yummy..." - if (nutrition < get_starve_nutrition()) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if (nutrition < get_hunger_nutrition()) - phrases += "Hungry..." - phrases += "Where food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if (rabid || attacked_stacks) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if (current_mood == ":3") - phrases += "Purr..." - if (attacked_stacks) - phrases += "Grrr..." - if (bodytemperature < T0C) - phrases += "Cold..." - if (bodytemperature < T0C - 30) - phrases += "So... cold..." - phrases += "Very... cold..." - if (bodytemperature < T0C - 50) - phrases += "..." - phrases += "C... c..." - if (buckled) - phrases += "Nom..." - phrases += "Yummy..." - if (powerlevel > 3) - phrases += "Bzzz..." - if (powerlevel > 5) - phrases += "Zap..." - if (powerlevel > 8) - phrases += "Zap... Bzz..." - if (current_mood == "sad") - phrases += "Bored..." - if (slimes_near) - phrases += "Slime friend..." - if (slimes_near > 1) - phrases += "Slime friends..." - if (dead_slimes) - phrases += "What happened?" - if (!slimes_near) - phrases += "Lonely..." - for (var/friend in friends_near) - phrases += "[friend]... friend..." - if (nutrition < get_hunger_nutrition()) - phrases += "[friend]... feed me..." - if(!stat) - say (pick(phrases)) - -/// Can't go above it -/mob/living/simple_animal/slime/proc/get_max_nutrition() - if (is_adult) - return 1200 - else - return 1000 - -/// Above it we grow, below it we can eat -/mob/living/simple_animal/slime/proc/get_grow_nutrition() - if (is_adult) - return 1000 - else - return 800 - -/// Below it we will always eat -/mob/living/simple_animal/slime/proc/get_hunger_nutrition() - if (is_adult) - return 600 - else - return 500 - -/// Below it we will eat before everything else -/mob/living/simple_animal/slime/proc/get_starve_nutrition() - if(is_adult) - return 300 - else - return 200 -/// Check for being stopped from feeding and chasing -/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) - if (docile) - return FALSE - if (hunger == SLIME_HUNGER_STARVING || rabid || attacked_stacks) - return TRUE - if (Leader) - return FALSE - if (holding_still) - return FALSE - return TRUE - -#undef SLIME_HUNGER_NONE -#undef SLIME_HUNGER_HUNGRY -#undef SLIME_HUNGER_STARVING diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 32c60f63adc..a99a79a311a 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -30,11 +30,19 @@ if(stat) return FALSE + if(buckled) + stop_feeding() + return TRUE + var/list/choices = list() for(var/mob/living/nearby_mob in view(1,src)) - if(nearby_mob != src && Adjacent(nearby_mob)) + if(nearby_mob != src && Adjacent(nearby_mob) && nearby_mob.appears_alive()) choices += nearby_mob + if(length(choices) == 1) + start_feeding(choices[1]) + return TRUE + var/choice = tgui_input_list(src, "Who do you wish to feed on?", "Slime Feed", sort_names(choices)) if(isnull(choice)) return FALSE @@ -133,25 +141,27 @@ ///The slime will stop feeding /mob/living/simple_animal/slime/proc/stop_feeding(silent = FALSE, living=TRUE) - if(buckled) - if(!living) - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") + if(!buckled) + return - var/mob/living/victim = buckled + if(!living) + to_chat(src, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") - if(istype(victim)) - var/bio_protection = 100 - victim.getarmor(null, BIO) - if(prob(bio_protection)) - victim.apply_status_effect(/datum/status_effect/slimed, slime_type.rgb_code, slime_type.colour == SLIME_TYPE_RAINBOW) + var/mob/living/victim = buckled - if(!silent) - visible_message(span_warning("[src] lets go of [buckled]!"), \ - span_notice("I stopped feeding.")) - layer = initial(layer) - buckled.unbuckle_mob(src,force=TRUE) + if(istype(victim)) + var/bio_protection = 100 - victim.getarmor(null, BIO) + if(prob(bio_protection)) + victim.apply_status_effect(/datum/status_effect/slimed, slime_type.rgb_code, slime_type.colour == SLIME_TYPE_RAINBOW) + + if(!silent) + visible_message(span_warning("[src] lets go of [buckled]!"), \ + span_notice("I stopped feeding.")) + layer = initial(layer) + buckled.unbuckle_mob(src,force=TRUE) /mob/living/simple_animal/slime/verb/Evolve() set category = "Slime" @@ -160,19 +170,16 @@ if(stat) to_chat(src, "I must be conscious to do this...") return - if(is_adult) + if(life_stage == SLIME_LIFE_STAGE_ADULT) to_chat(src, "I have already evolved...") return if(amount_grown < SLIME_EVOLUTION_THRESHOLD) to_chat(src, "I am not ready to evolve yet...") return - is_adult = TRUE - maxHealth = 200 + set_life_stage(SLIME_LIFE_STAGE_ADULT) amount_grown = 0 - for(var/datum/action/innate/slime/evolve/evolve_action in actions) - evolve_action.Remove(src) - GRANT_ACTION(/datum/action/innate/slime/reproduce) + regenerate_icons() update_name() @@ -196,7 +203,7 @@ if(!isopenturf(loc)) balloon_alert(src, "can't reproduce here!") - if(!is_adult) + if(life_stage != SLIME_LIFE_STAGE_ADULT) balloon_alert(src, "not old enough to reproduce!") return diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index b4fbd05add0..c65169b1ec1 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -1,4 +1,8 @@ -#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends))) +#define SLIME_EXTRA_SHOCK_COST 3 +#define SLIME_EXTRA_SHOCK_THRESHOLD 8 +#define SLIME_BASE_SHOCK_PERCENTAGE 10 +#define SLIME_SHOCK_PERCENTAGE_PER_LEVEL 7 + /mob/living/simple_animal/slime name = "grey baby slime (123)" icon = 'icons/mob/simple/slimes.dmi' @@ -10,6 +14,8 @@ harm_intent_damage = 5 icon_living = "grey baby slime" icon_dead = "grey baby slime dead" + attack_verb_simple = "glomp" + attack_verb_continuous = "glomps" response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "shoos" @@ -28,6 +34,7 @@ mob_biotypes = MOB_SLIME melee_damage_lower = 5 melee_damage_upper = 25 + wound_bonus = -45 verb_say = "blorbles" verb_ask = "inquisitively blorbles" @@ -42,17 +49,25 @@ //Physiology - ///Is the slime an adult slime? - var/is_adult = TRUE + ///What is our current lifestage? + var/life_stage = SLIME_LIFE_STAGE_BABY ///The number of /obj/item/slime_extract's the slime has left inside var/cores = 1 ///Chance of mutating, should be between 25 and 35 var/mutation_chance = 30 ///1-10 controls how much electricity they are generating - var/powerlevel = 0 + var/powerlevel = SLIME_MIN_POWER ///Controls how long the slime has been overfed, if 10, grows or reproduces var/amount_grown = 0 + ///The maximum amount of nutrition a slime can contain + var/max_nutrition = 1000 + /// Above it we grow our amount_grown and our power_level, below it we can eat + var/grow_nutrition = 800 + /// Below this, we feel hungry + var/hunger_nutrition = 500 + /// Below this, we feel starving + var/starve_nutrition = 200 ///Has a mutator been used on the slime? Only one is allowed var/mutator_used = FALSE @@ -106,20 +121,12 @@ ///Last phrase said near it and person who said it var/list/speech_buffer = list() -/mob/living/simple_animal/slime/Initialize(mapload, new_type=/datum/slime_type/grey, new_is_adult=FALSE) +/mob/living/simple_animal/slime/Initialize(mapload, new_type=/datum/slime_type/grey, new_life_stage=SLIME_LIFE_STAGE_BABY) var/datum/action/innate/slime/feed/feeding_action = new feeding_action.Grant(src) - is_adult = new_is_adult + set_life_stage(new_life_stage) - if(is_adult) - var/datum/action/innate/slime/reproduce/reproduce_action = new - reproduce_action.Grant(src) - health = 200 - maxHealth = 200 - else - var/datum/action/innate/slime/evolve/evolve_action = new - evolve_action.Grant(src) set_slime_type(new_type) . = ..() set_nutrition(700) @@ -129,6 +136,8 @@ ADD_TRAIT(src, TRAIT_CANT_RIDE, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + RegisterSignal(src, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(slime_pre_attack)) + /mob/living/simple_animal/slime/Destroy() for (var/A in actions) var/datum/action/AC = A @@ -139,34 +148,25 @@ return ..() ///Random slime subtype -/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) - . = ..(mapload, pick(subtypesof(/datum/slime_type)), prob(50)) +/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_life_stage) + . = ..(mapload, pick(subtypesof(/datum/slime_type)), prob(50) ? SLIME_LIFE_STAGE_ADULT : SLIME_LIFE_STAGE_BABY) ///Friendly docile subtype /mob/living/simple_animal/slime/pet docile = TRUE -/mob/living/simple_animal/slime/proc/set_slime_type(new_type) - slime_type = new new_type - update_name() - regenerate_icons() - /mob/living/simple_animal/slime/update_name() ///Checks if the slime has a generic name, in the format of baby/adult slime (123) var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") if(slime_name_regex.Find(name)) slime_id = rand(1, 1000) - name = "[slime_type.colour] [is_adult ? "adult" : "baby"] slime ([slime_id])" + name = "[slime_type.colour] [life_stage] slime ([slime_id])" real_name = name return ..() -///randomizes the colour of a slime -/mob/living/simple_animal/slime/proc/random_colour() - set_slime_type(pick(subtypesof(/datum/slime_type))) - /mob/living/simple_animal/slime/regenerate_icons() cut_overlays() - var/icon_text = "[slime_type.colour] [is_adult ? "adult" : "baby"] slime" + var/icon_text = "[slime_type.colour] [life_stage] slime" icon_dead = "[icon_text] dead" if(stat != DEAD) icon_state = icon_text @@ -197,39 +197,46 @@ if(mod) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod) -/mob/living/simple_animal/slime/ObjBump(obj/O) - if(!client && powerlevel > 0) - var/probab = 10 - switch(powerlevel) - if(1 to 2) - probab = 20 - if(3 to 4) - probab = 30 - if(5 to 6) - probab = 40 - if(7 to 8) - probab = 60 - if(9) - probab = 70 - if(10) - probab = 95 - if(prob(probab)) - if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !is_attack_on_cooldown) - if (is_adult || prob(5)) - O.attack_slime(src) - is_attack_on_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) +/mob/living/simple_animal/slime/ObjBump(obj/bumped_object) + if(client || powerlevel <= SLIME_MIN_POWER) // slimes with people in control can't accidentally attack + return -/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - return 2 + if (life_stage != SLIME_LIFE_STAGE_ADULT && !prob(5)) //its rare for baby slimes to actually damage windows + return + + var/accidental_attack_probability = 10 + switch(powerlevel) + if(1 to 2) + accidental_attack_probability = 20 + if(3 to 4) + accidental_attack_probability = 30 + if(5 to 6) + accidental_attack_probability = 40 + if(7 to 8) + accidental_attack_probability = 60 + if(9) + accidental_attack_probability = 70 + if(10) + accidental_attack_probability = 95 + if(!prob(accidental_attack_probability)) + return + + if(!istype(bumped_object, /obj/structure/window) && !istype(bumped_object, /obj/structure/grille)) + return + + if(nutrition > hunger_nutrition || is_attack_on_cooldown) //hungry slimes and slimes on cooldown will not attack + return + + bumped_object.attack_animal(src) + is_attack_on_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, is_attack_on_cooldown, FALSE), 4.5 SECONDS) /mob/living/simple_animal/slime/get_status_tab_items() . = ..() if(!docile) - . += "Nutrition: [nutrition]/[get_max_nutrition()]" + . += "Nutrition: [nutrition]/[max_nutrition]" if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - if(is_adult) + if(life_stage == SLIME_LIFE_STAGE_ADULT) . += "You can reproduce!" else . += "You can evolve!" @@ -241,17 +248,6 @@ . += "Power Level: [powerlevel]" -/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - if(!forced) - amount = -abs(amount) - return ..() //Heals them - -/mob/living/simple_animal/slime/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - powerlevel = 0 // oh no, the power! - /mob/living/simple_animal/slime/MouseDrop(atom/movable/target_atom as mob|obj) if(isliving(target_atom) && target_atom != src && usr == src) var/mob/living/Food = target_atom @@ -268,173 +264,9 @@ /mob/living/simple_animal/slime/attack_ui(slot, params) return -/mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/attacking_slime, list/modifiers) - if(..()) //successful slime attack - if(attacking_slime == src) - return - if(buckled) - stop_feeding(silent = TRUE) - visible_message(span_danger("[attacking_slime] pulls [src] off!"), \ - span_danger("You pull [src] off!")) - return - attacked_stacks += 5 - if(nutrition >= 100) //steal some nutrition. negval handled in life() - adjust_nutrition(-(50 + (40 * attacking_slime.is_adult))) - attacking_slime.add_nutrition(50 + (40 * attacking_slime.is_adult)) - if(health > 0) - attacking_slime.adjustBruteLoss(-10 + (-10 * attacking_slime.is_adult)) - attacking_slime.updatehealth() - -/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/user, list/modifiers) - . = ..() - if(.) - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/human/user, list/modifiers) - if(..()) //successful monkey bite. - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L, list/modifiers) - if(..()) //successful larva bite. - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - discipline_slime(user) - -/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(buckled) - user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - if(buckled == user) - if(prob(60)) - user.visible_message(span_warning("[user] attempts to wrestle \the [name] off!"), \ - span_danger("You attempt to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - - else - user.visible_message(span_warning("[user] manages to wrestle \the [name] off!"), \ - span_notice("You manage to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - - discipline_slime(user) - - else - if(prob(30)) - buckled.visible_message(span_warning("[user] attempts to wrestle \the [name] off of [buckled]!"), \ - span_warning("[user] attempts to wrestle \the [name] off of you!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - - else - buckled.visible_message(span_warning("[user] manages to wrestle \the [name] off of [buckled]!"), \ - span_notice("[user] manage to wrestle \the [name] off of you!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - - discipline_slime(user) - else - if(stat == DEAD && surgeries.len) - if(!user.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) - for(var/datum/surgery/operations as anything in surgeries) - if(operations.next_step(user, modifiers)) - return TRUE - if(..()) //successful attack - attacked_stacks += 10 - -/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) - if(..()) //if harm or disarm intent. - attacked_stacks += 10 - discipline_slime(user) - - -/mob/living/simple_animal/slime/attackby(obj/item/attacking_item, mob/living/user, params) - if(stat == DEAD && surgeries.len) - var/list/modifiers = params2list(params) - if(!user.combat_mode || (LAZYACCESS(modifiers, RIGHT_CLICK))) - for(var/datum/surgery/operations as anything in surgeries) - if(operations.next_step(user, modifiers)) - return TRUE - if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma) && !stat) //Lets you feed slimes plasma. - add_friendship(user, 1) - to_chat(user, span_notice("You feed the slime the plasma. It chirps happily.")) - var/obj/item/stack/sheet/mineral/plasma/sheet = attacking_item - sheet.use(1) - return - if(attacking_item.force > 0) - attacked_stacks += 10 - if(prob(25)) - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - to_chat(user, span_danger("[attacking_item] passes right through [src]!")) - return - if(discipline_stacks && prob(50)) // wow, buddy, why am I getting attacked?? - discipline_stacks = 0 - if(attacking_item.force >= 3) - var/force_effect = 2 * attacking_item.force - if(is_adult) - force_effect = round(attacking_item.force/2) - if(prob(10 + force_effect)) - discipline_slime(user) - - if(!istype(attacking_item, /obj/item/storage/bag/xeno)) - return ..() - - var/obj/item/storage/xeno_bag = attacking_item - if(!crossbreed_modification) - to_chat(user, span_warning("The slime is not currently being mutated.")) - return - var/has_output = FALSE //Have we outputted text? - var/has_found = FALSE //Have we found an extract to be added? - for(var/obj/item/slime_extract/extract in xeno_bag.contents) - if(extract.crossbreed_modification == crossbreed_modification) - xeno_bag.atom_storage.attempt_remove(extract, get_turf(src), silent = TRUE) - qdel(extract) - applied_crossbreed_amount++ - has_found = TRUE - if(applied_crossbreed_amount >= SLIME_EXTRACT_CROSSING_REQUIRED) - to_chat(user, span_notice("You feed the slime as many of the extracts from the bag as you can, and it mutates!")) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - spawn_corecross() - has_output = TRUE - break - - if(has_output) - return - - if(!has_found) - to_chat(user, span_warning("There are no extracts in the bag that this slime will accept!")) - else - to_chat(user, span_notice("You feed the slime some extracts from the bag.")) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - return - - -///Spawns a crossed slimecore item -/mob/living/simple_animal/slime/proc/spawn_corecross() - var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) - visible_message(span_danger("[src] shudders, its mutated core consuming the rest of its body!")) - playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) - var/selected_crossbreed_path - for(var/crossbreed_path in crossbreeds) - var/obj/item/slimecross/cross_item = crossbreed_path - if(initial(cross_item.colour) == slime_type.colour && initial(cross_item.effect) == crossbreed_modification) - selected_crossbreed_path = cross_item - break - if(selected_crossbreed_path) - new selected_crossbreed_path(loc) - else - visible_message(span_warning("The mutated core shudders, and collapses into a puddle, unable to maintain its form.")) - qdel(src) - -/mob/living/simple_animal/slime/proc/apply_water() - adjustBruteLoss(rand(15,20)) - if(client) - return - - if(Target) // Like cats - set_target(null) - ++discipline_stacks - return +/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) + if(..()) + return 3 /mob/living/simple_animal/slime/examine(mob/user) . = list("This is [icon2html(src, user)] \a [src]!", EXAMINE_SECTION_BREAK) //SKYRAT EDIT CHANGE @@ -466,6 +298,70 @@ . += "" +/mob/living/simple_animal/slime/proc/apply_water() + adjustBruteLoss(rand(15,20)) + if(client) + return + + if(Target) // Like cats + set_target(null) + ++discipline_stacks + return + +///Changes the slime's current life state +/mob/living/simple_animal/slime/proc/set_life_stage(new_life_stage = SLIME_LIFE_STAGE_BABY) + life_stage = new_life_stage + + switch(life_stage) + if(SLIME_LIFE_STAGE_BABY) + for(var/datum/action/innate/slime/reproduce/reproduce_action in actions) + reproduce_action.Remove(src) + + GRANT_ACTION(/datum/action/innate/slime/evolve) + + health = initial(health) + maxHealth = initial(maxHealth) + + obj_damage = initial(obj_damage) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + wound_bonus = initial(wound_bonus) + + max_nutrition = initial(max_nutrition) + grow_nutrition = initial(grow_nutrition) + hunger_nutrition = initial(hunger_nutrition) + starve_nutrition = initial(starve_nutrition) + + if(SLIME_LIFE_STAGE_ADULT) + + for(var/datum/action/innate/slime/evolve/evolve_action in actions) + evolve_action.Remove(src) + + GRANT_ACTION(/datum/action/innate/slime/reproduce) + + health = 200 + maxHealth = 200 + + obj_damage = 15 + melee_damage_lower += 10 + melee_damage_upper += 10 + wound_bonus = -90 + + max_nutrition += 200 + grow_nutrition += 200 + hunger_nutrition += 100 + starve_nutrition += 100 + +///Sets the slime's type, name and its icons +/mob/living/simple_animal/slime/proc/set_slime_type(new_type) + slime_type = new new_type + update_name() + regenerate_icons() + +///randomizes the colour of a slime +/mob/living/simple_animal/slime/proc/random_colour() + set_slime_type(pick(subtypesof(/datum/slime_type))) + ///Makes a slime not attack people for a while /mob/living/simple_animal/slime/proc/discipline_slime(mob/user) if(stat) @@ -474,7 +370,7 @@ if(prob(80) && !client) discipline_stacks++ - if(!is_adult && discipline_stacks == 1) //if the slime is a baby and has not been overly disciplined, it will give up its grudge + if(life_stage == SLIME_LIFE_STAGE_BABY && discipline_stacks == 1) //if the slime is a baby and has not been overly disciplined, it will give up its grudge attacked_stacks = 0 set_target(null) @@ -494,66 +390,83 @@ if(user) step_away(src,user,15) -/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) - if(..()) - return 3 +///Spawns a crossed slimecore item +/mob/living/simple_animal/slime/proc/spawn_corecross() + var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) + visible_message(span_danger("[src] shudders, its mutated core consuming the rest of its body!")) + playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) + var/selected_crossbreed_path + for(var/crossbreed_path in crossbreeds) + var/obj/item/slimecross/cross_item = crossbreed_path + if(initial(cross_item.colour) == slime_type.colour && initial(cross_item.effect) == crossbreed_modification) + selected_crossbreed_path = cross_item + break + if(selected_crossbreed_path) + new selected_crossbreed_path(loc) + else + visible_message(span_warning("The mutated core shudders, and collapses into a puddle, unable to maintain its form.")) + qdel(src) -///Sets the slime's current attack target -/mob/living/simple_animal/slime/proc/set_target(new_target) - var/old_target = Target - Target = new_target - if(old_target && !SLIME_CARES_ABOUT(old_target)) - UnregisterSignal(old_target, COMSIG_QDELETING) - if(Target) - RegisterSignal(Target, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Sets the person the slime is following around -/mob/living/simple_animal/slime/proc/set_leader(new_leader) - var/old_leader = Leader - Leader = new_leader - if(old_leader && !SLIME_CARES_ABOUT(old_leader)) - UnregisterSignal(old_leader, COMSIG_QDELETING) - if(Leader) - RegisterSignal(Leader, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Alters the friendship value of the target -/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1) - if(!Friends[new_friend]) - Friends[new_friend] = 0 - Friends[new_friend] += amount - if(new_friend) - RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Sets the friendship value of the target -/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1) - Friends[new_friend] = amount - if(new_friend) - RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -///Removes someone from the friendlist -/mob/living/simple_animal/slime/proc/remove_friend(friend) - Friends -= friend - if(friend && !SLIME_CARES_ABOUT(friend)) - UnregisterSignal(friend, COMSIG_QDELETING) - -///Adds someone to the friend list -/mob/living/simple_animal/slime/proc/set_friends(new_buds) - clear_friends() - for(var/mob/friend as anything in new_buds) - set_friendship(friend, new_buds[friend]) - -///Removes everyone from the friend list -/mob/living/simple_animal/slime/proc/clear_friends() - for(var/mob/friend as anything in Friends) - remove_friend(friend) - -///The passed source will be no longer be the slime's target, leader, or one of its friends -/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source) +///Handles slime attacking restrictions, and any extra effects that would trigger +/mob/living/simple_animal/slime/proc/slime_pre_attack(mob/living/simple_animal/slime/our_slime, atom/target, proximity, modifiers) SIGNAL_HANDLER - if(source == Target) - set_target(null) - if(source == Leader) - set_leader(null) - remove_friend(source) + if(isAI(target)) //The aI is not tasty! + target.balloon_alert(our_slime, "not tasty!") + return COMPONENT_CANCEL_ATTACK_CHAIN -#undef SLIME_CARES_ABOUT + if(our_slime.buckled == target) //If you try to attack the creature you are latched on, you instead cancel feeding + our_slime.stop_feeding() + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(iscyborg(target)) + var/mob/living/silicon/robot/borg_target = target + borg_target.flash_act() + do_sparks(5, TRUE, borg_target) + var/stunprob = our_slime.powerlevel * SLIME_SHOCK_PERCENTAGE_PER_LEVEL + SLIME_BASE_SHOCK_PERCENTAGE + if(prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) + our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) + borg_target.apply_damage(our_slime.powerlevel * rand(6, 10), BRUTE, spread_damage = TRUE, wound_bonus = CANT_WOUND) + borg_target.visible_message(span_danger("The [our_slime.name] shocks [borg_target]!"), span_userdanger("The [our_slime.name] shocks you!")) + else + borg_target.visible_message(span_danger("The [our_slime.name] fails to hurt [borg_target]!"), span_userdanger("The [our_slime.name] failed to hurt you!")) + + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(iscarbon(target) && our_slime.powerlevel > SLIME_MIN_POWER) + var/mob/living/carbon/carbon_target = target + var/stunprob = our_slime.powerlevel * SLIME_SHOCK_PERCENTAGE_PER_LEVEL + SLIME_BASE_SHOCK_PERCENTAGE // 17 at level 1, 80 at level 10 + if(!prob(stunprob)) + return NONE // normal attack + + carbon_target.visible_message(span_danger("The [our_slime.name] shocks [carbon_target]!"), span_userdanger("The [our_slime.name] shocks you!")) + + do_sparks(5, TRUE, carbon_target) + var/power = our_slime.powerlevel + rand(0,3) + carbon_target.Paralyze(power * 2 SECONDS) + carbon_target.set_stutter_if_lower(power * 2 SECONDS) + if (prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) + our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) + carbon_target.apply_damage(our_slime.powerlevel * rand(6, 10), BURN, spread_damage = TRUE, wound_bonus = CANT_WOUND) + + if(isslime(target)) + if(target == our_slime) + return COMPONENT_CANCEL_ATTACK_CHAIN + var/mob/living/simple_animal/slime/target_slime = target + if(target_slime.buckled) + target_slime.stop_feeding(silent = TRUE) + visible_message(span_danger("[our_slime] pulls [target_slime] off!"), \ + span_danger("You pull [target_slime] off!")) + return NONE // normal attack + target_slime.attacked_stacks += 5 + var/is_adult_slime = our_slime.life_stage == SLIME_LIFE_STAGE_ADULT + if(target_slime.nutrition >= 100) //steal some nutrition. negval handled in life() + var/stolen_nutrition = is_adult_slime ? 90 : 50 + target_slime.adjust_nutrition(-stolen_nutrition) + our_slime.add_nutrition(stolen_nutrition) + if(target_slime.health > 0) + our_slime.adjustBruteLoss(is_adult_slime ? -20 : -10) + +#undef SLIME_EXTRA_SHOCK_COST +#undef SLIME_EXTRA_SHOCK_THRESHOLD +#undef SLIME_BASE_SHOCK_PERCENTAGE +#undef SLIME_SHOCK_PERCENTAGE_PER_LEVEL diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index f0bc01eb84c..72adcbb43df 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -56,6 +56,9 @@ // No tongue, no tastin' if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) return NONE + // Handled in here since the brain trauma can't modify taste directly (/datum/brain_trauma/severe/flesh_desire) + if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) + return GORE | MEAT return tongue.liked_foodtypes /** @@ -83,6 +86,8 @@ // No tongue, no tastin' if(!tongue) return TOXIC + if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) + return VEGETABLES | DAIRY | FRUIT | FRIED return tongue.toxic_foodtypes /** diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 51b8ed70a3b..2f013f855b8 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -99,6 +99,8 @@ update_client_colour() update_mouse_pointer() + refresh_looping_ambience() + if(client) if(client.view_size) client.view_size.resetToDefault() // Resets the client.view in case it was changed. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 19dd77251fc..3f646913f1c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -916,18 +916,6 @@ set hidden = TRUE set category = null return -/** - * Topic call back for any mob - * - * * Unset machines if "mach_close" sent - * * refresh the inventory of machines in range if "refresh" sent - * * handles the strip panel equip and unequip as well if "item" sent - */ -/mob/Topic(href, href_list) - if(href_list["mach_close"]) - var/t1 = "window=[href_list["mach_close"]]" - unset_machine() - src << browse(null, t1) /** * Controls if a mouse drop succeeds (return null if it doesnt) diff --git a/code/modules/mob/mob_lists.dm b/code/modules/mob/mob_lists.dm index 75904737c3f..9fd097a1fd6 100644 --- a/code/modules/mob/mob_lists.dm +++ b/code/modules/mob/mob_lists.dm @@ -53,8 +53,6 @@ GLOB.keyloop_list |= src else if(stat != DEAD || !SSlag_switch?.measures[DISABLE_DEAD_KEYLOOP]) GLOB.keyloop_list |= src - if(!SSticker.HasRoundStarted()) - return if(stat == DEAD) add_to_current_dead_players() else @@ -65,8 +63,6 @@ SHOULD_CALL_PARENT(TRUE) GLOB.player_list -= src GLOB.keyloop_list -= src - if(!SSticker.HasRoundStarted()) - return if(stat == DEAD) remove_from_current_dead_players() else @@ -75,13 +71,9 @@ ///Adds the cliented mob reference to either the list of dead player-mobs or to the list of observers, depending on how they joined the game. /mob/proc/add_to_current_dead_players() - if(!SSticker.HasRoundStarted()) - return GLOB.dead_player_list |= src /mob/dead/observer/add_to_current_dead_players() - if(!SSticker.HasRoundStarted()) - return if(started_as_observer) GLOB.current_observers_list |= src return @@ -92,13 +84,9 @@ ///Removes the mob reference from either the list of dead player-mobs or from the list of observers, depending on how they joined the game. /mob/proc/remove_from_current_dead_players() - if(!SSticker.HasRoundStarted()) - return GLOB.dead_player_list -= src /mob/dead/observer/remove_from_current_dead_players() - if(!SSticker.HasRoundStarted()) - return if(started_as_observer) GLOB.current_observers_list -= src return @@ -107,16 +95,12 @@ ///Adds the cliented mob reference to the list of living player-mobs. If the mob is an antag, it adds it to the list of living antag player-mobs. /mob/proc/add_to_current_living_players() - if(!SSticker.HasRoundStarted()) - return GLOB.alive_player_list |= src if(mind && (mind.special_role || length(mind.antag_datums))) add_to_current_living_antags() ///Removes the mob reference from the list of living player-mobs. If the mob is an antag, it removes it from the list of living antag player-mobs. /mob/proc/remove_from_current_living_players() - if(!SSticker.HasRoundStarted()) - return GLOB.alive_player_list -= src if(LAZYLEN(mind?.antag_datums)) remove_from_current_living_antags() @@ -124,9 +108,6 @@ ///Adds the cliented mob reference to the list of living antag player-mobs. /mob/proc/add_to_current_living_antags() - if(!SSticker.HasRoundStarted()) - return - if (length(mind.antag_datums) == 0) return @@ -137,6 +118,4 @@ ///Removes the mob reference from the list of living antag player-mobs. /mob/proc/remove_from_current_living_antags() - if(!SSticker.HasRoundStarted()) - return GLOB.current_living_antags -= src diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 9f1e37ecd74..d06e7a8f6e7 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -348,6 +348,8 @@ /mob/proc/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, force_drop = FALSE) add_mob_memory(/datum/memory/was_slipped, antagonist = slipped_on) + SEND_SIGNAL(src, COMSIG_MOB_SLIPPED, knockdown_amount, slipped_on, lube_flags, paralyze, force_drop) + //bodypart selection verbs - Cyberboss //8: repeated presses toggles through head - eyes - mouth //9: eyes 8: head 7: mouth diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index f50d31d75cd..8ab32d9d4f4 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -236,5 +236,5 @@ display_spiders[initial(spider.name)] = option sort_list(display_spiders) - var/chosen_spider = show_radial_menu(user, egg, display_spiders, radius = 38) + var/chosen_spider = show_radial_menu(user, egg, display_spiders, radius = 38, require_near = TRUE) return spider_list[chosen_spider] diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index c8611ab7bd0..61bc4218622 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -760,6 +760,7 @@ armor_type = /datum/armor/mod_theme_safeguard resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + inbuilt_modules = list(/obj/item/mod/module/shove_blocker/locked) slowdown_inactive = 0.75 slowdown_active = 0.25 allowed_suit_storage = list( @@ -1772,7 +1773,7 @@ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, ), CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN, + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, ), GAUNTLETS_FLAGS = list( diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 3e4b89e6a52..0933c7e8f18 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -164,6 +164,7 @@ /obj/item/mod/module/pepper_shoulders, /obj/item/mod/module/criminalcapture, /obj/item/mod/module/dispenser/mirage, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/safeguard @@ -177,6 +178,7 @@ /obj/item/mod/module/megaphone, /obj/item/mod/module/projectile_dampener, /obj/item/mod/module/pepper_shoulders, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/jetpack, @@ -191,6 +193,7 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/pathfinder, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/jetpack/advanced, @@ -217,6 +220,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -236,6 +240,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -256,6 +261,7 @@ /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -291,6 +297,7 @@ /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -309,6 +316,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, /obj/item/mod/module/flamethrower, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/armor_booster, @@ -327,6 +335,7 @@ /obj/item/mod/module/quick_carry, /obj/item/mod/module/visor/diaghud, /obj/item/mod/module/hat_stabilizer/syndicate, + /obj/item/mod/module/quick_cuff, ) @@ -343,6 +352,7 @@ /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/hat_stabilizer/syndicate, /obj/item/mod/module/tether, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/enchanted @@ -353,6 +363,7 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield/advanced, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/ninja @@ -367,6 +378,7 @@ /obj/item/mod/module/dispenser/ninja, /obj/item/mod/module/dna_lock/reinforced, /obj/item/mod/module/emp_shield/pulse, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/stealth/ninja, @@ -404,6 +416,7 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, + /obj/item/mod/module/quick_cuff, ) /// The insignia type, insignias show what sort of member of the ERT you're dealing with. var/insignia_type = /obj/item/mod/module/insignia @@ -454,6 +467,7 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander @@ -483,6 +497,7 @@ /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/jetpack, @@ -496,6 +511,7 @@ /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, + /obj/item/mod/module/quick_cuff, ) /obj/item/mod/control/pre_equipped/corporate @@ -558,6 +574,8 @@ /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/anomaly_locked/kinesis/admin, + /obj/item/mod/module/shove_blocker, + /obj/item/mod/module/quick_cuff, ) default_pins = list( /obj/item/mod/module/stealth/ninja, diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 85d1ce7a00a..087718d14b3 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -94,10 +94,9 @@ return ..() /obj/item/implant/mod/get_data() - var/dat = {"Implant Specifications:
- Name: Nakamura Engineering Pathfinder Implant
- Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
"} - return dat + return "Implant Specifications:
\ + Name: Nakamura Engineering Pathfinder Implant
\ + Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
" /obj/item/implant/mod/proc/recall() if(!module?.mod) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index a5128996b62..c3b6998c5b5 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -424,7 +424,7 @@ if(oldgroup == newgroup) return - + sorted_creatures[oldgroup] -= creature sorted_creatures[newgroup] += creature @@ -578,3 +578,36 @@ #undef SHOOTING_ASSISTANT_OFF #undef STORMTROOPER_MODE #undef SHARPSHOOTER_MODE + +/obj/item/mod/module/anti_stagger + name = "MOD bulwark module" + desc = "Layers upon layers of shock dampening plates, just to stop you from getting shoved into a wall by an angry mob." + icon_state = "bulwark" + complexity = 3 + incompatible_modules = list(/obj/item/mod/module/shove_blocker) + +/obj/item/mod/module/shove_blocker/on_suit_activation() + mod.wearer.add_traits(list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) + +/obj/item/mod/module/shove_blocker/on_suit_deactivation(deleting = FALSE) + mod.wearer.remove_traits(list(TRAIT_SHOVE_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) + +/obj/item/mod/module/shove_blocker/locked + name = "superglued MOD bulwark module" + desc = "Layers upon layers of shock dampening plates, just to stop you from getting shoved into a wall by an angry mob. Good luck removing this one." + removable = FALSE + complexity = 0 + +/obj/item/mod/module/quick_cuff + name = "MOD restraint assist module" + desc = "Enhanced gauntlent grip pads that help with placing individuals in restraints more quickly. Doesn't look like they'll come off." + removable = FALSE + complexity = 0 + +/obj/item/mod/module/quick_cuff/on_suit_activation() + . = ..() + ADD_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT) + +/obj/item/mod/module/quick_cuff/on_suit_deactivation(deleting = FALSE) + . = ..() + REMOVE_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 420bfa74b54..7a30a20d104 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -110,6 +110,15 @@ ///The max amount of paper that can be held at once. var/max_paper = 30 + /// The capacity of the circuit shell component of this item + var/shell_capacity = SHELL_CAPACITY_MEDIUM + + /** + * Reference to the circuit shell component, because we're special and do special things with it, + * such as creating and deleting unremovable circuit comps based on the programs installed. + */ + var/datum/component/shell/shell + /datum/armor/item_modular_computer bullet = 20 laser = 20 @@ -120,6 +129,7 @@ START_PROCESSING(SSobj, src) if(!physical) physical = src + add_shell_component(shell_capacity) set_light_color(comp_light_color) set_light_range(comp_light_luminosity) if(looping_sound) @@ -137,6 +147,26 @@ register_context() update_appearance() +///Initialize the shell for this item, or the physical machinery it belongs to. +/obj/item/modular_computer/proc/add_shell_component(capacity = SHELL_CAPACITY_MEDIUM, shell_flags = NONE) + shell = physical.AddComponent(/datum/component/shell, list(new /obj/item/circuit_component/modpc), capacity, shell_flags) + RegisterSignal(shell, COMSIG_SHELL_CIRCUIT_ATTACHED, PROC_REF(on_circuit_attached)) + RegisterSignal(shell, COMSIG_SHELL_CIRCUIT_REMOVED, PROC_REF(on_circuit_removed)) + +/obj/item/modular_computer/proc/on_circuit_attached(datum/source) + SIGNAL_HANDLER + RegisterSignal(shell.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROC_REF(use_power_for_circuits)) + +///Try to draw power from our internal cell first, before switching to that of the circuit. +/obj/item/modular_computer/proc/use_power_for_circuits(datum/source, power_usage_per_input) + SIGNAL_HANDLER + if(use_power(power_usage_per_input, check_programs = FALSE)) + return COMPONENT_OVERRIDE_POWER_USAGE + +/obj/item/modular_computer/proc/on_circuit_removed(datum/source) + SIGNAL_HANDLER + UnregisterSignal(shell.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE) + /obj/item/modular_computer/proc/install_default_programs() SHOULD_CALL_PARENT(FALSE) for(var/programs in default_programs + starting_programs) @@ -158,6 +188,7 @@ if(computer_id_slot) QDEL_NULL(computer_id_slot) + shell = null physical = null return ..() @@ -246,7 +277,6 @@ if(computer_id_slot) return FALSE - computer_id_slot = inserting_id if(user) if(!user.transferItemToLoc(inserting_id, src)) return FALSE @@ -254,6 +284,8 @@ else inserting_id.forceMove(src) + computer_id_slot = inserting_id + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) if(ishuman(loc)) var/mob/living/carbon/human/human_wearer = loc @@ -261,6 +293,7 @@ human_wearer.sec_hud_set_ID() update_appearance() update_slot_icon() + SEND_SIGNAL(src, COMSIG_MODULAR_COMPUTER_INSERTED_ID, inserting_id, user) return TRUE /** @@ -438,29 +471,33 @@ /obj/item/modular_computer/proc/turn_on(mob/user, open_ui = TRUE) var/issynth = issilicon(user) // Robots and AIs get different activation messages. if(atom_integrity <= integrity_failure * max_integrity) - if(issynth) - to_chat(user, span_warning("You send an activation signal to \the [src], but it responds with an error code. It must be damaged.")) - else - to_chat(user, span_warning("You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")) + if(user) + if(issynth) + to_chat(user, span_warning("You send an activation signal to \the [src], but it responds with an error code. It must be damaged.")) + else + to_chat(user, span_warning("You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")) return FALSE if(use_power()) // checks if the PC is powered - if(issynth) - to_chat(user, span_notice("You send an activation signal to \the [src], turning it on.")) - else - to_chat(user, span_notice("You press the power button and start up \the [src].")) if(looping_sound) soundloop.start() enabled = TRUE update_appearance() - if(open_ui) - update_tablet_open_uis(user) + if(user) + if(issynth) + to_chat(user, span_notice("You send an activation signal to \the [src], turning it on.")) + else + to_chat(user, span_notice("You press the power button and start up \the [src].")) + if(open_ui) + update_tablet_open_uis(user) + SEND_SIGNAL(src, COMSIG_MODULAR_COMPUTER_TURNED_ON, user) return TRUE else // Unpowered - if(issynth) - to_chat(user, span_warning("You send an activation signal to \the [src] but it does not respond.")) - else - to_chat(user, span_warning("You press the power button but \the [src] does not respond.")) + if(user) + if(issynth) + to_chat(user, span_warning("You send an activation signal to \the [src] but it does not respond.")) + else + to_chat(user, span_warning("You press the power button but \the [src] does not respond.")) return FALSE // Process currently calls handle_power(), may be expanded in future if more things are added. @@ -572,18 +609,22 @@ if(program.computer != src) CRASH("tried to open program that does not belong to this computer") - if(!program || !istype(program)) // Program not found or it's not executable program. + if(isnull(program) || !istype(program)) // Program not found or it's not executable program. if(user) to_chat(user, span_danger("\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning.")) return FALSE + if(active_program == program) + return FALSE + // The program is already running. Resume it. if(program in idle_threads) + active_program?.background_program() active_program = program program.alert_pending = FALSE idle_threads.Remove(program) if(open_ui) - update_tablet_open_uis(user) + INVOKE_ASYNC(src, PROC_REF(update_tablet_open_uis), user) update_appearance(UPDATE_ICON) return TRUE @@ -603,10 +644,12 @@ if(!program.on_start(user)) return FALSE + active_program?.background_program() + active_program = program program.alert_pending = FALSE if(open_ui) - update_tablet_open_uis(user) + INVOKE_ASYNC(src, PROC_REF(update_tablet_open_uis), user) update_appearance(UPDATE_ICON) return TRUE @@ -652,6 +695,7 @@ physical.visible_message(span_notice("\The [src] shuts down.")) enabled = FALSE update_appearance() + SEND_SIGNAL(src, COMSIG_MODULAR_COMPUTER_SHUT_DOWN, loud) ///Imprints name and job into the modular computer, and calls back to necessary functions. ///Acts as a replacement to directly setting the imprints fields. All fields are optional, the proc will try to fill in missing gaps. @@ -682,10 +726,11 @@ * It is separated from ui_act() to be overwritten as needed. */ /obj/item/modular_computer/proc/toggle_flashlight(mob/user) - if(!has_light || !internal_cell || !internal_cell.charge) + if(!has_light || !internal_cell?.charge) return FALSE if(!COOLDOWN_FINISHED(src, disabled_time)) - balloon_alert(user, "disrupted!") + if(user) + balloon_alert(user, "disrupted!") return FALSE set_light_on(!light_on) update_appearance() @@ -886,17 +931,16 @@ return FALSE inserted_pai = card balloon_alert(user, "inserted pai") - var/datum/action/innate/pai/messenger/messenger_ability = new(inserted_pai.pai) - messenger_ability.Grant(inserted_pai.pai) + if(inserted_pai.pai) + inserted_pai.pai.give_messenger_ability() update_appearance(UPDATE_ICON) return TRUE /obj/item/modular_computer/proc/remove_pai(mob/user) if(!inserted_pai) return FALSE - var/datum/action/innate/pai/messenger/messenger_ability = locate() in inserted_pai.pai.actions - messenger_ability.Remove(inserted_pai.pai) - qdel(messenger_ability) + if(inserted_pai.pai) + inserted_pai.pai.remove_messenger_ability() if(user) user.put_in_hands(inserted_pai) balloon_alert(user, "removed pAI") diff --git a/code/modules/modular_computers/computers/item/computer_circuit.dm b/code/modules/modular_computers/computers/item/computer_circuit.dm new file mode 100644 index 00000000000..2a6a0d70be9 --- /dev/null +++ b/code/modules/modular_computers/computers/item/computer_circuit.dm @@ -0,0 +1,100 @@ +///A simple circuit component compatible with stationary consoles, laptops and PDAs, independent from programs. +/obj/item/circuit_component/modpc + display_name = "Modular Computer" + desc = "Circuit for basic functions of a modular computer." + var/obj/item/modular_computer/computer + ///Turns the PC on/off + var/datum/port/input/on_off + ///When set, will print a piece of paper with the value as text. + var/datum/port/input/print + + ///Sent when turned on + var/datum/port/output/is_on + ///Sent when shut down + var/datum/port/output/is_off + + ///Toggles lights on and off. Also RGB. + var/datum/port/input/lights + var/datum/port/input/red + var/datum/port/input/green + var/datum/port/input/blue + +/obj/item/circuit_component/modpc/register_shell(atom/movable/shell) + . = ..() + if(istype(shell, /obj/item/modular_computer)) + computer = shell + else if(istype(shell, /obj/machinery/modular_computer)) + var/obj/machinery/modular_computer/console = shell + computer = console.cpu + + if(isnull(computer)) + return + + RegisterSignal(computer, COMSIG_MODULAR_COMPUTER_TURNED_ON, PROC_REF(computer_on)) + RegisterSignal(computer, COMSIG_MODULAR_COMPUTER_SHUT_DOWN, PROC_REF(computer_off)) + + /** + * Some mod pc have lights while some don't, but populate_ports() + * is called before we get to know which object this has attahed to, + * I hope you're cool with me doing it here. + */ + if(computer.has_light && isnull(lights)) + lights = add_input_port("Toggle Lights", PORT_TYPE_SIGNAL) + red = add_input_port("Red", PORT_TYPE_NUMBER) + green = add_input_port("Green", PORT_TYPE_NUMBER) + blue = add_input_port("Blue", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/modpc/unregister_shell(atom/movable/shell) + if(computer) + UnregisterSignal(computer, list(COMSIG_MODULAR_COMPUTER_TURNED_ON, COMSIG_MODULAR_COMPUTER_SHUT_DOWN)) + computer = null + return ..() + +/obj/item/circuit_component/modpc/populate_ports() + on_off = add_input_port("Turn On/Off", PORT_TYPE_SIGNAL) + print = add_input_port("Print Text", PORT_TYPE_STRING) + + is_on = add_output_port("Turned On", PORT_TYPE_SIGNAL) + is_on = add_output_port("Shut Down", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/modpc/pre_input_received(datum/port/input/port) + if(isnull(computer)) + return + if(COMPONENT_TRIGGERED_BY(print, port)) + print.set_value(html_encode(trim(print.value, MAX_PAPER_LENGTH))) + else if(COMPONENT_TRIGGERED_BY(red, port)) + red.set_value(clamp(red.value, 0, 255)) + else if(COMPONENT_TRIGGERED_BY(blue, port)) + blue.set_value(clamp(blue.value, 0, 255)) + else if(COMPONENT_TRIGGERED_BY(green, port)) + green.set_value(clamp(green.value, 0, 255)) + +/obj/item/circuit_component/modpc/input_received(datum/port/input/port) + if(isnull(computer)) + return + if(COMPONENT_TRIGGERED_BY(on_off, port)) + if(computer.enabled) + INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, shutdown_computer)) + else + INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, turn_on)) + return + + if(!computer.enabled) + return + + if(COMPONENT_TRIGGERED_BY(print, port)) + computer.print_text(print.value) + + if(lights) + if(COMPONENT_TRIGGERED_BY(lights, port)) + computer.toggle_flashlight() + if(COMPONENT_TRIGGERED_BY(red, port) || COMPONENT_TRIGGERED_BY(green, port) || COMPONENT_TRIGGERED_BY(blue, port)) + computer.set_flashlight_color(rgb(red.value || 0, green.value || 0, blue.value || 0)) + +/obj/item/circuit_component/modpc/proc/computer_on(datum/source, mob/user) + SIGNAL_HANDLER + is_on.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/modpc/proc/computer_off(datum/source, loud) + SIGNAL_HANDLER + is_off.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index b68df9a4671..db3ecdb7747 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -3,23 +3,24 @@ ///Draws power from its rightful source (area if its a computer, the cell otherwise) ///Takes into account special cases, like silicon PDAs through override, and nopower apps. -/obj/item/modular_computer/proc/use_power(amount = 0) - if(check_power_override()) +/obj/item/modular_computer/proc/use_power(amount = 0, check_programs = TRUE) + if(check_power_override(amount)) return TRUE if(!internal_cell) return FALSE - if(!internal_cell.charge && (isnull(active_program) || !(active_program.program_flags & PROGRAM_RUNS_WITHOUT_POWER))) - close_all_programs() - for(var/datum/computer_file/program/programs as anything in stored_files) - if((programs.program_flags & PROGRAM_RUNS_WITHOUT_POWER) && open_program(program = programs)) - return TRUE + if(internal_cell.use(amount JOULES)) + return TRUE + if(!check_programs) return FALSE - - if(!internal_cell.use(amount JOULES)) - internal_cell.use(min(amount JOULES, internal_cell.charge)) //drain it anyways. - return FALSE - return TRUE + internal_cell.use(min(amount JOULES, internal_cell.charge)) //drain it anyways. + if(active_program?.program_flags & PROGRAM_RUNS_WITHOUT_POWER) + return TRUE + INVOKE_ASYNC(src, PROC_REF(close_all_programs)) + for(var/datum/computer_file/program/programs as anything in stored_files) + if((programs.program_flags & PROGRAM_RUNS_WITHOUT_POWER) && open_program(program = programs)) + return TRUE + return FALSE /obj/item/modular_computer/proc/give_power(amount) if(internal_cell) @@ -60,8 +61,8 @@ ///Returns TRUE if the PC should not be using any power, FALSE otherwise. ///Checks to see if the current app allows to be ran without power, if so we'll run with it. -/obj/item/modular_computer/proc/check_power_override() - return (!internal_cell?.charge && (active_program?.program_flags & PROGRAM_RUNS_WITHOUT_POWER)) +/obj/item/modular_computer/proc/check_power_override(amount) + return !amount && !internal_cell?.charge && (active_program?.program_flags & PROGRAM_RUNS_WITHOUT_POWER) //Integrated (Silicon) tablets don't drain power, because the tablet is required to state laws, so it being disabled WILL cause problems. /obj/item/modular_computer/pda/silicon/check_power_override() diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index f5ca1d74765..4313bf2efbd 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -146,7 +146,7 @@ if("PC_minimize") if(!active_program || (!isnull(internal_cell) && !internal_cell.charge)) return - active_program.background_program() + active_program.background_program(usr) return TRUE if("PC_killprogram") diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 0c2580a32d4..24e304fd5ef 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -26,6 +26,8 @@ comp_light_luminosity = 2.3 //this is what old PDAs were set to looping_sound = FALSE + shell_capacity = SHELL_CAPACITY_SMALL + ///The item currently inserted into the PDA, starts with a pen. var/obj/item/inserted_item = /obj/item/pen @@ -337,6 +339,10 @@ silicon_owner = null return ..() +///Silicons don't have the tools (or hands) to make circuits setups with their own PDAs. +/obj/item/modular_computer/pda/silicon/add_shell_component(capacity) + return + /obj/item/modular_computer/pda/silicon/turn_on(mob/user, open_ui = FALSE) if(silicon_owner?.stat != DEAD) return ..() diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index ea4839ac944..1d947a5574b 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -7,7 +7,8 @@ icon_state = null icon_state_unpowered = null icon_state_menu = null - hardware_flag = 0 + hardware_flag = NONE + internal_cell = /obj/item/stock_parts/cell/crap ///The modular computer MACHINE that hosts us. var/obj/machinery/modular_computer/machinery_computer @@ -25,7 +26,6 @@ physical = loc machinery_computer = loc machinery_computer.cpu = src - internal_cell = machinery_computer.internal_cell hardware_flag = machinery_computer.hardware_flag steel_sheet_cost = machinery_computer.steel_sheet_cost max_idle_programs = machinery_computer.max_idle_programs @@ -44,12 +44,12 @@ machinery_computer = null return ..() -/obj/item/modular_computer/processor/use_power(amount = 0) +/obj/item/modular_computer/processor/use_power(amount = 0, check_programs = TRUE) var/obj/machinery/machine_holder = physical if(machine_holder.powered()) machine_holder.use_power(amount) return TRUE - return FALSE + return ..() /obj/item/modular_computer/processor/relay_qdel() qdel(machinery_computer) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 7fd019c1bee..8fb32244e1d 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -1,3 +1,5 @@ +#define CPU_INTERACTABLE(user) (cpu && !HAS_TRAIT_FROM(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user))) + // Modular Computer - A machinery that is mostly just a host to the Modular Computer item. /obj/machinery/modular_computer name = "modular computer" @@ -9,8 +11,6 @@ max_integrity = 300 integrity_failure = 0.5 - ///The power cell, null by default as we use the APC we're in - var/internal_cell = null ///A flag that describes this device type var/hardware_flag = PROGRAM_CONSOLE /// Amount of programs that can be ran at once @@ -41,23 +41,43 @@ . = ..() cpu = new(src) cpu.screen_on = TRUE + cpu.add_shell_component(SHELL_CAPACITY_LARGE, SHELL_FLAG_USB_PORT) update_appearance() + register_context() /obj/machinery/modular_computer/Destroy() QDEL_NULL(cpu) return ..() +/obj/machinery/modular_computer/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Toggle processor interaction" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/modular_computer/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(HAS_TRAIT_FROM(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user))) + REMOVE_TRAIT(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user)) + balloon_alert(user, "now interacting with computer") + else + ADD_TRAIT(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user)) + balloon_alert(user, "now interacting with frame") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + /obj/machinery/modular_computer/examine(mob/user) - if(cpu) - return cpu.examine(user) - return ..() + . = cpu?.examine(user) || ..() + . += span_info("You can toggle interaction between computer and its machinery frame with [EXAMINE_HINT("Right-Click")] while empty-handed.") + var/frame_or_pc = HAS_TRAIT_FROM(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user)) ? "frame" : "computer" + . += span_info("Currently interacting with [EXAMINE_HINT(frame_or_pc)].") /obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user) . = ..() if(.) return - if(cpu) - cpu.attack_ghost(user) + cpu?.attack_ghost(user) /obj/machinery/modular_computer/emag_act(mob/user, obj/item/card/emag/emag_card) if(!cpu) @@ -98,17 +118,14 @@ /obj/machinery/modular_computer/AltClick(mob/user) . = ..() - if(!can_interact(user)) + if(CPU_INTERACTABLE(user) || !can_interact(user)) return - if(cpu) - cpu.AltClick(user) + cpu.AltClick(user) //ATTACK HAND IGNORING PARENT RETURN VALUE // On-click handling. Turns on the computer if it's off and opens the GUI. /obj/machinery/modular_computer/interact(mob/user) - if(cpu) - return cpu.interact(user) - return ..() + return CPU_INTERACTABLE(user) ? cpu.interact(user) : ..() // Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us. /obj/machinery/modular_computer/power_change() @@ -118,30 +135,33 @@ return return ..() +///Try to recharge our internal cell if it isn't fully charged. +/obj/machinery/modular_computer/process(seconds_per_tick) + var/obj/item/stock_parts/cell/cell = get_cell() + if(isnull(cell) || cell.percent() >= 100) + return + var/power_to_draw = idle_power_usage * seconds_per_tick * 0.5 + if(!use_power_from_net(power_to_draw)) + return + cell.give(power_to_draw) + +/obj/machinery/modular_computer/get_cell() + return cpu?.internal_cell + /obj/machinery/modular_computer/screwdriver_act(mob/user, obj/item/tool) - if(cpu) - return cpu.screwdriver_act(user, tool) - return ..() + return CPU_INTERACTABLE(user) ? cpu.screwdriver_act(user, tool) : ..() /obj/machinery/modular_computer/wrench_act_secondary(mob/user, obj/item/tool) - if(cpu) - return cpu.wrench_act_secondary(user, tool) - return ..() + return CPU_INTERACTABLE(user) ? cpu.wrench_act_secondary(user, tool) : ..() /obj/machinery/modular_computer/welder_act(mob/user, obj/item/tool) - if(cpu) - return cpu.welder_act(user, tool) - return ..() + return CPU_INTERACTABLE(user) ? cpu.welder_act(user, tool) : ..() -/obj/machinery/modular_computer/attackby(obj/item/W as obj, mob/living/user) - if (cpu && !user.combat_mode && !(obj_flags & NO_DECONSTRUCTION)) - return cpu.attackby(W, user) - return ..() +/obj/machinery/modular_computer/attackby(obj/item/weapon, mob/living/user) + return (CPU_INTERACTABLE(user) && !user.combat_mode) ? cpu.attackby(weapon, user) : ..() /obj/machinery/modular_computer/attacked_by(obj/item/attacking_item, mob/living/user) - if (cpu) - return cpu.attacked_by(attacking_item, user) - return ..() + return CPU_INTERACTABLE(user) ? cpu.attacked_by(attacking_item, user) : ..() // Stronger explosions cause serious damage to internal components // Minor explosions are mostly mitigitated by casing. @@ -170,6 +190,6 @@ // "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) - if(cpu) - return cpu.bullet_act(Proj) - return ..() + return cpu?.bullet_act(Proj) || ..() + +#undef CPU_INTERACTABLE diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 948257aa83c..7b4fc676091 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -52,6 +52,7 @@ ///Called post-installation of an application in a computer, after 'computer' var is set. /datum/computer_file/proc/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) computer_installing.stored_files.Add(src) /** diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 5ddb064f319..1b18e5a2924 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -44,6 +44,40 @@ var/alert_pending = FALSE /// How well this program will help combat detomatix viruses. var/detomatix_resistance = NONE + /// Unremovable circuit componentn added to the physical computer while the program is installed + var/obj/item/circuit_component/mod_program/circuit_comp_type + +/datum/computer_file/program/New() + ..() + ///We need to ensure that different programs (subtypes mostly) won't try to load in the same circuit comps into the shell or usb port of the modpc. + if(circuit_comp_type && initial(circuit_comp_type.associated_program) != type) + stack_trace("circuit comp type mismatch: [type] has circuit comp type \[[circuit_comp_type]\], while \[[circuit_comp_type]\] has associated program \[[initial(circuit_comp_type.associated_program)]\].") + +/** + * Here we deal with peculiarity of adding unremovable components to the computer shell. + * It probably doesn't look badass, but it's a decent way of doing it without taining the component with + * oddities like this. + */ +/datum/computer_file/program/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) + . = ..() + if(isnull(circuit_comp_type) || isnull(computer.shell)) + return + if(!(locate(circuit_comp_type) in computer.shell.unremovable_circuit_components)) + var/obj/item/circuit_component/mod_program/comp = new circuit_comp_type() + computer.shell.add_unremovable_circuit_component(comp) + if(computer.shell.attached_circuit) + comp.forceMove(computer.shell.attached_circuit) + computer.shell.attached_circuit.add_component(comp) + +///Here we deal with killing the associated components instead. +/datum/computer_file/program/Destroy() + if(isnull(circuit_comp_type) || isnull(computer?.shell)) + return ..() + for(var/obj/item/circuit_component/mod_program/comp in computer.shell.unremovable_circuit_components) + if(comp.associated_program == src) + computer.shell.unremovable_circuit_components -= comp + qdel(comp) + return ..() /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() @@ -67,10 +101,6 @@ /datum/computer_file/program/ui_interact(mob/user, datum/tgui/ui) SHOULD_CALL_PARENT(FALSE) -///We are not calling parent as it's handled by the computer itself, this is only called after. -/datum/computer_file/program/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) - SHOULD_CALL_PARENT(FALSE) - // Relays icon update to the computer. /datum/computer_file/program/proc/update_computer_icon() if(computer) @@ -167,12 +197,13 @@ **/ /datum/computer_file/program/proc/on_start(mob/living/user) SHOULD_CALL_PARENT(TRUE) - if(can_run(user, loud = TRUE)) - if(program_flags & PROGRAM_REQUIRES_NTNET) - var/obj/item/card/id/ID = computer.computer_id_slot?.GetID() - generate_network_log("Connection opened -- Program ID:[filename] User:[ID?"[ID.registered_name]":"None"]") - return TRUE - return FALSE + if(!can_run(user, loud = TRUE)) + return FALSE + if(program_flags & PROGRAM_REQUIRES_NTNET) + var/obj/item/card/id/ID = computer.computer_id_slot?.GetID() + generate_network_log("Connection opened -- Program ID:[filename] User:[ID?"[ID.registered_name]":"None"]") + SEND_SIGNAL(src, COMSIG_COMPUTER_PROGRAM_START, user) + return TRUE /** * Kills the running program @@ -189,25 +220,29 @@ computer.active_program = null if(!QDELETED(computer) && computer.enabled) INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, update_tablet_open_uis), user) - if(src in computer.idle_threads) + else if(src in computer.idle_threads) computer.idle_threads.Remove(src) + else //The program wasn't running to begin with. + return FALSE if(program_flags & PROGRAM_REQUIRES_NTNET) var/obj/item/card/id/ID = computer.computer_id_slot?.GetID() generate_network_log("Connection closed -- Program ID: [filename] User:[ID ? "[ID.registered_name]" : "None"]") computer.update_appearance(UPDATE_ICON) + SEND_SIGNAL(src, COMSIG_COMPUTER_PROGRAM_KILL, user) return TRUE ///Sends the running program to the background/idle threads. Header programs can't be minimized and will kill instead. -/datum/computer_file/program/proc/background_program() +/datum/computer_file/program/proc/background_program(mob/user) SHOULD_CALL_PARENT(TRUE) - if(program_flags & PROGRAM_HEADER) + if(program_flags & PROGRAM_HEADER || length(computer.idle_threads) > computer.max_idle_programs) return kill_program() computer.idle_threads.Add(src) computer.active_program = null - computer.update_tablet_open_uis(usr) + if(user) + INVOKE_ASYNC(computer, TYPE_PROC_REF(/obj/item/modular_computer, update_tablet_open_uis), user) computer.update_appearance(UPDATE_ICON) return TRUE diff --git a/code/modules/modular_computers/file_system/program_circuit.dm b/code/modules/modular_computers/file_system/program_circuit.dm new file mode 100644 index 00000000000..efd42adaf9f --- /dev/null +++ b/code/modules/modular_computers/file_system/program_circuit.dm @@ -0,0 +1,95 @@ +/** + * Circuit components of modular programs are special. + * They're added to the unremovable components of the shell when the prog is installed and deleted if uninstalled. + * This means they don't work like normal unremovable comps that live and die along with their shell. + */ +/obj/item/circuit_component/mod_program + display_name = "Abstract Modular Program" + desc = "I've spent lot of time thinking how to get this to work. If you see this, I either failed or someone else did, so report it." + /** + * The program that installed us into the shell/usb_port comp. Needed to avoid having too many signals for every program. + * This is also the program we need to install on the modular computer if the circuit is admin-loaded. + * Just make sure each of these components is associated to one and only type of program, no subtypes of anything. + */ + var/datum/computer_file/program/associated_program + + ///Starts the program if possible, placing it in the background if another's active. + var/datum/port/input/start + ///kills the program. + var/datum/port/input/kill + ///binary for whether the program is running or not + var/datum/port/output/running + +/obj/item/circuit_component/mod_program/Initialize(mapload) + if(associated_program) + display_name = initial(associated_program.filedesc) + desc = initial(associated_program.extended_desc) + return ..() // Set the name correctly + +/obj/item/circuit_component/mod_program/register_shell(atom/movable/shell) + . = ..() + var/obj/item/modular_computer/computer + if(istype(shell, /obj/item/modular_computer)) + computer = shell + else if(istype(shell, /obj/machinery/modular_computer)) + var/obj/machinery/modular_computer/console = shell + computer = console.cpu + + ///Find the associated program in the computer's stored_files (install it otherwise) and store a reference to it. + var/datum/computer_file/program/found_program = locate(associated_program) in computer.stored_files + ///The integrated circuit was loaded/duplicated + if(isnull(found_program)) + associated_program = new associated_program() + computer.store_file(associated_program) + else + associated_program = found_program + + RegisterSignal(associated_program, COMSIG_COMPUTER_PROGRAM_START, PROC_REF(on_start)) + RegisterSignal(associated_program, COMSIG_COMPUTER_PROGRAM_KILL, PROC_REF(on_kill)) + +/obj/item/circuit_component/mod_program/unregister_shell() + UnregisterSignal(associated_program, list(COMSIG_COMPUTER_PROGRAM_START, COMSIG_COMPUTER_PROGRAM_KILL)) + associated_program = initial(associated_program) + return ..() + +/obj/item/circuit_component/mod_program/populate_ports() + . = ..() + SHOULD_CALL_PARENT(TRUE) + start = add_input_port("Start", PORT_TYPE_SIGNAL, trigger = PROC_REF(start_prog)) + kill = add_input_port("Kill", PORT_TYPE_SIGNAL, trigger = PROC_REF(kill_prog)) + running = add_output_port("Running", PORT_TYPE_NUMBER) + +///For most programs, triggers only work if they're open (either active or idle). +/obj/item/circuit_component/mod_program/should_receive_input(datum/port/input/port) + . = ..() + if(!.) + return FALSE + if(isnull(associated_program)) + return FALSE + if(!associated_program.computer.enabled) + return FALSE + if(associated_program.program_flags & PROGRAM_CIRCUITS_RUN_WHEN_CLOSED || COMPONENT_TRIGGERED_BY(start, port)) + return TRUE + var/obj/item/modular_computer/computer = associated_program.computer + if(computer.active_program == associated_program || (associated_program in computer.idle_threads)) + return TRUE + return FALSE + +/obj/item/circuit_component/mod_program/proc/start_prog(datum/port/input/port) + associated_program.computer.open_program(program = associated_program) + +/obj/item/circuit_component/mod_program/proc/on_start(mob/living/user) + SIGNAL_HANDLER + running.set_output(TRUE) + +/obj/item/circuit_component/mod_program/proc/kill_prog(datum/port/input/port) + associated_program.kill_program() + +/obj/item/circuit_component/mod_program/proc/on_kill(mob/living/user) + SIGNAL_HANDLER + running.set_output(FALSE) + +/obj/item/circuit_component/mod_program/get_ui_notices() + . = ..() + if(!(associated_program.program_flags & PROGRAM_CIRCUITS_RUN_WHEN_CLOSED)) + . += create_ui_notice("Requires open program for inputs", "purple") diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 9fc51a00f57..57c9e730072 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -97,6 +97,7 @@ /datum/computer_file/program/ai_restorer/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_beginReconstruction") if(!stored_card || !stored_card.AI) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/contractor_program.dm b/code/modules/modular_computers/file_system/programs/antagonist/contractor_program.dm index 77ac06f4feb..d357d0f12f7 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/contractor_program.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/contractor_program.dm @@ -6,7 +6,7 @@ program_icon = "tasks" size = 10 - program_flags = PROGRAM_ON_SYNDINET_STORE | PROGRAM_UNIQUE_COPY + program_flags = PROGRAM_UNIQUE_COPY can_run_on_flags = PROGRAM_PDA //this is all we've got sprites for :sob: undeletable = TRUE tgui_id = "SyndicateContractor" @@ -29,7 +29,7 @@ traitor_data = null return ..() -/datum/computer_file/program/contract_uplink/ui_act(action, params) +/datum/computer_file/program/contract_uplink/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index d3b7e9d5b86..986c2e10f58 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -38,6 +38,7 @@ return ..() /datum/computer_file/program/ntnet_dos/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_target_relay") for(var/obj/machinery/ntnet_relay/relays as anything in SSmachines.get_machines_by_type(/obj/machinery/ntnet_relay)) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index 3e0ac275c14..5163557eb04 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -38,6 +38,7 @@ spark_system.start() /datum/computer_file/program/revelation/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_arm") armed = !armed diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index 9f4db1963c5..fd52792bc8b 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -107,7 +107,8 @@ data["BossID"] = "boss[boss_id].gif" return data -/datum/computer_file/program/arcade/ui_act(action, list/params) +/datum/computer_file/program/arcade/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() usr.played_game() var/gamerSkillLevel = 0 var/gamerSkill = 0 diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index fd520fbb385..8f29af43510 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -67,7 +67,8 @@ data["gasmixes"] = last_gasmix_data return data -/datum/computer_file/program/atmosscan/ui_act(action, list/params) +/datum/computer_file/program/atmosscan/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("scantoggle") if(atmozphere_mode == ATMOZPHERE_SCAN_CLICK) diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index 196ab033408..6f5b116a930 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -10,6 +10,7 @@ size = 5 tgui_id = "NtosCyborgRemoteMonitor" program_icon = "project-diagram" + circuit_comp_type = /obj/item/circuit_component/mod_program/borg_monitor var/list/loglist = list() ///A list to copy a borg's IC log list into var/mob/living/silicon/robot/DL_source ///reference of a borg if we're downloading a log, or null if not. var/DL_progress = -1 ///Progress of current download, 0 to 100, -1 for no current download @@ -105,29 +106,46 @@ return data /datum/computer_file/program/borg_monitor/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("messagebot") - var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs - if(!istype(R)) - return TRUE - var/ID = checkID() - if(!ID) - return TRUE - if(R.stat == DEAD) //Dead borgs will listen to you no longer - to_chat(usr, span_warning("Error -- Could not open a connection to unit:[R]")) - var/message = tgui_input_text(usr, "Message to be sent to remote cyborg", "Send Message") - if(!message) - return TRUE - to_chat(R, "

[span_notice("Message from [ID] -- \"[message]\"")]
") - to_chat(usr, "Message sent to [R]: [message]") - R.logevent("Message from [ID] -- \"[message]\"") - SEND_SOUND(R, 'sound/machines/twobeep_high.ogg') - if(R.connected_ai) - to_chat(R.connected_ai, "

[span_notice("Message from [ID] to [R] -- \"[message]\"")]
") - SEND_SOUND(R.connected_ai, 'sound/machines/twobeep_high.ogg') - usr.log_talk(message, LOG_PDA, tag="Cyborg Monitor Program: ID name \"[ID]\" to [R]") + var/mob/living/silicon/robot/robot = locate(params["ref"]) in GLOB.silicon_mobs + message_robot(robot, usr) return TRUE +/datum/computer_file/program/borg_monitor/proc/message_robot(mob/living/silicon/robot/robot, mob/user) + if(!istype(robot)) + return TRUE + var/ID = checkID() + if(!ID) + return FALSE + if(robot.stat == DEAD) //Dead borgs will listen to you no longer + to_chat(user, span_warning("Error -- Could not open a connection to unit:[robot]")) + return FALSE + var/message = tgui_input_text(user, "Message to be sent to remote cyborg", "Send Message") + if(!message) + return FALSE + send_message(message, robot, user) + +/datum/computer_file/program/borg_monitor/proc/send_message(message, mob/living/silicon/robot/robot, mob/user) + var/ID = checkID() + if(!ID) + return FALSE + if(robot.stat == DEAD) //Dead borgs will listen to you no longer + if(user) + to_chat(user, span_warning("Error -- Could not open a connection to unit:[robot]")) + return FALSE + to_chat(robot, "

[span_notice("Message from [ID] -- \"[message]\"")]
") + if(user) + to_chat(user, "Message sent to [robot]: [message]") + robot.logevent("Message from [ID] -- \"[message]\"") + SEND_SOUND(robot, 'sound/machines/twobeep_high.ogg') + if(robot.connected_ai) + to_chat(robot.connected_ai, "

[span_notice("Message from [ID] to [robot] -- \"[message]\"")]
") + SEND_SOUND(robot.connected_ai, 'sound/machines/twobeep_high.ogg') + user?.log_talk(message, LOG_PDA, tag = "Cyborg Monitor Program: ID name \"[ID]\" to [robot]") + return TRUE + ///This proc is used to determin if a borg should be shown in the list (based on the borg's scrambledcodes var). Syndicate version overrides this to show only syndicate borgs. /datum/computer_file/program/borg_monitor/proc/evaluate_borg(mob/living/silicon/robot/R) if(!is_valid_z_level(get_turf(computer), get_turf(R))) @@ -154,6 +172,7 @@ extended_desc = "This program allows for remote monitoring of mission-assigned cyborgs." program_flags = PROGRAM_ON_SYNDINET_STORE download_access = list() + circuit_comp_type = /obj/item/circuit_component/mod_program/borg_monitor/syndie /datum/computer_file/program/borg_monitor/syndicate/evaluate_borg(mob/living/silicon/robot/R) if(!is_valid_z_level(get_turf(computer), get_turf(R))) @@ -164,3 +183,31 @@ /datum/computer_file/program/borg_monitor/syndicate/checkID() return "\[CLASSIFIED\]" //no ID is needed for the syndicate version's message function, and the borg will see "[CLASSIFIED]" as the message sender. + +/obj/item/circuit_component/mod_program/borg_monitor + associated_program = /datum/computer_file/program/borg_monitor + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + + ///Circuit input for the robot we want to message + var/datum/port/input/target_robot + ///The message we want to send + var/datum/port/input/set_message + +/obj/item/circuit_component/mod_program/borg_monitor/populate_ports() + . = ..() + target_robot = add_input_port("Receiver", PORT_TYPE_ATOM) + set_message = add_input_port("Set Message", PORT_TYPE_STRING, trigger = PROC_REF(sanitize_borg_message)) + +/obj/item/circuit_component/mod_program/borg_monitor/proc/sanitize_borg_message(datum/port/port) + set_message.set_value(trim(html_encode(set_message.value), MAX_MESSAGE_LEN)) + +/obj/item/circuit_component/mod_program/borg_monitor/input_received(datum/port/port) + if(!length(set_message.value) || !iscyborg(target_robot.value)) + return + var/mob/living/silicon/robot/robot = target_robot.value + var/datum/computer_file/program/borg_monitor/monitor = associated_program + if(monitor.send_message(set_message.value, robot)) + monitor.computer.log_talk("Cyborg Monitor message (ID name \"[monitor.checkID()]\") sent to [key_name(robot)] by [parent.get_creator()]: [set_message.value]") + +/obj/item/circuit_component/mod_program/borg_monitor/syndie + associated_program = /datum/computer_file/program/borg_monitor/syndicate diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm index 4bbad8d1d8b..86590192041 100644 --- a/code/modules/modular_computers/file_system/programs/bounty_board.dm +++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm @@ -57,7 +57,8 @@ data["bountyText"] = bounty_text return data -/datum/computer_file/program/bounty_board/ui_act(action, list/params) +/datum/computer_file/program/bounty_board/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() var/current_ref_num = params["request"] var/current_app_num = params["applicant"] var/datum/bank_account/request_target diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index b88636a7de8..a5986aa3816 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -166,7 +166,8 @@ data["max_order"] = CARGO_MAX_ORDER return data -/datum/computer_file/program/budgetorders/ui_act(action, params, datum/tgui/ui) +/datum/computer_file/program/budgetorders/ui_act(action, params, datum/tgui/ui, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("send") if(!SSshuttle.supply.canMove()) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index c41aa8ae29a..238d05704e2 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -87,6 +87,7 @@ return ..() /datum/computer_file/program/card_mod/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() var/mob/user = usr var/obj/item/card/id/inserted_auth_card = computer.computer_id_slot diff --git a/code/modules/modular_computers/file_system/programs/cargoship.dm b/code/modules/modular_computers/file_system/programs/cargoship.dm index 92c6e152f71..fa73149dc85 100644 --- a/code/modules/modular_computers/file_system/programs/cargoship.dm +++ b/code/modules/modular_computers/file_system/programs/cargoship.dm @@ -26,7 +26,8 @@ data["barcode_split"] = cut_multiplier * 100 return data -/datum/computer_file/program/shipping/ui_act(action, list/params) +/datum/computer_file/program/shipping/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() if(!computer.computer_id_slot) //We need an ID to successfully run return FALSE diff --git a/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm index 1067c3f392d..b3566591e12 100644 --- a/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/chatroom/ntnrc_client.dm @@ -49,6 +49,7 @@ return new_converstaion /datum/computer_file/program/chatclient/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() var/datum/ntnet_conversation/channel = SSmodular_computers.get_chat_channel_by_id(active_channel) var/authed = FALSE if(channel && ((channel.channel_operator == src) || netadmin_mode)) diff --git a/code/modules/modular_computers/file_system/programs/coupon.dm b/code/modules/modular_computers/file_system/programs/coupon.dm index 72e3ff6ec06..d8ebec7510a 100644 --- a/code/modules/modular_computers/file_system/programs/coupon.dm +++ b/code/modules/modular_computers/file_system/programs/coupon.dm @@ -44,7 +44,8 @@ data["valid_id"] = TRUE return data -/datum/computer_file/program/coupon/ui_act(action, params, datum/tgui/ui) +/datum/computer_file/program/coupon/ui_act(action, params, datum/tgui/ui, datum/tgui/ui, datum/ui_state/state) + . = ..() var/obj/item/card/id/user_id = computer.computer_id_slot if(!(user_id?.registered_account.add_to_accounts)) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index f7e3df473ea..d635a12000f 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -16,7 +16,8 @@ data["manifest"] = GLOB.manifest.get_manifest() return data -/datum/computer_file/program/crew_manifest/ui_act(action, params, datum/tgui/ui) +/datum/computer_file/program/crew_manifest/ui_act(action, params, datum/tgui/ui, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_print") if(computer) //This option should never be called if there is no printer diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index c9133515507..74af88ac870 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -13,6 +13,7 @@ var/error /datum/computer_file/program/filemanager/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_deletefile") var/datum/computer_file/file = computer.find_file_by_name(params["name"]) diff --git a/code/modules/modular_computers/file_system/programs/frontier.dm b/code/modules/modular_computers/file_system/programs/frontier.dm index 884e635364c..c41cf642ffb 100644 --- a/code/modules/modular_computers/file_system/programs/frontier.dm +++ b/code/modules/modular_computers/file_system/programs/frontier.dm @@ -162,6 +162,7 @@ return data /datum/computer_file/program/scipaper_program/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("et_alia") paper_to_be.et_alia = !paper_to_be.et_alia diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index 90755c08d48..b27ae687bf3 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -34,10 +34,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) return FALSE if(job.job_flags & JOB_CANNOT_OPEN_SLOTS) return FALSE - // SKYRAT EDIT ADDITION START - //if(job.veteran_only) - //return FALSE //BUBBER Edit Removal, let clown slots be opened. - // SKYRAT EDIT ADDITION END return TRUE @@ -57,7 +53,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) return FALSE -/datum/computer_file/program/job_management/ui_act(action, params, datum/tgui/ui) +/datum/computer_file/program/job_management/ui_act(action, params, datum/tgui/ui, datum/tgui/ui, datum/ui_state/state) + . = ..() var/obj/item/card/id/user_id = computer.computer_id_slot if(!user_id || !(ACCESS_CHANGE_IDS in user_id.access)) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/mafia_ntos.dm b/code/modules/modular_computers/file_system/programs/mafia_ntos.dm index c970349bd20..bf092ed1d4e 100644 --- a/code/modules/modular_computers/file_system/programs/mafia_ntos.dm +++ b/code/modules/modular_computers/file_system/programs/mafia_ntos.dm @@ -49,7 +49,8 @@ data += game.ui_assets(user) return data -/datum/computer_file/program/mafia/ui_act(mob/user, params, datum/tgui/ui, datum/ui_state/state) +/datum/computer_file/program/mafia/ui_act(mob/user, params, datum/tgui/ui, datum/ui_state/state, datum/tgui/ui, datum/ui_state/state) + . = ..() var/datum/mafia_controller/game = GLOB.mafia_game if(!game) game = create_mafia_game() diff --git a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm index c729e3ed5c4..f851dada495 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm @@ -8,6 +8,7 @@ can_run_on_flags = PROGRAM_PDA tgui_id = "NtosCamera" program_icon = "camera" + circuit_comp_type = /obj/item/circuit_component/mod_program/camera /// Camera built-into the tablet. var/obj/item/camera/internal_camera @@ -50,13 +51,63 @@ return data -/datum/computer_file/program/maintenance/camera/ui_act(action, params, datum/tgui/ui) - var/mob/living/user = usr +/datum/computer_file/program/maintenance/camera/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("print_photo") if(computer.stored_paper <= 0) to_chat(usr, span_notice("Hardware error: Printer out of paper.")) return - internal_camera.printpicture(user, internal_picture) + internal_camera.printpicture(usr, internal_picture) computer.stored_paper-- computer.visible_message(span_notice("\The [computer] prints out a paper.")) + +/obj/item/circuit_component/mod_program/camera + associated_program = /datum/computer_file/program/maintenance/camera + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + + ///A target to take a picture of. + var/datum/port/input/picture_target + ///The photographed target + var/datum/port/output/photographed + /** + * Pinged when the image has been captured. + * I'm not using the default trigger output here because the process is asynced, + * even though I'm mostly sure it only sleeps if there's a set user. + */ + var/datum/port/output/photo_taken + +/obj/item/circuit_component/mod_program/camera/populate_ports() + . = ..() + picture_target = add_input_port("Picture Target", PORT_TYPE_ATOM) + photographed = add_output_port("Photographed Entity", PORT_TYPE_ATOM) + photo_taken = add_output_port("Photo Taken", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/mod_program/camera/register_shell(atom/movable/shell) + . = ..() + var/datum/computer_file/program/maintenance/camera/cam = associated_program + RegisterSignal(cam.internal_camera, COMSIG_CAMERA_IMAGE_CAPTURED, PROC_REF(on_image_captured)) + +/obj/item/circuit_component/mod_program/camera/unregister_shell() + var/datum/computer_file/program/maintenance/camera/cam = associated_program + UnregisterSignal(cam.internal_camera, COMSIG_CAMERA_IMAGE_CAPTURED) + return ..() + +/obj/item/circuit_component/mod_program/camera/input_received(datum/port/input/port) + var/atom/target = picture_target.value + if(!target) + var/turf/our_turf = get_location() + target = locate(our_turf.x, our_turf.y, our_turf.z) + if(!target) + return + var/datum/computer_file/program/maintenance/camera/cam = associated_program + if(!cam.internal_camera.can_target(target)) + return + var/pic_size_x = cam.internal_camera.picture_size_x - 1 + var/pic_size_y = cam.internal_camera.picture_size_y - 1 + INVOKE_ASYNC(cam.internal_camera, TYPE_PROC_REF(/obj/item/camera, captureimage), target, null, pic_size_x, pic_size_y) + +/obj/item/circuit_component/mod_program/camera/proc/on_image_captured(obj/item/camera/source, atom/target, mob/user) + SIGNAL_HANDLER + photographed.set_output(target) + photo_taken.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm b/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm index c67b001942c..0d094ced4f5 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm @@ -7,6 +7,7 @@ size = 2 tgui_id = "NtosMODsuit" program_icon = "user-astronaut" + circuit_comp_type = /obj/item/circuit_component/mod_program/modsuit_control ///The suit we have control over. var/obj/item/mod/control/controlled_suit @@ -20,12 +21,15 @@ . = ..() if(!istype(attacking_item, /obj/item/mod/control)) return FALSE + sync_modsuit(attacking_item, user) + return TRUE + +/datum/computer_file/program/maintenance/modsuit_control/proc/sync_modsuit(obj/item/mod/control/new_modsuit, mob/living/user) if(controlled_suit) unsync_modsuit() - controlled_suit = attacking_item + controlled_suit = new_modsuit RegisterSignal(controlled_suit, COMSIG_QDELETING, PROC_REF(unsync_modsuit)) - user.balloon_alert(user, "suit updated") - return TRUE + user?.balloon_alert(user, "suit updated") /datum/computer_file/program/maintenance/modsuit_control/proc/unsync_modsuit(atom/source) SIGNAL_HANDLER @@ -43,4 +47,26 @@ return controlled_suit?.ui_static_data() /datum/computer_file/program/maintenance/modsuit_control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() return controlled_suit?.ui_act(action, params, ui, state) + + +/obj/item/circuit_component/mod_program/modsuit_control + associated_program = /datum/computer_file/program/maintenance/modsuit_control + + ///Circuit port for loading a new suit to control + var/datum/port/input/suit_port + +/obj/item/circuit_component/mod_program/modsuit_control/populate_ports() + . = ..() + suit_port = add_input_port("MODsuit Controlled", PORT_TYPE_ATOM) + +/obj/item/circuit_component/mod_program/modsuit_control/input_received(datum/port/port) + var/datum/computer_file/program/maintenance/modsuit_control/control = associated_program + var/obj/item/mod/control/mod = suit_port.value + if(isnull(mod) && control.controlled_suit) + control.unsync_modsuit() + return + if(!istype(mod)) + return + control.sync_modsuit(mod) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/spectre_meter.dm b/code/modules/modular_computers/file_system/programs/maintenance/spectre_meter.dm index 8a3a3e6cb6e..a989e5e61ba 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/spectre_meter.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/spectre_meter.dm @@ -1,9 +1,9 @@ - #define SPOOK_VALUE_SAME_TURF_MULT 1.5 #define SPOOK_VALUE_LIVING_MULT 6 #define SPOOK_VALUE_DEF_MOB 10 #define SPOOK_VALUE_ICON_STATE_MAX 120 #define SPOOK_VALUE_SEGMENT 15 +#define SPOOK_COOLDOWN 2 SECONDS /datum/computer_file/program/maintenance/spectre_meter filename = "spectre_meter" @@ -16,6 +16,7 @@ tgui_id = "NtosSpectreMeter" program_icon = "ghost" program_open_overlay = "spectre_meter_0" + circuit_comp_type = /obj/item/circuit_component/mod_program/spectre_meter /// The cooldown for manual scans COOLDOWN_DECLARE(manual_scan_cd) /// Whether the automatic scan mode is active or not @@ -46,13 +47,11 @@ return data /datum/computer_file/program/maintenance/spectre_meter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("manual_scan") - if(COOLDOWN_FINISHED(src, manual_scan_cd)) - INVOKE_ASYNC(src, PROC_REF(scan_surroundings)) - COOLDOWN_START(src, manual_scan_cd, 2 SECONDS) - playsound(computer, 'sound/effects/ping_hit.ogg', vol = 40, vary = TRUE) - return TRUE + INVOKE_ASYNC(src, PROC_REF(scan_surroundings)) + return TRUE if("toggle_mode") auto_mode = !auto_mode if(auto_mode) @@ -67,10 +66,13 @@ /datum/computer_file/program/maintenance/spectre_meter/process(seconds_per_tick) if(auto_mode) - INVOKE_ASYNC(src, PROC_REF(scan_surroundings)) + INVOKE_ASYNC(src, PROC_REF(scan_surroundings), FALSE) ///Return the "spook level" of the area the computer is in. -/datum/computer_file/program/maintenance/spectre_meter/proc/scan_surroundings() +/datum/computer_file/program/maintenance/spectre_meter/proc/scan_surroundings(manual = TRUE) + if(manual && !COOLDOWN_FINISHED(src, manual_scan_cd)) + return + var/spook_value = 0 var/turf/turf = get_turf(computer) @@ -103,6 +105,12 @@ if(program_open_overlay != old_open_overlay) computer.update_appearance(UPDATE_OVERLAYS) + if(manual) + COOLDOWN_START(src, manual_scan_cd, SPOOK_COOLDOWN) + playsound(computer, 'sound/effects/ping_hit.ogg', vol = 40, vary = TRUE) + + SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_SPECTRE_SCAN, last_spook_value) + /datum/looping_sound/spectre_meter mid_sounds = /datum/looping_sound/geiger::mid_sounds mid_length = 2 @@ -128,8 +136,45 @@ last_spook_value = 0 return ..() + +/obj/item/circuit_component/mod_program/spectre_meter + associated_program = /datum/computer_file/program/maintenance/spectre_meter + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + + /// Returns the spookiness of each scan. + var/datum/port/output/scan_results + /// Pinged whenever a scan is done. + var/datum/port/output/scanned + +/obj/item/circuit_component/mod_program/spectre_meter/populate_ports() + . = ..() + scan_results = add_output_port("Scan Results", PORT_TYPE_NUMBER) + scanned = add_output_port("Scaned", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/mod_program/spectre_meter/register_shell(atom/movable/shell) + . = ..() + RegisterSignal(associated_program.computer, COMSIG_MODULAR_COMPUTER_SPECTRE_SCAN, PROC_REF(on_scan)) + +/obj/item/circuit_component/mod_program/spectre_meter/unregister_shell() + UnregisterSignal(associated_program.computer, COMSIG_MODULAR_COMPUTER_SPECTRE_SCAN) + return ..() + +/obj/item/circuit_component/mod_program/spectre_meter/get_ui_notices() + . = ..() + . += create_ui_notice("Scan Coooldown: [SPOOK_COOLDOWN]", "orange", "stopwatch") + +/obj/item/circuit_component/mod_program/spectre_meter/input_received(datum/port/port) + var/datum/computer_file/program/maintenance/spectre_meter/meter = associated_program + INVOKE_ASYNC(meter, TYPE_PROC_REF(/datum/computer_file/program/maintenance/spectre_meter, scan_surroundings)) + +/obj/item/circuit_component/mod_program/spectre_meter/proc/on_scan(datum/source, spook_value) + SIGNAL_HANDLER + scan_results.set_output(spook_value) + scanned.set_output(COMPONENT_SIGNAL) + #undef SPOOK_VALUE_SAME_TURF_MULT #undef SPOOK_VALUE_LIVING_MULT #undef SPOOK_VALUE_DEF_MOB #undef SPOOK_VALUE_ICON_STATE_MAX #undef SPOOK_VALUE_SEGMENT +#undef SPOOK_COOLDOWN diff --git a/code/modules/modular_computers/file_system/programs/maintenance/themes.dm b/code/modules/modular_computers/file_system/programs/maintenance/themes.dm index fe6a25f15b1..26717e33d3a 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/themes.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/themes.dm @@ -26,6 +26,7 @@ ///Called post-installation of an application in a computer, after 'computer' var is set. /datum/computer_file/program/maintenance/theme/on_install() + SHOULD_CALL_PARENT(FALSE) //add the theme to the computer and increase its size to match var/datum/computer_file/program/themeify/theme_app = locate() in computer.stored_files if(theme_app) diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_circuit.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_circuit.dm new file mode 100644 index 00000000000..600dfd25db7 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_circuit.dm @@ -0,0 +1,120 @@ +#define MESSENGER_CIRCUIT_MIN_COOLDOWN 5 SECONDS +#define MESSENGER_CIRCUIT_MAX_COOLDOWN 45 SECONDS +#define MESSENGER_CIRCUIT_CD_PER_RECIPIENT 1.5 SECONDS +#define MESSENGER_CIRCUIT_RINGTONE_CD 1.5 SECONDS + +/obj/item/circuit_component/mod_program/messenger + associated_program = /datum/computer_file/program/messenger + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + + ///Contents of the last received message + var/datum/port/output/received_message + ///Name of the sender of the above + var/datum/port/output/sender_name + ///Job title of the sender of the above + var/datum/port/output/sender_job + ///Reference to the device that sent the message. Usually a PDA. + var/datum/port/output/sender_device + ///Pinged whenever a message is received. + var/datum/port/output/received + + ///A message to be sent when triggered + var/datum/port/input/message + ///A list of PDA targets for the message to be sent + var/datum/port/input/targets + + ///Plays the ringtone when the input is received + var/datum/port/input/ring + ///Set the ringtone to the input + var/datum/port/input/set_ring + + ///the cooldown of the ringtone. + COOLDOWN_DECLARE(ring_cd) + +/obj/item/circuit_component/mod_program/messenger/populate_ports() + . = ..() + received_message = add_output_port("Message", PORT_TYPE_STRING) + sender_name = add_output_port("Sender Name", PORT_TYPE_STRING) + sender_job = add_output_port("Sender Job", PORT_TYPE_STRING) + sender_device = add_output_port("Sender Device", PORT_TYPE_ATOM) + received = add_output_port("Received", PORT_TYPE_SIGNAL) + + message = add_input_port("Message", PORT_TYPE_STRING) + targets = add_input_port("Targets", PORT_TYPE_LIST(PORT_TYPE_ATOM)) + + ring = add_input_port("Play Ringtone", PORT_TYPE_SIGNAL, trigger = PROC_REF(play_ringtone)) + set_ring = add_input_port("Set Ringtone", PORT_TYPE_STRING, trigger = PROC_REF(set_ringtone)) + +/obj/item/circuit_component/mod_program/messenger/input_received(datum/port/port) + var/list/messenger_targets = list() + for(var/datum/weakref/ref as anything in targets.value) + var/obj/item/modular_computer/modpc = ref?.resolve() //entity ports are hardrefs, entity list ports are weakref. :thonking: + if(!istype(modpc)) + continue + var/datum/computer_file/program/messenger/messenger = locate() in modpc.stored_files + if(messenger) + messenger_targets |= messenger + if(!length(messenger_targets)) + return + var/datum/computer_file/program/messenger/messenger = associated_program + var/filterd_message = censor_ic_filter_for_pdas(message.value) + + ///We need to async send_message() because some tcomms devices might sleep. Also because of (non-existent) user tgui alerts. + INVOKE_ASYNC(messenger, TYPE_PROC_REF(/datum/computer_file/program/messenger, send_message), src, filterd_message, messenger_targets) + +/obj/item/circuit_component/mod_program/messenger/register_shell(atom/movable/shell) + . = ..() + RegisterSignal(associated_program.computer, COMSIG_MODULAR_PDA_MESSAGE_RECEIVED, PROC_REF(message_received)) + RegisterSignal(associated_program.computer, COMSIG_MODULAR_PDA_MESSAGE_SENT, PROC_REF(message_sent)) + +/obj/item/circuit_component/mod_program/messenger/unregister_shell() + UnregisterSignal(associated_program.computer, list(COMSIG_MODULAR_PDA_MESSAGE_RECEIVED, COMSIG_MODULAR_PDA_MESSAGE_SENT)) + return ..() + +/obj/item/circuit_component/mod_program/messenger/get_ui_notices() + . = ..() + . += create_ui_notice("Cooldown per recipient: [DisplayTimeText(MESSENGER_CIRCUIT_CD_PER_RECIPIENT)]", "orange", "stopwatch") + . += create_ui_notice("Minimum cooldown: [DisplayTimeText(MESSENGER_CIRCUIT_MIN_COOLDOWN)]", "orange", "stopwatch") + . += create_ui_notice("Maximum cooldown: [DisplayTimeText(MESSENGER_CIRCUIT_MAX_COOLDOWN)]", "orange", "stopwatch") + +/obj/item/circuit_component/mod_program/messenger/proc/message_received(datum/source, datum/signal/subspace/messaging/tablet_message/signal, message_job, message_name) + SIGNAL_HANDLER + received_message.set_value(signal.data["message"]) + sender_name.set_output(message_name) + sender_job.set_output(message_job) + + var/atom/source_device + if(istype(signal.source, /datum/computer_file/program/messenger)) + var/datum/computer_file/program/messenger/sender_messenger = source + source_device = sender_messenger.computer + else if(isatom(signal.source)) + source_device = signal.source + + sender_device.set_output(source_device) + received.set_output(COMPONENT_SIGNAL) + +///Set the cooldown after the message was sent (by us) +/obj/item/circuit_component/mod_program/messenger/proc/message_sent(datum/source, atom/origin, datum/signal/subspace/messaging/tablet_message/signal) + SIGNAL_HANDLER + if(origin != src) + return + var/targets_length = length(signal.data["targets"]) + var/datum/computer_file/program/messenger/messenger = associated_program + var/cool = clamp(targets_length * MESSENGER_CIRCUIT_CD_PER_RECIPIENT, MESSENGER_CIRCUIT_MIN_COOLDOWN, MESSENGER_CIRCUIT_MAX_COOLDOWN) + COOLDOWN_START(messenger, last_text, cool) + +/obj/item/circuit_component/mod_program/messenger/proc/set_ringtone(datum/port/port) + var/datum/computer_file/program/messenger/messenger = associated_program + messenger.set_ringtone(set_ring.value) + +/obj/item/circuit_component/mod_program/messenger/proc/play_ringtone(datum/port/port) + if(!COOLDOWN_FINISHED(src, ring_cd)) + return + COOLDOWN_START(src, ring_cd, MESSENGER_CIRCUIT_RINGTONE_CD) + var/datum/computer_file/program/messenger/messenger = associated_program + messenger.computer.ring(messenger.ringtone) + +#undef MESSENGER_CIRCUIT_MIN_COOLDOWN +#undef MESSENGER_CIRCUIT_MAX_COOLDOWN +#undef MESSENGER_CIRCUIT_CD_PER_RECIPIENT +#undef MESSENGER_CIRCUIT_RINGTONE_CD 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 0b69fd5230f..ac40ef57ec8 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 @@ -14,12 +14,13 @@ size = 0 undeletable = TRUE // It comes by default in tablets, can't be downloaded, takes no space and should obviously not be able to be deleted. power_cell_use = NONE - program_flags = PROGRAM_HEADER | PROGRAM_RUNS_WITHOUT_POWER + program_flags = PROGRAM_HEADER | PROGRAM_RUNS_WITHOUT_POWER | PROGRAM_CIRCUITS_RUN_WHEN_CLOSED can_run_on_flags = PROGRAM_PDA ui_header = "ntnrc_idle.gif" tgui_id = "NtosMessenger" program_icon = "comment-alt" alert_able = TRUE + circuit_comp_type = /obj/item/circuit_component/mod_program/messenger /// Whether the user is invisible to the message list. var/invisible = FALSE @@ -138,6 +139,18 @@ for(var/datum/tgui/window as anything in computer.open_uis) SSassets.transport.send_assets(window.user, data) +/// Set the ringtone if possible. Also handles encoding. +/datum/computer_file/program/messenger/proc/set_ringtone(new_ringtone, mob/user) + new_ringtone = trim(html_encode(new_ringtone), MESSENGER_RINGTONE_MAX_LENGTH) + if(!new_ringtone) + return FALSE + + if(SEND_SIGNAL(computer, COMSIG_TABLET_CHANGE_ID, user, new_ringtone) & COMPONENT_STOP_RINGTONE_CHANGE) + return FALSE + + ringtone = ringtone + return TRUE + /datum/computer_file/program/messenger/ui_interact(mob/user, datum/tgui/ui) var/list/data = get_picture_assets() SSassets.transport.send_assets(user, data) @@ -147,19 +160,15 @@ return GLOB.reverse_contained_state return GLOB.default_state -/datum/computer_file/program/messenger/ui_act(action, list/params, datum/tgui/ui) +/datum/computer_file/program/messenger/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PDA_ringSet") - var/new_ringtone = tgui_input_text(usr, "Enter a new ringtone", "Ringtone", ringtone, MESSENGER_RINGTONE_MAX_LENGTH) - var/mob/living/usr_mob = usr - if(!new_ringtone || !in_range(computer, usr_mob) || computer.loc != usr_mob) + var/mob/living/user = usr + var/new_ringtone = tgui_input_text(user, "Enter a new ringtone", "Ringtone", ringtone, encode = FALSE) + if(!in_range(computer, user) || computer.loc != user) return FALSE - - if(SEND_SIGNAL(computer, COMSIG_TABLET_CHANGE_ID, usr_mob, new_ringtone) & COMPONENT_STOP_RINGTONE_CHANGE) - return FALSE - - ringtone = new_ringtone - return TRUE + return set_ringtone(new_ringtone, user) if("PDA_toggleAlerts") alert_silenced = !alert_silenced @@ -451,18 +460,21 @@ message = emoji_sanitize(message) // check message against filter - if(!check_pda_message_against_filter(message, sender)) + if(sender && !check_pda_message_against_filter(message, sender)) return null return message /// Sends a message to targets via PDA. When sending to everyone, set `everyone` to true so the message is formatted accordingly -/datum/computer_file/program/messenger/proc/send_message(mob/living/sender, message, list/targets, everyone = FALSE) +/datum/computer_file/program/messenger/proc/send_message(atom/source, message, list/targets, everyone = FALSE) + var/mob/living/sender + if(isliving(source)) + sender = source message = sanitize_pda_message(message, sender) - if(!message) return FALSE + // upgrade the image asset to a permanent key var/photo_asset_key = selected_image if(photo_asset_key == TEMP_IMAGE_PATH(REF(src))) @@ -474,7 +486,7 @@ var/list/datum/computer_file/program/messenger/target_messengers = list() var/list/datum/pda_chat/target_chats = list() - var/should_alert = length(targets) == 1 + var/should_alert = length(targets) == 1 && sender // filter out invalid targets for(var/target in targets) @@ -523,7 +535,7 @@ target_chats += target_chat target_messengers += target_messenger - if(!send_message_signal(sender, message, target_messengers, photo_asset_key, everyone)) + if(!send_message_signal(source, message, target_messengers, photo_asset_key, everyone)) return FALSE // Log it in our logs @@ -553,9 +565,12 @@ return send_message_signal(sender, message, targets, fake_photo, FALSE, TRUE, fake_name, fake_job) -/datum/computer_file/program/messenger/proc/send_message_signal(mob/sender, message, list/datum/computer_file/program/messenger/targets, photo_path = null, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null) - if(!sender.can_perform_action(computer, ALLOW_RESTING)) - return FALSE +/datum/computer_file/program/messenger/proc/send_message_signal(atom/source, message, list/datum/computer_file/program/messenger/targets, photo_path = null, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null) + var/mob/sender + if(ismob(source)) + sender = source + if(!sender.can_perform_action(computer, ALLOW_RESTING)) + return FALSE if(!COOLDOWN_FINISHED(src, last_text)) return FALSE @@ -566,7 +581,8 @@ // check for jammers if(is_within_radio_jammer_range(computer) && !rigged) // different message so people know it's a radio jammer - to_chat(sender, span_notice("ERROR: Network unavailable, please try again later.")) + if(sender) + to_chat(sender, span_notice("ERROR: Network unavailable, please try again later.")) if(alert_able && !alert_silenced) playsound(computer, 'sound/machines/terminal_error.ogg', 15, TRUE) return FALSE @@ -596,38 +612,46 @@ // If it didn't reach, note that fact if (!signal.data["done"]) - to_chat(sender, span_notice("ERROR: Server is not responding.")) + if(sender) + to_chat(sender, span_notice("ERROR: Server is not responding.")) if(alert_able && !alert_silenced) playsound(computer, 'sound/machines/terminal_error.ogg', 15, TRUE) return FALSE - // SKYRAT EDIT BEGIN - PDA messages show a visible message; again! sender.visible_message(span_notice("[sender]'s PDA rings out with the soft sound of keypresses"), vision_distance = COMBAT_MESSAGE_RANGE) // SKYRAT EDIT END + var/shell_addendum = "" + if(istype(source, /obj/item/circuit_component)) + var/obj/item/circuit_component/circuit = source + shell_addendum = "[circuit.parent.get_creator()] " + // Log in the talk log - sender.log_talk(message, LOG_PDA, tag="[rigged ? "Rigged" : ""] PDA: [computer.saved_identification] to [signal.format_target()]") + source.log_talk(message, LOG_PDA, tag="[shell_addendum][rigged ? "Rigged" : ""] PDA: [computer.saved_identification] to [signal.format_target()]") if(rigged) log_bomber(sender, "sent a rigged PDA message (Name: [fake_name]. Job: [fake_job]) to [english_list(stringified_targets)] [!is_special_character(sender) ? "(SENT BY NON-ANTAG)" : ""]") message = emoji_parse(message) //already sent- this just shows the sent emoji as one to the sender in the to_chat // Show it to ghosts - var/ghost_message = span_game_say("[span_name("[sender]")] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") + var/ghost_message = span_game_say("[span_name("[source]")] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") var/list/message_listeners = GLOB.dead_player_list + GLOB.current_observers_list for(var/mob/listener as anything in message_listeners) if(!(get_chat_toggles(listener) & CHAT_GHOSTPDA)) continue - to_chat(listener, "[FOLLOW_LINK(listener, sender)] [ghost_message]") + to_chat(listener, "[FOLLOW_LINK(listener, source)] [ghost_message]") - to_chat(sender, span_info("PDA message sent to [signal.format_target()]: \"[message]\"")) + if(sender) + to_chat(sender, span_info("PDA message sent to [signal.format_target()]: \"[message]\"")) if (alert_able && !alert_silenced) computer.send_sound() COOLDOWN_START(src, last_text, 1 SECONDS) + SEND_SIGNAL(computer, COMSIG_MODULAR_PDA_MESSAGE_SENT, source, signal) + selected_image = null return TRUE @@ -642,6 +666,7 @@ var/sender_ref = signal.data["ref"] + // don't create a new chat for rigged messages, make it a one off notif if(!is_rigged) var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"]) @@ -662,6 +687,14 @@ if(computer.loc && isliving(computer.loc)) receievers += computer.loc + // resolving w/o nullcheck here, assume the messenger exists if a real person sent a message + var/datum/computer_file/program/messenger/sender_messenger = chat.recipient?.resolve() + + var/sender_title = is_fake_user ? STRINGIFY_PDA_TARGET(fake_name, fake_job) : get_messenger_name(sender_messenger) + var/sender_name = is_fake_user ? fake_name : sender_messenger.computer.saved_identification + + SEND_SIGNAL(computer, COMSIG_MODULAR_PDA_MESSAGE_RECEIVED, signal, fake_job || sender_messenger?.computer.saved_job , sender_name) + for(var/mob/living/messaged_mob as anything in receievers) if(messaged_mob.stat >= UNCONSCIOUS) continue @@ -675,11 +708,6 @@ else reply = "(Reply)" - // resolving w/o nullcheck here, assume the messenger exists if a real person sent a message - var/datum/computer_file/program/messenger/sender_messenger = chat.recipient?.resolve() - - var/sender_title = is_fake_user ? STRINGIFY_PDA_TARGET(fake_name, fake_job) : get_messenger_name(sender_messenger) - var/sender_name = is_fake_user ? fake_name : sender_messenger.computer.saved_identification if (isAI(messaged_mob)) sender_title = "[sender_title]" diff --git a/code/modules/modular_computers/file_system/programs/newscasterapp.dm b/code/modules/modular_computers/file_system/programs/newscasterapp.dm index a19f38fb777..ed1c440f411 100644 --- a/code/modules/modular_computers/file_system/programs/newscasterapp.dm +++ b/code/modules/modular_computers/file_system/programs/newscasterapp.dm @@ -27,4 +27,5 @@ return newscaster_ui.ui_static_data(user) /datum/computer_file/program/newscaster/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() return newscaster_ui.ui_act(action, params, ui, state) diff --git a/code/modules/modular_computers/file_system/programs/notepad.dm b/code/modules/modular_computers/file_system/programs/notepad.dm index a2fdd5929e8..8a5f39a4abe 100644 --- a/code/modules/modular_computers/file_system/programs/notepad.dm +++ b/code/modules/modular_computers/file_system/programs/notepad.dm @@ -8,6 +8,7 @@ tgui_id = "NtosNotepad" program_icon = "book" can_run_on_flags = PROGRAM_ALL + circuit_comp_type = /obj/item/circuit_component/mod_program/notepad var/written_note = "Congratulations on your station upgrading to the new NtOS and Thinktronic based collaboration effort, \ bringing you the best in electronics and software since 2467!\n\ @@ -19,7 +20,8 @@ Quarter - Either sides of Aft\n\ Bow - Either sides of Fore" -/datum/computer_file/program/notepad/ui_act(action, list/params, datum/tgui/ui) +/datum/computer_file/program/notepad/ui_act(action, list/params, datum/tgui/ui, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("UpdateNote") written_note = params["newnote"] @@ -31,3 +33,39 @@ data["note"] = written_note return data + +/obj/item/circuit_component/mod_program/notepad + associated_program = /datum/computer_file/program/notepad + ///When the input is received, the written note will be set to its value. + var/datum/port/input/set_text + ///The written note output, sent everytime notes are updated. + var/datum/port/output/updated_text + ///Pinged whenever the text is updated + var/datum/port/output/updated + +/obj/item/circuit_component/mod_program/notepad/populate_ports() + . = ..() + set_text = add_input_port("Set Notes", PORT_TYPE_STRING) + updated_text = add_output_port("Notes", PORT_TYPE_STRING) + updated = add_output_port("Updated", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/mod_program/notepad/register_shell(atom/movable/shell) + . = ..() + RegisterSignal(associated_program, COMSIG_UI_ACT, PROC_REF(on_note_updated)) + +/obj/item/circuit_component/mod_program/notepad/unregister_shell() + UnregisterSignal(associated_program, COMSIG_UI_ACT) + return ..() + +/obj/item/circuit_component/mod_program/notepad/proc/on_note_updated(datum/source, mob/user, action, list/params) + SIGNAL_HANDLER + if(action == "UpdateNote") + updated_text.set_output(params["newnote"]) + updated.set_output(COMPONENT_SIGNAL) + +/obj/item/circuit_component/mod_program/notepad/input_received(datum/port/port) + var/datum/computer_file/program/notepad/pad = associated_program + pad.written_note = set_text.value + SStgui.update_uis(pad.computer) + updated_text.set_output(pad.written_note) + updated.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/modular_computers/file_system/programs/nt_pay.dm b/code/modules/modular_computers/file_system/programs/nt_pay.dm index abaf03fa1cc..398d25cbdef 100644 --- a/code/modules/modular_computers/file_system/programs/nt_pay.dm +++ b/code/modules/modular_computers/file_system/programs/nt_pay.dm @@ -1,3 +1,10 @@ +#define NT_PAY_STATUS_NO_ACCOUNT 0 +#define NT_PAY_STATUS_DEPT_ACCOUNT 1 +#define NT_PAY_STATUS_INVALID_TOKEN 2 +#define NT_PAY_SATUS_SENDER_IS_RECEIVER 3 +#define NT_PAY_STATUS_INVALID_MONEY 4 +#define NT_PAY_STATUS_SUCCESS 5 + /datum/computer_file/program/nt_pay filename = "ntpay" filedesc = "Nanotrasen Pay System" @@ -8,45 +15,19 @@ tgui_id = "NtosPay" program_icon = "money-bill-wave" can_run_on_flags = PROGRAM_ALL + circuit_comp_type = /obj/item/circuit_component/mod_program/nt_pay ///Reference to the currently logged in user. var/datum/bank_account/current_user - ///Pay token, by which we can send credits - var/token - ///Amount of credits, which we sends - var/money_to_send = 0 ///Pay token what we want to find var/wanted_token -/datum/computer_file/program/nt_pay/ui_act(action, list/params, datum/tgui/ui) +/datum/computer_file/program/nt_pay/ui_act(action, list/params, datum/tgui/ui, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("Transaction") - if(IS_DEPARTMENTAL_ACCOUNT(current_user)) - return to_chat(usr, span_notice("The app is unable to withdraw from that card.")) - - token = params["token"] - money_to_send = params["amount"] - var/datum/bank_account/recipient - if(!token) - return to_chat(usr, span_notice("You need to enter your transfer target's pay token.")) - if(!money_to_send) - return to_chat(usr, span_notice("You need to specify how much you're sending.")) - if(token == current_user.pay_token) - return to_chat(usr, span_notice("You can't send credits to yourself.")) - - for(var/account as anything in SSeconomy.bank_accounts_by_id) - var/datum/bank_account/acc = SSeconomy.bank_accounts_by_id[account] - if(acc.pay_token == token) - recipient = acc - break - - if(!recipient) - return to_chat(usr, span_notice("The app can't find who you're trying to pay. Did you enter the pay token right?")) - if(!current_user.has_money(money_to_send) || money_to_send < 1) - return current_user.bank_card_talk("You cannot afford it.") - - recipient.bank_card_talk("You received [money_to_send] credit(s). Reason: transfer from [current_user.account_holder]") - recipient.transfer_money(current_user, money_to_send) - current_user.bank_card_talk("You send [money_to_send] credit(s) to [recipient.account_holder]. Now you have [current_user.account_balance] credit(s)") + var/token = params["token"] + var/money_to_send = params["amount"] + make_payment(token, money_to_send, usr) if("GetPayToken") wanted_token = null @@ -58,8 +39,6 @@ if(!wanted_token) return wanted_token = "Account \"[params["wanted_name"]]\" not found." - - /datum/computer_file/program/nt_pay/ui_data(mob/user) var/list/data = list() @@ -74,3 +53,136 @@ data["transaction_list"] = current_user.transaction_history return data + +///Wrapper and signal for the main payment function of this program +/datum/computer_file/program/nt_pay/proc/make_payment(token, money_to_send, mob/user) + var/payment_result = _pay(token, money_to_send, user) + SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_NT_PAY_RESULT, payment_result) + +/datum/computer_file/program/nt_pay/proc/_pay(token, money_to_send, mob/user) + money_to_send = round(money_to_send) + + if(IS_DEPARTMENTAL_ACCOUNT(current_user)) + if(user) + to_chat(user, span_notice("The app is unable to withdraw from that card.")) + return NT_PAY_STATUS_DEPT_ACCOUNT + + var/datum/bank_account/recipient + if(!token) + if(user) + to_chat(user, span_notice("You need to enter your transfer target's pay token.")) + return NT_PAY_STATUS_INVALID_TOKEN + if(money_to_send <= 0) + if(user) + to_chat(user, span_notice("You need to specify how much you're sending.")) + return NT_PAY_STATUS_INVALID_MONEY + if(token == current_user.pay_token) + if(user) + to_chat(user, span_notice("You can't send credits to yourself.")) + return NT_PAY_SATUS_SENDER_IS_RECEIVER + + for(var/account as anything in SSeconomy.bank_accounts_by_id) + var/datum/bank_account/acc = SSeconomy.bank_accounts_by_id[account] + if(acc.pay_token == token) + recipient = acc + break + + if(!recipient) + if(user) + to_chat(user, span_notice("The app can't find who you're trying to pay. Did you enter the pay token right?")) + return NT_PAY_STATUS_INVALID_TOKEN + if(!current_user.has_money(money_to_send) || money_to_send < 1) + current_user.bank_card_talk("You cannot afford it.") + return NT_PAY_STATUS_INVALID_MONEY + + recipient.bank_card_talk("You received [money_to_send] credit(s). Reason: transfer from [current_user.account_holder]") + recipient.transfer_money(current_user, money_to_send) + for(var/obj/item/card/id/id_card as anything in recipient.bank_cards) + SEND_SIGNAL(id_card, COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED, computer, money_to_send) + + current_user.bank_card_talk("You send [money_to_send] credit(s) to [recipient.account_holder]. Now you have [current_user.account_balance] credit(s)") + + return NT_PAY_STATUS_SUCCESS + + +/obj/item/circuit_component/mod_program/nt_pay + associated_program = /datum/computer_file/program/nt_pay + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + + ///Circuit variables. This one is for the token we want to pay + var/datum/port/input/token_port + ///The port for the money to send + var/datum/port/input/money_port + ///Let's us know if the payment has gone through or not. + var/datum/port/output/payment_status + ///The device from which the payment was received + var/datum/port/output/payment_device + ///Amount of a received payment + var/datum/port/output/payment_amount + ///Pinged whether a payment is received + var/datum/port/output/payment_received + +/obj/item/circuit_component/mod_program/nt_pay/register_shell(atom/movable/shell) + . = ..() + var/obj/item/modular_computer/modpc = associated_program.computer + RegisterSignal(modpc, COMSIG_MODULAR_COMPUTER_NT_PAY_RESULT, PROC_REF(on_payment_done)) + RegisterSignal(modpc, COMSIG_MODULAR_COMPUTER_INSERTED_ID, PROC_REF(register_id)) + if(modpc.computer_id_slot) + register_id(inserted_id = modpc.computer_id_slot) + +/obj/item/circuit_component/mod_program/nt_pay/unregister_shell() + var/obj/item/modular_computer/modpc = associated_program.computer + UnregisterSignal(modpc, list(COMSIG_MODULAR_COMPUTER_NT_PAY_RESULT, COMSIG_MODULAR_COMPUTER_INSERTED_ID)) + if(modpc.computer_id_slot) + UnregisterSignal(modpc.computer_id_slot, list(COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED, COMSIG_MOVABLE_MOVED)) + return ..() + +/obj/item/circuit_component/mod_program/nt_pay/proc/register_id(datum/source, obj/item/card/inserted_id, mob/user) + SIGNAL_HANDLER + RegisterSignal(inserted_id, COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED, PROC_REF(on_payment_received)) + RegisterSignal(inserted_id, COMSIG_MOVABLE_MOVED, PROC_REF(unregister_id)) + +/obj/item/circuit_component/mod_program/nt_pay/proc/unregister_id(obj/item/card/gone) + SIGNAL_HANDLER + UnregisterSignal(gone, list(COMSIG_ID_CARD_NTPAY_MONEY_RECEIVED, COMSIG_MOVABLE_MOVED)) + +/obj/item/circuit_component/mod_program/nt_pay/populate_ports() + . = ..() + token_port = add_input_port("Token", PORT_TYPE_STRING) + money_port = add_input_port("Amount", PORT_TYPE_NUMBER) + payment_status = add_output_port("Status", PORT_TYPE_NUMBER) + payment_device = add_output_port("Payment Sender", PORT_TYPE_ATOM) + payment_amount = add_output_port("Received Amount", PORT_TYPE_NUMBER) + payment_received = add_output_port("Received Payment", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/mod_program/nt_pay/get_ui_notices() + . = ..() + . += create_ui_notice("Outputs require inserted ID", "orange") + . += create_ui_notice("NT-Pay Statuses:") + . += create_ui_notice("Success - [NT_PAY_STATUS_SUCCESS]", "green") + . += create_ui_notice("Fail (No Account) - [NT_PAY_STATUS_NO_ACCOUNT]", "red") + . += create_ui_notice("Fail (Dept Account) - [NT_PAY_STATUS_DEPT_ACCOUNT]", "red") + . += create_ui_notice("Fail (Invalid Token) - [NT_PAY_STATUS_INVALID_TOKEN]", "red") + . += create_ui_notice("Fail (Sender = Receiver) - [NT_PAY_SATUS_SENDER_IS_RECEIVER]", "red") + . += create_ui_notice("Fail (Invalid Amount) - [NT_PAY_STATUS_INVALID_MONEY]", "red") + +/obj/item/circuit_component/mod_program/nt_pay/input_received(datum/port/port) + var/datum/computer_file/program/nt_pay/program = associated_program + program.make_payment(token_port.value, money_port.value) + +/obj/item/circuit_component/mod_program/nt_pay/proc/on_payment_done(datum/source, payment_result) + SIGNAL_HANDLER + payment_status.set_output(payment_result) + +/obj/item/circuit_component/mod_program/nt_pay/proc/on_payment_received(datum/source, obj/item/modular_computer/computer, money_received) + SIGNAL_HANDLER + payment_device.set_output(computer) + payment_amount.set_output(money_received) + payment_received.set_output(COMPONENT_SIGNAL) + +#undef NT_PAY_STATUS_NO_ACCOUNT +#undef NT_PAY_STATUS_DEPT_ACCOUNT +#undef NT_PAY_STATUS_INVALID_TOKEN +#undef NT_PAY_SATUS_SENDER_IS_RECEIVER +#undef NT_PAY_STATUS_INVALID_MONEY +#undef NT_PAY_STATUS_SUCCESS diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 78320e9009f..3fbc7843f18 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -105,6 +105,7 @@ download_completion += download_netspeed /datum/computer_file/program/ntnetdownload/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_downloadfile") if(!downloaded_file) diff --git a/code/modules/modular_computers/file_system/programs/portrait_printer.dm b/code/modules/modular_computers/file_system/programs/portrait_printer.dm index 6fc1358ccaf..0e69dd4969d 100644 --- a/code/modules/modular_computers/file_system/programs/portrait_printer.dm +++ b/code/modules/modular_computers/file_system/programs/portrait_printer.dm @@ -44,6 +44,7 @@ ) /datum/computer_file/program/portrait_printer/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("search") if(search_string != params["to_search"]) diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 59647db7dce..b506777f3de 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -1,3 +1,13 @@ +///The selected target is not trackable +#define RADAR_NOT_TRACKABLE 0 +///The selected target is trackable +#define RADAR_TRACKABLE 1 +///The selected target is trackable, even if subtypes would normally consider it untrackable. +#define RADAR_TRACKABLE_ANYWAY 2 + +///If the target is something it shouldn't be normally tracking, this is the maximum distance within with it an be tracked. +#define MAX_RADAR_CIRCUIT_DISTANCE 18 + /datum/computer_file/program/radar //generic parent that handles most of the process filename = "genericfinder" filedesc = "debug_finder" @@ -58,12 +68,13 @@ return data /datum/computer_file/program/radar/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) - + . = ..() switch(action) if("selecttarget") var/selected_new_ref = params["ref"] if(selected_new_ref in trackable_object_refs()) selected = selected_new_ref + SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_RADAR_SELECTED, selected) return TRUE if("scan") @@ -133,13 +144,22 @@ **arg1 is the atom being evaluated. */ /datum/computer_file/program/radar/proc/trackable(atom/movable/signal) - if(!signal || !computer) - return FALSE + SHOULD_CALL_PARENT(TRUE) + if(isnull(signal) || isnull(computer)) + return RADAR_NOT_TRACKABLE var/turf/here = get_turf(computer) var/turf/there = get_turf(signal) if(!here || !there) - return FALSE //I was still getting a runtime even after the above check while scanning, so fuck it - return (there.z == here.z) || (is_station_level(here.z) && is_station_level(there.z)) + return RADAR_NOT_TRACKABLE //I was still getting a runtime even after the above check while scanning, so fuck it + if(there.z != here.z && (!is_station_level(here.z) || !is_station_level(there.z))) + return RADAR_NOT_TRACKABLE + var/trackable_signal = SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_RADAR_TRACKABLE, signal, here, there) + switch(trackable_signal) + if(COMPONENT_RADAR_TRACK_ANYWAY) + return RADAR_TRACKABLE_ANYWAY + if(COMPONENT_RADAR_DONT_TRACK) + return RADAR_NOT_TRACKABLE + return RADAR_TRACKABLE /** * @@ -168,13 +188,16 @@ *return an atom reference. */ /datum/computer_file/program/radar/proc/find_atom() - return + SHOULD_CALL_PARENT(TRUE) + var/list/atom_container = list(null) + SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_RADAR_FIND_ATOM, atom_container) + return atom_container[1] //We use SSfastprocess for the program icon state because it runs faster than process_tick() does. /datum/computer_file/program/radar/process() if(computer.active_program != src) - STOP_PROCESSING(SSfastprocess, src) //We're not the active program, it's time to stop. - return + //We're not the active program, it's time to stop. + return PROCESS_KILL if(!selected) return @@ -221,9 +244,10 @@ program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET download_access = list(ACCESS_MEDICAL) program_icon = "heartbeat" + circuit_comp_type = /obj/item/circuit_component/mod_program/radar/medical /datum/computer_file/program/radar/lifeline/find_atom() - return locate(selected) in GLOB.human_list + return ..() || (locate(selected) in GLOB.human_list) /datum/computer_file/program/radar/lifeline/scan() objects = list() @@ -243,14 +267,16 @@ objects += list(crewinfo) /datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid) + . = ..() + if(. == RADAR_TRACKABLE_ANYWAY) + return RADAR_TRACKABLE_ANYWAY if(!humanoid || !istype(humanoid)) - return FALSE - if(..()) - if (istype(humanoid.w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/uniform = humanoid.w_uniform - if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum - return TRUE - return FALSE + return RADAR_NOT_TRACKABLE + if(!istype(humanoid.w_uniform, /obj/item/clothing/under)) + return RADAR_NOT_TRACKABLE + var/obj/item/clothing/under/uniform = humanoid.w_uniform + if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum + return RADAR_TRACKABLE ///Tracks all janitor equipment /datum/computer_file/program/radar/custodial_locator @@ -262,9 +288,10 @@ program_icon = "broom" size = 2 detomatix_resistance = DETOMATIX_RESIST_MINOR + circuit_comp_type = /obj/item/circuit_component/mod_program/radar/janitor /datum/computer_file/program/radar/custodial_locator/find_atom() - return locate(selected) in GLOB.janitor_devices + return ..() || (locate(selected) in GLOB.janitor_devices) /datum/computer_file/program/radar/custodial_locator/scan() objects = list() @@ -306,6 +333,7 @@ program_icon = "bomb" arrowstyle = "ntosradarpointerS.png" pointercolor = "red" + circuit_comp_type = /obj/item/circuit_component/mod_program/radar/nukie /datum/computer_file/program/radar/fission360/on_start(mob/living/user) . = ..() @@ -323,7 +351,7 @@ return ..() /datum/computer_file/program/radar/fission360/find_atom() - return SSpoints_of_interest.get_poi_atom_by_ref(selected) + return ..() || SSpoints_of_interest.get_poi_atom_by_ref(selected) /datum/computer_file/program/radar/fission360/scan() objects = list() @@ -379,3 +407,131 @@ span_danger("[computer] vibrates and lets out an ominous alarm. Uh oh."), span_notice("[computer] begins to vibrate rapidly. Wonder what that means..."), ) + + +/** + * Base circuit for the radar program. + * The abstract radar doesn't have this, nor this one is associated to it, so + * make sure to specify the associate_program and circuit_comp_type of subtypes, + */ +/obj/item/circuit_component/mod_program/radar + + ///The target to track + var/datum/port/input/target + ///The selected target, from the app + var/datum/port/output/selected_by_app + /// The result from the output + var/datum/port/output/x_pos + var/datum/port/output/y_pos + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/mod_program/radar/populate_ports() + . = ..() + target = add_input_port("Target", PORT_TYPE_ATOM) + selected_by_app = add_output_port("Selected From Program", PORT_TYPE_ATOM) + x_pos = add_output_port("X", PORT_TYPE_NUMBER) + y_pos = add_output_port("Y", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/mod_program/radar/register_shell(atom/movable/shell) + . = ..() + RegisterSignal(associated_program.computer, COMSIG_MODULAR_COMPUTER_RADAR_TRACKABLE, PROC_REF(can_track)) + RegisterSignal(associated_program.computer, COMSIG_MODULAR_COMPUTER_RADAR_FIND_ATOM, PROC_REF(get_atom)) + RegisterSignal(associated_program.computer, COMSIG_MODULAR_COMPUTER_RADAR_SELECTED, PROC_REF(on_selected)) + +/obj/item/circuit_component/mod_program/radar/unregister_shell() + UnregisterSignal(associated_program.computer, list( + COMSIG_MODULAR_COMPUTER_RADAR_TRACKABLE, + COMSIG_MODULAR_COMPUTER_RADAR_FIND_ATOM, + COMSIG_MODULAR_COMPUTER_RADAR_SELECTED, + )) + return ..() + +/obj/item/circuit_component/mod_program/radar/get_ui_notices() + . = ..() + . += create_ui_notice("Max range for unsupported entities: [MAX_RADAR_CIRCUIT_DISTANCE] tiles", "orange", FA_ICON_BULLSEYE) + +///Set the selected ref of the program to the target (if it exists) and update the x/y pos ports (if trackable) when triggered. +/obj/item/circuit_component/mod_program/radar/input_received(datum/port/port) + var/datum/computer_file/program/radar/radar = associated_program + var/atom/radar_atom = radar.find_atom() + if(target.value != radar_atom) + radar.selected = REF(target.value) + SStgui.update_uis(radar.computer) + if(radar.trackable(radar_atom)) + var/turf/turf = get_turf(radar_atom) + x_pos.set_output(turf.x) + y_pos.set_output(turf.y) + else + x_pos.set_output(null) + y_pos.set_output(null) + +/** + * Check if we can track the object. When making different definitions of this proc for subtypes, include typical + * targets as an exception to this (e.g humans for lifeline) so that even if they're coming from a circuit input + * they won't get filtered by the maximum distance, because they're "supported entities". + */ +/obj/item/circuit_component/mod_program/radar/proc/can_track(datum/source, atom/signal, signal_turf, computer_turf) + SIGNAL_HANDLER + if(target.value && get_dist_euclidian(computer_turf, signal_turf) > MAX_RADAR_CIRCUIT_DISTANCE) + return COMPONENT_RADAR_DONT_TRACK + return COMPONENT_RADAR_TRACK_ANYWAY + +///Return the value of the target port. +/obj/item/circuit_component/mod_program/radar/proc/get_atom(datum/source, list/atom_container) + SIGNAL_HANDLER + atom_container[1] = target.value + +/** + * When a target is selected by the app, reset the target port, update the x/pos ports (if trackable) + * and set selected_by_app port to the target atom. + */ +/obj/item/circuit_component/mod_program/radar/proc/on_selected(datum/source, selected_ref) + SIGNAL_HANDLER + target.set_value(null) + var/datum/computer_file/program/radar/radar = associated_program + var/atom/selected_atom = radar.find_atom() + selected_by_app.set_output(selected_atom) + if(radar.trackable(selected_atom)) + var/turf/turf = get_turf(radar.selected) + x_pos.set_output(turf.x) + y_pos.set_output(turf.y) + else + x_pos.set_output(null) + y_pos.set_output(null) + + trigger_output.set_output(COMPONENT_SIGNAL) + + +/obj/item/circuit_component/mod_program/radar/medical + associated_program = /datum/computer_file/program/radar/lifeline + +/obj/item/circuit_component/mod_program/radar/medical/can_track(datum/source, atom/signal, signal_turf, computer_turf) + if(target.value in GLOB.human_list) + return NONE + return ..() + +/obj/item/circuit_component/mod_program/radar/janitor + associated_program = /datum/computer_file/program/radar/custodial_locator + +/obj/item/circuit_component/mod_program/radar/janitor/can_track(datum/source, atom/signal, signal_turf, computer_turf) + if(target.value in GLOB.janitor_devices) + return NONE + return ..() +/obj/item/circuit_component/mod_program/radar/nukie + associated_program = /datum/computer_file/program/radar/fission360 + +/obj/item/circuit_component/mod_program/radar/nukie/can_track(datum/source, atom/signal, signal_turf, computer_turf) + if(target.value in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/nuclearbomb)) + return NONE + if(target.value in SSpoints_of_interest.real_nuclear_disks) + return NONE + if(target.value == SSshuttle.getShuttle("syndicate")) + return NONE + return ..() + +#undef MAX_RADAR_CIRCUIT_DISTANCE + +#undef RADAR_NOT_TRACKABLE +#undef RADAR_TRACKABLE +#undef RADAR_TRACKABLE_ANYWAY diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 37ae20f5260..00bd00f3e67 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -83,7 +83,8 @@ return data -/datum/computer_file/program/robocontrol/ui_act(action, list/params, datum/tgui/ui) +/datum/computer_file/program/robocontrol/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() var/mob/current_user = ui.user var/obj/item/card/id/id_card = computer?.computer_id_slot diff --git a/code/modules/modular_computers/file_system/programs/robotact.dm b/code/modules/modular_computers/file_system/programs/robotact.dm index d7a7122090d..8a2a824d004 100644 --- a/code/modules/modular_computers/file_system/programs/robotact.dm +++ b/code/modules/modular_computers/file_system/programs/robotact.dm @@ -84,6 +84,7 @@ return data /datum/computer_file/program/robotact/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() //Implied type, memes var/obj/item/modular_computer/pda/silicon/tablet = computer var/mob/living/silicon/robot/cyborg = tablet.silicon_owner diff --git a/code/modules/modular_computers/file_system/programs/signalcommander.dm b/code/modules/modular_computers/file_system/programs/signalcommander.dm index 2032ad5461b..1e6e3e54051 100644 --- a/code/modules/modular_computers/file_system/programs/signalcommander.dm +++ b/code/modules/modular_computers/file_system/programs/signalcommander.dm @@ -8,6 +8,8 @@ tgui_id = "NtosSignaler" program_icon = "satellite-dish" can_run_on_flags = PROGRAM_PDA | PROGRAM_LAPTOP + program_flags = /datum/computer_file/program::program_flags | PROGRAM_CIRCUITS_RUN_WHEN_CLOSED + circuit_comp_type = /obj/item/circuit_component/mod_program/signaler ///What is the saved signal frequency? var/signal_frequency = FREQ_SIGNALER /// What is the saved signal code? @@ -36,10 +38,11 @@ data["maxFrequency"] = MAX_FREE_FREQ return data -/datum/computer_file/program/signal_commander/ui_act(action, list/params) +/datum/computer_file/program/signal_commander/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("signal") - INVOKE_ASYNC(src, PROC_REF(signal)) + INVOKE_ASYNC(src, PROC_REF(signal), usr) . = TRUE if("freq") var/new_signal_frequency = sanitize_frequency(unformat_frequency(params["freq"]), TRUE) @@ -56,27 +59,65 @@ signal_code = initial(signal_code) . = TRUE -/datum/computer_file/program/signal_commander/proc/signal() +/datum/computer_file/program/signal_commander/proc/signal(atom/source) if(!radio_connection) return + var/mob/user + var/obj/item/circuit_component/signaling + if(ismob(source)) + user = source + else if(istype(source, /obj/item/circuit_component)) + signaling = source + if(!COOLDOWN_FINISHED(src, signal_cooldown)) - computer.balloon_alert(usr, "cooling down!") + if(user) + computer.balloon_alert(user, "cooling down!") return COOLDOWN_START(src, signal_cooldown, signal_cooldown_time) - computer.balloon_alert(usr, "signaled") + if(user) + computer.balloon_alert(user, "signaled") var/time = time2text(world.realtime,"hh:mm:ss") var/turf/T = get_turf(computer) - - var/logging_data = "[time] : [key_name(usr)] used the computer '[initial(computer.name)]' @ location ([T.x],[T.y],[T.z]) : [format_frequency(signal_frequency)]/[signal_code]" + var/user_deets + if(signaling) + user_deets = "[signaling.parent.get_creator()]" + else + user_deets = "[key_name(usr)]" + var/logging_data = "[time] : [user_deets] used the computer '[initial(computer.name)]' @ location ([T.x],[T.y],[T.z]) : [format_frequency(signal_frequency)]/[signal_code]" add_to_signaler_investigate_log(logging_data) - var/datum/signal/signal = new(list("code" = signal_code), logging_data = logging_data) + var/datum/signal/signal = new(list("code" = signal_code, "key" = signaling?.parent.owner_id), logging_data = logging_data) radio_connection.post_signal(computer, signal) /datum/computer_file/program/signal_commander/proc/set_frequency(new_frequency) SSradio.remove_object(computer, signal_frequency) signal_frequency = new_frequency radio_connection = SSradio.add_object(computer, signal_frequency, RADIO_SIGNALER) + +/obj/item/circuit_component/mod_program/signaler + associated_program = /datum/computer_file/program/signal_commander + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL + + /// Frequency input + var/datum/port/input/freq + /// Signal input + var/datum/port/input/code + +/obj/item/circuit_component/mod_program/signaler/populate_ports() + . = ..() + freq = add_input_port("Frequency", PORT_TYPE_NUMBER, trigger = PROC_REF(set_freq), default = FREQ_SIGNALER) + code = add_input_port("Code", PORT_TYPE_NUMBER, trigger = PROC_REF(set_code), default = DEFAULT_SIGNALER_CODE) + +/obj/item/circuit_component/mod_program/signaler/proc/set_freq(datum/port/port) + var/datum/computer_file/program/signal_commander/signaler = associated_program + signaler.set_frequency(clamp(freq.value, MIN_FREE_FREQ, MAX_FREE_FREQ)) + +/obj/item/circuit_component/mod_program/signaler/proc/set_code(datum/port/port) + var/datum/computer_file/program/signal_commander/signaler = associated_program + signaler.signal_code = round(clamp(code.value, 1, 100)) + +/obj/item/circuit_component/mod_program/signaler/input_received(datum/port/port) + INVOKE_ASYNC(associated_program, TYPE_PROC_REF(/datum/computer_file/program/signal_commander, signal), src) diff --git a/code/modules/modular_computers/file_system/programs/skill_tracker.dm b/code/modules/modular_computers/file_system/programs/skill_tracker.dm index 9063e3e239d..bd208dcef52 100644 --- a/code/modules/modular_computers/file_system/programs/skill_tracker.dm +++ b/code/modules/modular_computers/file_system/programs/skill_tracker.dm @@ -50,7 +50,8 @@ return null -/datum/computer_file/program/skill_tracker/ui_act(action, params, datum/tgui/ui) +/datum/computer_file/program/skill_tracker/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_reward") var/skill_type = find_skilltype(params["skill"]) diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 0002aa983cc..72ab4d094c0 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -55,6 +55,7 @@ return data /datum/computer_file/program/supermatter_monitor/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_refresh") refresh() diff --git a/code/modules/modular_computers/file_system/programs/statusdisplay.dm b/code/modules/modular_computers/file_system/programs/statusdisplay.dm index 9d21b477971..3b7fb0dc7ee 100644 --- a/code/modules/modular_computers/file_system/programs/statusdisplay.dm +++ b/code/modules/modular_computers/file_system/programs/statusdisplay.dm @@ -4,6 +4,7 @@ program_icon = "signal" program_open_overlay = "generic" size = 1 + circuit_comp_type = /obj/item/circuit_component/mod_program/status extended_desc = "An app used to change the message on the station status displays." tgui_id = "NtosStatus" @@ -42,16 +43,16 @@ * * upper - Top text * * lower - Bottom text */ -/datum/computer_file/program/status/proc/post_message(upper, lower) +/datum/computer_file/program/status/proc/post_message(upper, lower, log_usr = key_name(usr)) post_status("message", upper, lower) - log_game("[key_name(usr)] has changed the station status display message to \"[upper] [lower]\" [loc_name(usr)]") + log_game("[log_usr] has changed the station status display message to \"[upper] [lower]\" [loc_name(usr)]") /** * Post a picture to status displays * Arguments: * * picture - The picture name */ -/datum/computer_file/program/status/proc/post_picture(picture) +/datum/computer_file/program/status/proc/post_picture(picture, log_usr = key_name(usr)) if (!(picture in GLOB.status_display_approved_pictures)) return if(picture in GLOB.status_display_state_pictures) @@ -80,9 +81,10 @@ else post_status("alert", picture) - log_game("[key_name(usr)] has changed the station status display message to \"[picture]\" [loc_name(usr)]") + log_game("[log_usr] has changed the station status display message to \"[picture]\" [loc_name(usr)]") -/datum/computer_file/program/status/ui_act(action, list/params, datum/tgui/ui) +/datum/computer_file/program/status/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("setStatusMessage") upper_text = reject_bad_text(params["upperText"] || "", MAX_STATUS_LINE_LENGTH) @@ -104,3 +106,31 @@ data["lowerText"] = lower_text return data + + +/obj/item/circuit_component/mod_program/status + associated_program = /datum/computer_file/program/status + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + ///When the trigger is signaled, this will be the upper text of status displays. + var/datum/port/input/upper_text + ///When the trigger is signaled, this will be the bottom text. + var/datum/port/input/bottom_text + ///A list port that, when signaled, will set the status image to one of its values + var/datum/port/input/status_display_pics + +/obj/item/circuit_component/mod_program/status/populate_ports() + . = ..() + upper_text = add_input_port("Upper text", PORT_TYPE_STRING) + bottom_text = add_input_port("Bottom text", PORT_TYPE_STRING) + +/obj/item/circuit_component/mod_program/status/populate_options() + status_display_pics = add_option_port("Set Status Display Picture", GLOB.status_display_approved_pictures, trigger = PROC_REF(set_picture)) + +/obj/item/circuit_component/mod_program/status/proc/set_picture(datum/port/port) + var/datum/computer_file/program/status/status = associated_program + INVOKE_ASYNC(status, TYPE_PROC_REF(/datum/computer_file/program/status, post_picture), status_display_pics.value, parent.get_creator()) + +/obj/item/circuit_component/mod_program/status/input_received(datum/port/port) + var/datum/computer_file/program/status/status = associated_program + INVOKE_ASYNC(status, TYPE_PROC_REF(/datum/computer_file/program/status, post_message), upper_text.value, bottom_text.value, parent.get_creator()) diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm index 3d9af432b69..1b2e29baef7 100644 --- a/code/modules/modular_computers/file_system/programs/techweb.dm +++ b/code/modules/modular_computers/file_system/programs/techweb.dm @@ -88,7 +88,8 @@ ) return data -/datum/computer_file/program/science/ui_act(action, list/params) +/datum/computer_file/program/science/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() // Check if the console is locked to block any actions occuring if (locked && action != "toggleLock") computer.say("Console is locked, cannot perform further actions.") diff --git a/code/modules/modular_computers/file_system/programs/theme_selector.dm b/code/modules/modular_computers/file_system/programs/theme_selector.dm index 5fdf1c8d365..6190f9b15ab 100644 --- a/code/modules/modular_computers/file_system/programs/theme_selector.dm +++ b/code/modules/modular_computers/file_system/programs/theme_selector.dm @@ -23,6 +23,7 @@ return data /datum/computer_file/program/themeify/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("PRG_change_theme") var/selected_theme = params["selected_theme"] diff --git a/code/modules/modular_computers/file_system/programs/wirecarp.dm b/code/modules/modular_computers/file_system/programs/wirecarp.dm index 64ef7137b00..f5a0a374aac 100644 --- a/code/modules/modular_computers/file_system/programs/wirecarp.dm +++ b/code/modules/modular_computers/file_system/programs/wirecarp.dm @@ -9,8 +9,10 @@ program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET tgui_id = "NtosNetMonitor" program_icon = "network-wired" + circuit_comp_type = /obj/item/circuit_component/mod_program/ntnetmonitor -/datum/computer_file/program/ntnetmonitor/ui_act(action, list/params, datum/tgui/ui) +/datum/computer_file/program/ntnetmonitor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() switch(action) if("resetIDS") SSmodular_computers.intrusion_detection_alarm = FALSE @@ -66,3 +68,65 @@ data["tablets"] += list(tablet_data) return data + +/obj/item/circuit_component/mod_program/ntnetmonitor + associated_program = /datum/computer_file/program/ntnetmonitor + circuit_flags = CIRCUIT_FLAG_OUTPUT_SIGNAL + ///The stored NTnet relay or PDA to be used as the target of triggers + var/datum/port/input/target + ///Sets `intrusion_detection_alarm` when triggered + var/datum/port/input/toggle_ids + ///Toggles the target ntnet relay on/off when triggered + var/datum/port/input/toggle_relay + ///Purges modpc logs when triggered + var/datum/port/input/purge_logs + ///Toggles the spam mode of the target PDA when triggered + var/datum/port/input/toggle_mass_pda + ///Toggle mime mode of the target PDA when triggered + var/datum/port/input/toggle_mime_mode + ///Returns a list of all PDA Messengers when the "Get Messengers" input is pinged + var/datum/port/output/all_messengers + ///See above + var/datum/port/input/get_pdas + +/obj/item/circuit_component/mod_program/ntnetmonitor/populate_ports() + . = ..() + target = add_input_port("Target Messenger/Relay", PORT_TYPE_ATOM) + toggle_ids = add_input_port("Toggle IDS Status", PORT_TYPE_SIGNAL, trigger = PROC_REF(toggle_ids)) + toggle_relay = add_input_port("Toggle NTnet Relay", PORT_TYPE_SIGNAL, trigger = PROC_REF(toggle_relay)) + purge_logs = add_input_port("Purge Logs", PORT_TYPE_SIGNAL, trigger = PROC_REF(purge_logs)) + toggle_mass_pda = add_input_port("Toggle Mass Messenger", PORT_TYPE_SIGNAL, trigger = PROC_REF(toggle_pda_stuff)) + toggle_mime_mode = add_input_port("Toggle Mime Mode", PORT_TYPE_SIGNAL, trigger = PROC_REF(toggle_pda_stuff)) + get_pdas = add_input_port("Get PDAs", PORT_TYPE_SIGNAL, trigger = PROC_REF(get_pdas)) + all_messengers = add_output_port("List of PDAs", PORT_TYPE_LIST(PORT_TYPE_ATOM)) + +/obj/item/circuit_component/mod_program/ntnetmonitor/proc/get_pdas(datum/port/port) + var/list/computers_with_messenger = list() + for(var/messenger_ref as anything in GLOB.pda_messengers) + var/datum/computer_file/program/messenger/messenger = GLOB.pda_messengers[messenger_ref] + computers_with_messenger |= WEAKREF(messenger.computer) + all_messengers.set_output(computers_with_messenger) + +/obj/item/circuit_component/mod_program/ntnetmonitor/proc/toggle_ids(datum/port/port) + SSmodular_computers.intrusion_detection_enabled = !SSmodular_computers.intrusion_detection_enabled + +/obj/item/circuit_component/mod_program/ntnetmonitor/proc/toggle_relay(datum/port/port) + var/obj/machinery/ntnet_relay/target_relay = target.value + if(!istype(target_relay)) + return + target_relay.set_relay_enabled(!target_relay.relay_enabled) + +/obj/item/circuit_component/mod_program/ntnetmonitor/proc/purge_logs(datum/port/port) + SSmodular_computers.purge_logs() + +/obj/item/circuit_component/mod_program/ntnetmonitor/proc/toggle_pda_stuff(datum/port/port) + var/obj/item/modular_computer/computer = target.value + if(!istype(computer)) + return + var/datum/computer_file/program/messenger/target_messenger = locate() in computer.stored_files + if(isnull(target_messenger)) + return + if(COMPONENT_TRIGGERED_BY(toggle_mass_pda, port)) + target_messenger.spam_mode = !target_messenger.spam_mode + if(COMPONENT_TRIGGERED_BY(toggle_mime_mode, port)) + target_messenger.mime_mode = !target_messenger.mime_mode diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm index 433200e3223..6bdf2f31760 100644 --- a/code/modules/movespeed/modifiers/items.dm +++ b/code/modules/movespeed/modifiers/items.dm @@ -17,5 +17,12 @@ /datum/movespeed_modifier/sphere multiplicative_slowdown = -0.5 +/datum/movespeed_modifier/hook_jawed + multiplicative_slowdown = 4 + /datum/movespeed_modifier/shooting_assistant multiplicative_slowdown = 0.5 + +/datum/movespeed_modifier/binocs_wielded + multiplicative_slowdown = 1.5 + diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 3c7bd93c3bd..52c4534d4fa 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -80,6 +80,9 @@ /// Remote signaler var/obj/item/assembly/signaler/internal/signaler + ///The messeenger ability that pAIs get when they are put in a PDA. + var/datum/action/innate/pai/messenger/messenger_ability + // Static lists /// List of all available downloads var/static/list/available_software = list( @@ -149,6 +152,7 @@ return ..(target, action_bitflags) /mob/living/silicon/pai/Destroy() + QDEL_NULL(messenger_ability) QDEL_NULL(atmos_analyzer) QDEL_NULL(hacking_cable) QDEL_NULL(instrument) @@ -203,6 +207,8 @@ /mob/living/silicon/pai/Initialize(mapload) . = ..() + if(istype(loc, /obj/item/modular_computer)) + give_messenger_ability() START_PROCESSING(SSfastprocess, src) GLOB.pai_list += src make_laws() @@ -457,3 +463,14 @@ if (new_distance < HOLOFORM_MIN_RANGE || new_distance > HOLOFORM_MAX_RANGE) return leash.set_distance(new_distance) + +///Gives the messenger ability to the pAI, creating a new one if it doesn't have one already. +/mob/living/silicon/pai/proc/give_messenger_ability() + if(!messenger_ability) + messenger_ability = new(src) + messenger_ability.Grant(src) + +///Removes the messenger ability from the pAI, but does not delete it. +/mob/living/silicon/pai/proc/remove_messenger_ability() + if(messenger_ability) + messenger_ability.Remove(src) diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 47588a65706..b72ce806dd3 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -167,8 +167,8 @@ /////////// Lavaland /obj/item/paper/fluff/stations/lavaland/orm_notice - name = "URGENT!" - default_raw_text = "A hastily written note has been scribbled here...

Please use the ore redemption machine in the cargo office for smelting. PLEASE!

--The Research Staff" + name = "URGENT! RENOVATIONS!" + default_raw_text = "A hastily written note has been scribbled here...

Please use the ore redemption machine smelter and refinery in the cargo office for smelting. PLEASE! Leave boulders alone for the BRM to pick up!

--The Research Staff" /////////// Space Ruins diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index aaa63c05d85..509eb4f05b9 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -299,6 +299,8 @@ return TRUE /obj/machinery/power/apc/proc/set_broken() + if(machine_stat & BROKEN) + return if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) operating = FALSE diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index b822ce2003f..92ae9069dc2 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -463,11 +463,13 @@ update() if("emergency_lighting") emergency_lights = !emergency_lights - for(var/obj/machinery/light/L in area) - if(!initial(L.no_low_power)) //If there was an override set on creation, keep that override - L.no_low_power = emergency_lights - INVOKE_ASYNC(L, TYPE_PROC_REF(/obj/machinery/light/, update), FALSE) - CHECK_TICK + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/light/area_light in area_turf) + if(!initial(area_light.no_low_power)) //If there was an override set on creation, keep that override + area_light.no_low_power = emergency_lights + INVOKE_ASYNC(area_light, TYPE_PROC_REF(/obj/machinery/light/, update), FALSE) + CHECK_TICK return TRUE /obj/machinery/power/apc/ui_close(mob/user) @@ -677,10 +679,12 @@ INVOKE_ASYNC(src, PROC_REF(break_lights)) /obj/machinery/power/apc/proc/break_lights() - for(var/obj/machinery/light/breaked_light in area) - breaked_light.on = TRUE - breaked_light.break_light_tube() - stoplag() + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/light/breaked_light in area_turf) + breaked_light.on = TRUE + breaked_light.break_light_tube() + stoplag() /obj/machinery/power/apc/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return (exposed_temperature > 2000) diff --git a/code/modules/power/apc/apc_malf.dm b/code/modules/power/apc/apc_malf.dm index 3b070368804..62134de146e 100644 --- a/code/modules/power/apc/apc_malf.dm +++ b/code/modules/power/apc/apc_malf.dm @@ -37,7 +37,7 @@ if(!is_station_level(z)) return malf.ShutOffDoomsdayDevice() - occupier = new /mob/living/silicon/ai(src, malf.laws, malf) //DEAR GOD WHY? //IKR???? + occupier = new /mob/living/silicon/ai(src, malf.laws.copy_lawset(), malf) //DEAR GOD WHY? //IKR???? occupier.adjustOxyLoss(malf.getOxyLoss()) if(!findtext(occupier.name, "APC Copy")) occupier.name = "[malf.name] APC Copy" diff --git a/code/modules/power/apc/apc_power_proc.dm b/code/modules/power/apc/apc_power_proc.dm index b49c0ba0a74..52a671f00f5 100644 --- a/code/modules/power/apc/apc_power_proc.dm +++ b/code/modules/power/apc/apc_power_proc.dm @@ -138,8 +138,10 @@ if(nightshift_lights == on) return //no change nightshift_lights = on - for(var/obj/machinery/light/night_light in area) - if(night_light.nightshift_allowed) - night_light.nightshift_enabled = nightshift_lights - night_light.update(FALSE) - CHECK_TICK + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/light/night_light in area_turf) + if(night_light.nightshift_allowed) + night_light.nightshift_enabled = nightshift_lights + night_light.update(FALSE) + CHECK_TICK diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index b35f4de3fba..e712f474464 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -77,6 +77,7 @@ return toggle_panel_open() balloon_alert(user, "wires [panel_open ? "exposed" : "unexposed"]") + W.play_tool_sound(src) update_appearance() return diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm deleted file mode 100644 index 6fa17d8dbe9..00000000000 --- a/code/modules/power/generator.dm +++ /dev/null @@ -1,232 +0,0 @@ -/obj/machinery/power/generator - name = "thermoelectric generator" - desc = "It's a high efficiency thermoelectric generator." - icon_state = "teg" - density = TRUE - use_power = NO_POWER_USE - - circuit = /obj/item/circuitboard/machine/generator - - var/obj/machinery/atmospherics/components/binary/circulator/cold_circ - var/obj/machinery/atmospherics/components/binary/circulator/hot_circ - - var/lastgen = 0 - var/lastgenlev = -1 - var/lastcirc = "00" - - -/obj/machinery/power/generator/Initialize(mapload) - . = ..() - AddComponent(/datum/component/simple_rotation) - find_circs() - connect_to_network() - SSair.start_processing_machine(src) - update_appearance() - -/obj/machinery/power/generator/Destroy() - kill_circs() - SSair.stop_processing_machine(src) - return ..() - -/obj/machinery/power/generator/update_overlays() - . = ..() - if(machine_stat & (NOPOWER|BROKEN)) - return - - var/L = min(round(lastgenlev / 100000), 11) - if(L != 0) - . += mutable_appearance('icons/obj/machines/engine/other.dmi', "teg-op[L]") - if(hot_circ && cold_circ) - . += "teg-oc[lastcirc]" - - -#define GENRATE 800 // generator output coefficient from Q - -/obj/machinery/power/generator/process_atmos() - - if(!cold_circ || !hot_circ) - return - - if(powernet) - var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() - var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() - - if(cold_air && hot_air) - - var/cold_air_heat_capacity = cold_air.heat_capacity() - var/hot_air_heat_capacity = hot_air.heat_capacity() - - var/delta_temperature = hot_air.temperature - cold_air.temperature - - - if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) - var/efficiency = 0.65 - - var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) - - var/heat = energy_transfer*(1-efficiency) - lastgen += energy_transfer*efficiency - - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity - cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - - //add_avail(lastgen) This is done in process now - // update icon overlays only if displayed level has changed - - if(hot_air) - var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] - hot_circ_air1.merge(hot_air) - - if(cold_air) - var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] - cold_circ_air1.merge(cold_air) - - update_appearance() - - var/circ = "[cold_circ?.last_pressure_delta > 0 ? "1" : "0"][hot_circ?.last_pressure_delta > 0 ? "1" : "0"]" - if(circ != lastcirc) - lastcirc = circ - update_appearance() - - src.updateDialog() - -/obj/machinery/power/generator/process() - //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** - var/power_output = round(lastgen / 10) - add_avail(power_output) - lastgenlev = power_output - lastgen -= power_output - ..() - -/obj/machinery/power/generator/proc/get_menu(include_link = TRUE) - var/t = "" - if(!powernet) - t += "Unable to connect to the power network!" - else if(cold_circ && hot_circ) - var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] - var/datum/gas_mixture/cold_circ_air2 = cold_circ.airs[2] - var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] - var/datum/gas_mixture/hot_circ_air2 = hot_circ.airs[2] - - t += "
" - - t += "Output: [display_power(lastgenlev)]" - - t += "
" - - t += "Cold loop
" - t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa
" - - t += "Hot loop
" - t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
" - - t += "
" - else if(!hot_circ && cold_circ) - t += "Unable to locate hot circulator!" - else if(hot_circ && !cold_circ) - t += "Unable to locate cold circulator!" - else - t += "Unable to locate any parts!" - if(include_link) - t += "
Close" - - return t - -/obj/machinery/power/generator/ui_interact(mob/user) - . = ..() - var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300) - popup.set_content(get_menu()) - popup.open() - -/obj/machinery/power/generator/Topic(href, href_list) - if(..()) - return - if( href_list["close"] ) - usr << browse(null, "window=teg") - usr.unset_machine() - return FALSE - return TRUE - - - -/obj/machinery/power/generator/proc/find_circs() - kill_circs() - var/list/circs = list() - var/obj/machinery/atmospherics/components/binary/circulator/C - var/circpath = /obj/machinery/atmospherics/components/binary/circulator - if(dir == NORTH || dir == SOUTH) - C = locate(circpath) in get_step(src, EAST) - if(C && C.dir == WEST) - circs += C - - C = locate(circpath) in get_step(src, WEST) - if(C && C.dir == EAST) - circs += C - - else - C = locate(circpath) in get_step(src, NORTH) - if(C && C.dir == SOUTH) - circs += C - - C = locate(circpath) in get_step(src, SOUTH) - if(C && C.dir == NORTH) - circs += C - - if(circs.len) - for(C in circs) - if(C.mode == CIRCULATOR_COLD && !cold_circ) - cold_circ = C - C.generator = src - else if(C.mode == CIRCULATOR_HOT && !hot_circ) - hot_circ = C - C.generator = src - -/obj/machinery/power/generator/wrench_act(mob/living/user, obj/item/I) - . = ..() - if(!panel_open) - return - set_anchored(!anchored) - I.play_tool_sound(src) - if(!anchored) - kill_circs() - connect_to_network() - to_chat(user, span_notice("You [anchored?"secure":"unsecure"] [src].")) - return TRUE - -/obj/machinery/power/generator/multitool_act(mob/living/user, obj/item/I) - . = ..() - if(!anchored) - return - find_circs() - to_chat(user, span_notice("You update [src]'s circulator links.")) - return TRUE - -/obj/machinery/power/generator/screwdriver_act(mob/user, obj/item/I) - if(..()) - return TRUE - toggle_panel_open() - I.play_tool_sound(src) - to_chat(user, span_notice("You [panel_open?"open":"close"] the panel on [src].")) - return TRUE - -/obj/machinery/power/generator/crowbar_act(mob/user, obj/item/I) - default_deconstruction_crowbar(I) - return TRUE - -/obj/machinery/power/generator/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -/obj/machinery/power/generator/on_deconstruction() - kill_circs() - -/obj/machinery/power/generator/proc/kill_circs() - if(hot_circ) - hot_circ.generator = null - hot_circ = null - if(cold_circ) - cold_circ.generator = null - cold_circ = null - -#undef GENRATE diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 0fe5b32838b..f12da549da3 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -60,6 +60,8 @@ return can_change_cable_layer /obj/machinery/power/multitool_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(!can_change_cable_layer || !cable_layer_change_checks(user, tool)) return @@ -141,17 +143,17 @@ * - Amount: How much power the APC's cell is to be costed. */ /obj/machinery/proc/directly_use_power(amount) - var/area/A = get_area(src) - var/obj/machinery/power/apc/local_apc - if(!A) + var/area/my_area = get_area(src) + if(isnull(my_area)) + stack_trace("machinery is somehow not in an area, nullspace?") return FALSE - local_apc = A.apc - if(!local_apc) + if(!my_area.requires_power) + return TRUE + + var/obj/machinery/power/apc/my_apc = my_area.apc + if(isnull(my_apc)) return FALSE - if(!local_apc.cell) - return FALSE - local_apc.cell.use(amount) - return TRUE + return my_apc.cell.use(amount) /** * Attempts to draw power directly from the APC's Powernet rather than the APC's battery. For high-draw machines, like the cell charger diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index af48e9c5944..f79eb808a87 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -22,7 +22,6 @@ connect_to_network() /obj/machinery/power/rtg/process() - ..() add_avail(power_gen) /obj/machinery/power/rtg/RefreshParts() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 7ba24d69b72..77836007fd5 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -141,6 +141,9 @@ if(!active || !powernet) icon_state = base_icon_state return ..() + if(panel_open) + icon_state = "[base_icon_state]_open" + return ..() icon_state = avail(active_power_usage) ? icon_state_on : icon_state_underpowered return ..() @@ -310,7 +313,7 @@ /obj/machinery/power/emitter/screwdriver_act(mob/living/user, obj/item/item) if(..()) return TRUE - default_deconstruction_screwdriver(user, "emitter_open", "emitter", item) + default_deconstruction_screwdriver(user, "[base_icon_state]_open", base_icon_state, item) return TRUE /// Attempt to toggle the controls lock of the emitter @@ -424,7 +427,7 @@ return buckled_mob.forceMove(get_turf(src)) ..() - playsound(src,'sound/mecha/mechmove01.ogg', 50, TRUE) + playsound(src, 'sound/mecha/mechmove01.ogg', 50, TRUE) buckled_mob.pixel_y = 14 layer = 4.1 if(buckled_mob.client) @@ -434,7 +437,7 @@ auto.Grant(buckled_mob, src) /datum/action/innate/proto_emitter - check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_IMMOBILE | AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED ///Stores the emitter the user is currently buckled on var/obj/machinery/power/emitter/prototype/proto_emitter ///Stores the mob instance that is buckled to the emitter diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index a778d99cc01..4f45d0a50e3 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -318,7 +318,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) damage_factors = calculate_damage() if(damage == 0) // Clear any in game forced delams if on full health. set_delam(SM_DELAM_PRIO_IN_GAME, SM_DELAM_STRATEGY_PURGE) - else if(damage <= explosion_point) + else if(!final_countdown) set_delam(SM_DELAM_PRIO_NONE, SM_DELAM_STRATEGY_PURGE) // This one cant clear any forced delams. delamination_strategy.delam_progress(src) if(damage > explosion_point && !final_countdown) @@ -565,7 +565,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) header = "Meltdown Incoming", ) - var/datum/sm_delam/last_delamination_strategy = delamination_strategy var/list/count_down_messages = delamination_strategy.count_down_messages() radio.talk_into( @@ -588,10 +587,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ) for(var/i in delamination_countdown_time to 0 step -10) - if(last_delamination_strategy != delamination_strategy) - count_down_messages = delamination_strategy.count_down_messages() - last_delamination_strategy = delamination_strategy - var/message var/healed = FALSE diff --git a/code/modules/power/thermoelectric_generator.dm b/code/modules/power/thermoelectric_generator.dm new file mode 100644 index 00000000000..1f8319ad51d --- /dev/null +++ b/code/modules/power/thermoelectric_generator.dm @@ -0,0 +1,222 @@ +#define TEG_EFFICIENCY 0.65 + +/obj/machinery/power/thermoelectric_generator + name = "thermoelectric generator" + desc = "It's a high efficiency thermoelectric generator." + icon_state = "teg" + base_icon_state = "teg" + density = TRUE + use_power = NO_POWER_USE + circuit = /obj/item/circuitboard/machine/thermoelectric_generator + + ///The cold circulator machine, containing cold gas for the mix. + var/obj/machinery/atmospherics/components/binary/circulator/cold_circ + ///The hot circulator machine, containing very hot gas for the mix. + var/obj/machinery/atmospherics/components/binary/circulator/hot_circ + ///The amount of power the generator is currently producing. + var/lastgen = 0 + ///The amount of power the generator has last produced. + var/lastgenlev = -1 + /** + * Used in overlays for the TEG, basically; + * one number is for the cold mix, one is for the hot mix + * If the cold mix has pressure in it, then the first number is 1, else 0 + * If the hot mix has pressure in it, then the second number is 1, else 0 + * Neither has pressure: 00 + * Only cold has pressure: 10 + * Only hot has pressure: 01 + * Both has pressure: 11 + */ + var/last_pressure_overlay = "00" + +/obj/machinery/power/thermoelectric_generator/Initialize(mapload) + . = ..() + AddComponent(/datum/component/simple_rotation) + find_circulators() + connect_to_network() + SSair.start_processing_machine(src) + update_appearance() + +/obj/machinery/power/thermoelectric_generator/Destroy() + null_circulators() + SSair.stop_processing_machine(src) + return ..() + +/obj/machinery/power/thermoelectric_generator/on_deconstruction() + null_circulators() + +/obj/machinery/power/thermoelectric_generator/update_overlays() + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return + + var/level = min(round(lastgenlev / 100000), 11) + if(level) + . += mutable_appearance('icons/obj/machines/engine/other.dmi', "[base_icon_state]-op[level]") + if(hot_circ && cold_circ) + . += "[base_icon_state]-oc[last_pressure_overlay]" + +/obj/machinery/power/thermoelectric_generator/wrench_act(mob/living/user, obj/item/tool) + if(!panel_open) + balloon_alert(user, "open the panel!") + return + set_anchored(!anchored) + tool.play_tool_sound(src) + if(anchored) + connect_to_network() + else + null_circulators() + balloon_alert(user, "[anchored ? "secure" : "unsecure"]") + return TRUE + +/obj/machinery/power/thermoelectric_generator/multitool_act(mob/living/user, obj/item/tool) + . = ..() + if(!anchored) + return + find_circulators() + balloon_alert(user, "circulators updated") + return TRUE + +/obj/machinery/power/thermoelectric_generator/screwdriver_act(mob/user, obj/item/tool) + if(!anchored) + balloon_alert(user, "anchor it down!") + return + toggle_panel_open() + tool.play_tool_sound(src) + balloon_alert(user, "panel [panel_open ? "open" : "closed"]") + return TRUE + +/obj/machinery/power/thermoelectric_generator/crowbar_act(mob/living/user, obj/item/tool) + default_deconstruction_crowbar(tool) + return TRUE + +/obj/machinery/power/thermoelectric_generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + +/obj/machinery/power/thermoelectric_generator/process_atmos() + if(!cold_circ || !hot_circ) + return + if(!powernet) + return + + var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air() + var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air() + if(cold_air && hot_air) + var/cold_air_heat_capacity = cold_air.heat_capacity() + var/hot_air_heat_capacity = hot_air.heat_capacity() + var/delta_temperature = hot_air.temperature - cold_air.temperature + if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) + var/efficiency = TEG_EFFICIENCY + var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) + var/heat = energy_transfer*(1-efficiency) + lastgen += energy_transfer*efficiency + hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity + cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity + + if(hot_air) + var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] + hot_circ_air1.merge(hot_air) + + if(cold_air) + var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] + cold_circ_air1.merge(cold_air) + + var/current_pressure = "[cold_circ?.last_pressure_delta > 0 ? "1" : "0"][hot_circ?.last_pressure_delta > 0 ? "1" : "0"]" + if(current_pressure != last_pressure_overlay) + //this requires an update to overlays. + last_pressure_overlay = current_pressure + + update_appearance(UPDATE_ICON) + +/obj/machinery/power/thermoelectric_generator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ThermoElectricGenerator", name) + ui.open() + +/obj/machinery/power/thermoelectric_generator/ui_data(mob/user) + var/list/data = list() + data["error_message"] = null + if(!powernet) + data["error_message"] = "Unable to connect to the power network!" + return data + if(!cold_circ && !hot_circ) + data["error_message"] = "Unable to locate any parts! Multitool the machine to sync to nearby parts." + return data + if(!cold_circ) + data["error_message"] = "Unable to locate cold circulator!" + return data + if(!hot_circ) + data["error_message"] = "Unable to locate hot circulator!" + return data + + var/datum/gas_mixture/cold_circ_air1 = cold_circ.airs[1] + var/datum/gas_mixture/cold_circ_air2 = cold_circ.airs[2] + + var/datum/gas_mixture/hot_circ_air1 = hot_circ.airs[1] + var/datum/gas_mixture/hot_circ_air2 = hot_circ.airs[2] + + data["last_power_output"] = display_power(lastgenlev) + + var/list/cold_data = list() + cold_data["temperature_inlet"] = round(cold_circ_air2.temperature, 0.1) + cold_data["temperature_outlet"] = round(cold_circ_air1.temperature, 0.1) + cold_data["pressure_inlet"] = round(cold_circ_air2.return_pressure(), 0.1) + cold_data["pressure_outlet"] = round(cold_circ_air1.return_pressure(), 0.1) + data["cold_data"] = list(cold_data) + + var/list/hot_data = list() + hot_data["temperature_inlet"] = round(hot_circ_air2.temperature, 0.1) + hot_data["temperature_outlet"] = round(hot_circ_air1.temperature, 0.1) + hot_data["pressure_inlet"] = round(hot_circ_air2.return_pressure(), 0.1) + hot_data["pressure_outlet"] = round(hot_circ_air1.return_pressure(), 0.1) + data["hot_data"] = list(hot_data) + + return data + +///Finds and connects nearby valid circulators to the machine, nulling out previous ones. +/obj/machinery/power/thermoelectric_generator/proc/find_circulators() + null_circulators() + var/list/valid_circulators = list() + + if(dir & (NORTH|SOUTH)) + var/obj/machinery/atmospherics/components/binary/circulator/east_circulator = locate() in get_step(src, EAST) + if(east_circulator && east_circulator.dir == WEST) + valid_circulators += east_circulator + var/obj/machinery/atmospherics/components/binary/circulator/west_circulator = locate() in get_step(src, WEST) + if(west_circulator && west_circulator.dir == EAST) + valid_circulators += west_circulator + else + var/obj/machinery/atmospherics/components/binary/circulator/north_circulator = locate() in get_step(src, NORTH) + if(north_circulator && north_circulator.dir == SOUTH) + valid_circulators += north_circulator + var/obj/machinery/atmospherics/components/binary/circulator/south_circulator = locate() in get_step(src, SOUTH) + if(south_circulator && south_circulator.dir == NORTH) + valid_circulators += south_circulator + + if(!valid_circulators.len) + return + + for(var/obj/machinery/atmospherics/components/binary/circulator/circulators as anything in valid_circulators) + if(circulators.mode == CIRCULATOR_COLD && !cold_circ) + cold_circ = circulators + circulators.generator = src + continue + if(circulators.mode == CIRCULATOR_HOT && !hot_circ) + hot_circ = circulators + circulators.generator = src + +///Removes hot and cold circulators from the generator, nulling them. +/obj/machinery/power/thermoelectric_generator/proc/null_circulators() + if(hot_circ) + hot_circ.generator = null + hot_circ = null + if(cold_circ) + cold_circ.generator = null + cold_circ = null + +#undef TEG_EFFICIENCY diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 06466318025..fa1a885044a 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -7,25 +7,17 @@ can_atmos_pass = ATMOS_PASS_DENSITY processing_flags = NONE - ///Theoretical volume of gas that's moving through the turbine, it expands the further it goes - var/gas_theoretical_volume = 0 - ///Stores the turf thermal conductivity to restore it later - var/our_turf_thermal_conductivity ///Checks if the machine is processing or not var/active = FALSE ///The parts can be registered on the main one only when their panel is closed var/can_connect = TRUE - ///Reference to our turbine part var/obj/item/turbine_parts/installed_part ///Path of the turbine part we can install var/obj/item/turbine_parts/part_path - - var/has_gasmix = FALSE + ///The gas mixture this turbine part is storing var/datum/gas_mixture/machine_gasmix - var/mapped = TRUE - ///Our overlay when active var/active_overlay = "" ///Our overlay when off @@ -35,20 +27,22 @@ ///Should we use emissive appearance? var/emissive = FALSE -/obj/machinery/power/turbine/Initialize(mapload) +/obj/machinery/power/turbine/Initialize(mapload, gas_theoretical_volume) . = ..() - if(has_gasmix) - machine_gasmix = new - machine_gasmix.volume = gas_theoretical_volume + machine_gasmix = new + machine_gasmix.volume = gas_theoretical_volume - if(part_path && mapped) + if(mapload) installed_part = new part_path(src) air_update_turf(TRUE) update_appearance() + register_context() + + /obj/machinery/power/turbine/LateInitialize() . = ..() activate_parts() @@ -60,13 +54,22 @@ QDEL_NULL(installed_part) if(machine_gasmix) - machine_gasmix = null + QDEL_NULL(machine_gasmix) deactivate_parts() return ..() /** * Handles all the calculations needed for the gases, work done, temperature increase/decrease + * + * Arguments + * * datum/gas_mixture/input_mix - the gas from the environment or from another part of the turbine + * * datum/gas_mixture/output_mix - the gas that got pumped into this part from the input mix. + * ideally should be same as input mix but varying texmperatur & pressures can cause varying results + * * work_amount_to_remove - the amount of work to subtract from the actual work done to pump in the input mixture. + * For e.g. if gas was transfered from the inlet compressor to the rotor we want to subtract the work done + * by the inlet from the rotor to get the true work done + * * intake_size - the percentage of gas to be fed into an turbine part, controlled by turbine computer for inlet compressor only */ /obj/machinery/power/turbine/proc/transfer_gases(datum/gas_mixture/input_mix, datum/gas_mixture/output_mix, work_amount_to_remove, intake_size = 1) //pump gases. if no gases were transferred then no work was done @@ -91,15 +94,49 @@ /obj/machinery/power/turbine/block_superconductivity() return TRUE +/obj/machinery/power/turbine/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(isnull(held_item)) + return NONE + + if(panel_open && istype(held_item, part_path)) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "[installed_part ? "Replace" : "Install"] part" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "[panel_open ? "Close" : "Open"] panel" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_WRENCH && panel_open) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Rotate" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_CROWBAR) + if(installed_part) + context[SCREENTIP_CONTEXT_CTRL_RMB] = "Remove part" + if(panel_open) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_MULTITOOL) + if(panel_open) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Change cable layer" + else + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Link parts" + return CONTEXTUAL_SCREENTIP_SET + /obj/machinery/power/turbine/examine(mob/user) . = ..() if(installed_part) - . += "Currently at tier [installed_part.current_tier]." + . += span_notice("Currently at tier [installed_part.current_tier].") if(installed_part.current_tier + 1 < installed_part.max_tier) - . += "Can be upgraded by using a tier [installed_part.current_tier + 1] part." - . += "The [installed_part.name] can be removed by right-click with a crowbar tool." + . += span_notice("Can be upgraded by using a tier [installed_part.current_tier + 1] part.") + . += span_notice("The [installed_part.name] can be [EXAMINE_HINT("pried")] out.") else - . += "Is missing a [initial(part_path.name)]." + . += span_warning("Is missing a [initial(part_path.name)].") + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + if(panel_open) + . += span_notice("It can rotated with a [EXAMINE_HINT("wrench")]") + . += span_notice("The full machine can be [EXAMINE_HINT("pried")] apart") /obj/machinery/power/turbine/update_overlays() . = ..() @@ -114,12 +151,13 @@ . += off_overlay /obj/machinery/power/turbine/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING if(active) balloon_alert(user, "turn it off!") - return ITEM_INTERACT_SUCCESS + return if(!anchored) balloon_alert(user, "anchor first!") - return ITEM_INTERACT_SUCCESS + return tool.play_tool_sound(src, 50) toggle_panel_open() @@ -127,44 +165,54 @@ deactivate_parts(user) else activate_parts(user) - balloon_alert(user, "you [panel_open ? "open" : "close"] the maintenance hatch of [src]") update_appearance() return ITEM_INTERACT_SUCCESS /obj/machinery/power/turbine/wrench_act(mob/living/user, obj/item/tool) - return default_change_direction_wrench(user, tool) + . = ITEM_INTERACT_BLOCKING + if(default_change_direction_wrench(user, tool)) + return ITEM_INTERACT_SUCCESS /obj/machinery/power/turbine/crowbar_act(mob/living/user, obj/item/tool) - return default_deconstruction_crowbar(tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS /obj/machinery/power/turbine/on_deconstruction() - if(installed_part) - installed_part.forceMove(loc) + installed_part?.forceMove(loc) return ..() /obj/machinery/power/turbine/crowbar_act_secondary(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING if(!panel_open) balloon_alert(user, "panel is closed!") - return ITEM_INTERACT_SUCCESS + return if(!installed_part) balloon_alert(user, "no rotor installed!") - return ITEM_INTERACT_SUCCESS + return if(active) balloon_alert(user, "[src] is on!") - return ITEM_INTERACT_SUCCESS - user.put_in_hands(installed_part) + return + user.put_in_hands(installed_part) return ITEM_INTERACT_SUCCESS /** * Allow easy enabling of each machine for connection to the main controller + * + * Arguments + * * mob/user - the player who activated the parts + * * check_only - if TRUE it will not activate the machine but will only check if it can be activated */ /obj/machinery/power/turbine/proc/activate_parts(mob/user, check_only = FALSE) can_connect = TRUE /** * Allow easy disabling of each machine from the main controller + * + * Arguments + * * mob/user - the player who deactivated the parts */ /obj/machinery/power/turbine/proc/deactivate_parts(mob/user) can_connect = FALSE @@ -196,7 +244,7 @@ //install the part if(!do_after(user, 2 SECONDS, src)) - return + return TRUE if(installed_part) user.put_in_hands(installed_part) balloon_alert(user, "replaced part with the one in hand") @@ -204,29 +252,19 @@ balloon_alert(user, "installed new part") user.transferItemToLoc(object, src) installed_part = object + return TRUE -/** - * Gets the efficiency of the installed part, returns 0 if no part is installed - */ +/// Gets the efficiency of the installed part, returns 0 if no part is installed /obj/machinery/power/turbine/proc/get_efficiency() - if(installed_part) - return installed_part.part_efficiency - return 0 + return installed_part?.part_efficiency || 0 /obj/machinery/power/turbine/inlet_compressor name = "inlet compressor" desc = "The input side of a turbine generator, contains the compressor." icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "inlet_compressor" - circuit = /obj/item/circuitboard/machine/turbine_compressor - - gas_theoretical_volume = 1000 - part_path = /obj/item/turbine_parts/compressor - - has_gasmix = TRUE - active_overlay = "inlet_animation" off_overlay = "inlet_off" open_overlay = "inlet_open" @@ -239,9 +277,13 @@ var/compressor_work /// Pressure of gases absorbed var/compressor_pressure - ///Ratio of the amount of gas going in the turbine + ///Ratio of gases going in the turbine var/intake_regulator = 0.5 +/obj/machinery/power/turbine/inlet_compressor/Initialize(mapload) + //Volume of gas mixture is 1000 + return ..(mapload, gas_theoretical_volume = 1000) + /obj/machinery/power/turbine/inlet_compressor/deactivate_parts(mob/user) . = ..() if(!QDELETED(rotor)) @@ -266,29 +308,19 @@ //the compressor compresses down the gases from 2500 L to 1000 L //the temperature and pressure rises up, you can regulate this to increase/decrease the amount of gas moved in. compressor_work = transfer_gases(input_turf_mixture, machine_gasmix, work_amount_to_remove = 0, intake_size = intake_regulator) - input_turf.update_visuals() input_turf.air_update_turf(TRUE) + input_turf.update_visuals() compressor_pressure = PRESSURE_MAX(machine_gasmix.return_pressure()) return input_turf_mixture.temperature -/obj/machinery/power/turbine/inlet_compressor/constructed - mapped = FALSE - /obj/machinery/power/turbine/turbine_outlet name = "turbine outlet" desc = "The output side of a turbine generator, contains the turbine and the stator." icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "turbine_outlet" - circuit = /obj/item/circuitboard/machine/turbine_stator - - gas_theoretical_volume = 6000 - part_path = /obj/item/turbine_parts/stator - - has_gasmix = TRUE - active_overlay = "outlet_animation" off_overlay = "outlet_off" open_overlay = "outlet_open" @@ -298,6 +330,10 @@ /// The turf to puch the gases out into var/turf/open/output_turf +/obj/machinery/power/turbine/turbine_outlet/Initialize(mapload) + //Volume of gas mixture is 6000 + return ..(mapload, gas_theoretical_volume = 6000) + /obj/machinery/power/turbine/turbine_outlet/deactivate_parts(mob/user) . = ..() if(!QDELETED(rotor)) @@ -316,77 +352,56 @@ //eject gases and update turf is any was ejected var/datum/gas_mixture/ejected_gases = machine_gasmix.pump_gas_to(output_turf.air, machine_gasmix.return_pressure()) if(ejected_gases) - output_turf.update_visuals() output_turf.air_update_turf(TRUE) + output_turf.update_visuals() //return ejected gases return ejected_gases -/obj/machinery/power/turbine/turbine_outlet/constructed - mapped = FALSE - /obj/machinery/power/turbine/core_rotor name = "core rotor" desc = "The middle part of a turbine generator, contains the rotor and the main computer." icon = 'icons/obj/machines/engine/turbine.dmi' icon_state = "core_rotor" - can_change_cable_layer = TRUE - - circuit = /obj/item/circuitboard/machine/turbine_rotor - - gas_theoretical_volume = 3000 - - part_path = /obj/item/turbine_parts/rotor - - has_gasmix = TRUE - active_overlay = "core_light" open_overlay = "core_open" - + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION emissive = TRUE + can_change_cable_layer = TRUE + circuit = /obj/item/circuitboard/machine/turbine_rotor + part_path = /obj/item/turbine_parts/rotor ///ID to easily connect the main part of the turbine to the computer var/mapping_id - ///Reference to the compressor var/obj/machinery/power/turbine/inlet_compressor/compressor ///Reference to the turbine var/obj/machinery/power/turbine/turbine_outlet/turbine - ///Rotation per minute the machine is doing var/rpm ///Amount of power the machine is producing var/produced_energy - ///Check to see if all parts are connected to the core var/all_parts_connected = FALSE - ///Max rmp that the installed parts can handle, limits the rpms var/max_allowed_rpm = 0 ///Max temperature that the installed parts can handle, unlimited and causes damage to the machine var/max_allowed_temperature = 0 - ///Amount of damage the machine has received var/damage = 0 ///Used to calculate the max damage received per tick and if the alarm should be called var/damage_archived = 0 - ///Our internal radio var/obj/item/radio/radio - ///The key our internal radio uses - var/radio_key = /obj/item/encryptionkey/headset_eng - ///The engineering channel - var/engineering_channel = "Engineering" COOLDOWN_DECLARE(turbine_damage_alert) -/obj/machinery/power/turbine/core_rotor/constructed - mapped = FALSE - /obj/machinery/power/turbine/core_rotor/Initialize(mapload) - . = ..() + //Volume of gas mixture is 3000 + . = ..(mapload, gas_theoretical_volume = 3000) + radio = new(src) - radio.keyslot = new radio_key + radio.keyslot = new /obj/item/encryptionkey/headset_eng radio.set_listening(FALSE) radio.recalculateChannels() @@ -396,6 +411,18 @@ QDEL_NULL(radio) return ..() +/obj/machinery/power/turbine/core_rotor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(. == NONE) + return + + if(held_item.tool_behaviour == TOOL_MULTITOOL) + if(panel_open) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Change cable layer" + else + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Link/Log parts" + return CONTEXTUAL_SCREENTIP_SET + /obj/machinery/power/turbine/core_rotor/examine(mob/user) . = ..() if(!panel_open) @@ -524,9 +551,7 @@ deactivate_parts() return ..() -/** - * Toggle power on and off, not safe - */ +/// Toggle power on and off, not safe /obj/machinery/power/turbine/core_rotor/proc/toggle_power() if(active) power_off() @@ -546,9 +571,7 @@ call_parts_update_appearance() SSair.start_processing_machine(src) -/** - * Calls all parts update appearance proc. - */ +/// Calls all parts update appearance proc. /obj/machinery/power/turbine/core_rotor/proc/call_parts_update_appearance() update_appearance() if(!QDELETED(compressor)) @@ -571,9 +594,7 @@ call_parts_update_appearance() SSair.stop_processing_machine(src) -/** - * Returns true if all parts have their panel closed - */ +/// Returns true if all parts have their panel closed /obj/machinery/power/turbine/core_rotor/proc/all_parts_ready() if(QDELETED(compressor)) return FALSE @@ -581,19 +602,20 @@ return FALSE return !panel_open && !compressor.panel_open && !turbine.panel_open -/** - * Getter for turbine integrity, return the amount in % - */ +/// Getter for turbine integrity, return the amount in % /obj/machinery/power/turbine/core_rotor/proc/get_turbine_integrity() var/integrity = damage / 500 integrity = max(round(100 - integrity * 100, 0.01), 0) return integrity /obj/machinery/power/turbine/core_rotor/process_atmos() - if(!active || !activate_parts(check_only = TRUE)) + if(!active || !activate_parts(check_only = TRUE) || (machine_stat & BROKEN) || !powered(ignore_use_power = TRUE)) power_off() return PROCESS_KILL + //use power to operate internal electronics & stuff + update_mode_power_usage(ACTIVE_POWER_USE, active_power_usage) + //===============COMPRESSOR WORKING========// //Transfer gases from turf to compressor var/temperature = compressor.compress_gases() @@ -624,7 +646,8 @@ if(rpm < 550000) explosion(src, 2, 5, 7) return PROCESS_KILL - radio.talk_into(src, "Warning, turbine at [get_area_name(src)] taking damage, current integrity at [integrity]%!", engineering_channel) + + radio.talk_into(src, "Warning, turbine at [get_area_name(src)] taking damage, current integrity at [integrity]%!", RADIO_CHANNEL_ENGINEERING) playsound(src, 'sound/machines/engine_alert1.ogg', 100, FALSE, 30, 30, falloff_distance = 10) //================ROTOR WORKING============// @@ -646,7 +669,7 @@ //calculate final acheived rpm rpm = ((work_done * compressor.get_efficiency()) ** turbine.get_efficiency()) * get_efficiency() / TURBINE_RPM_CONVERSION rpm = FLOOR(min(rpm, max_allowed_rpm), 1) - //add energy into the grid + //add energy into the grid, also use part of it for turbine operation produced_energy = rpm * TURBINE_ENERGY_RECTIFICATION_MULTIPLIER * TURBINE_RPM_CONVERSION add_avail(produced_energy) diff --git a/code/modules/power/turbine/turbine_computer.dm b/code/modules/power/turbine/turbine_computer.dm index 8e8ba8deb4c..9e0f5bdaa46 100644 --- a/code/modules/power/turbine/turbine_computer.dm +++ b/code/modules/power/turbine/turbine_computer.dm @@ -54,20 +54,20 @@ var/list/data = list() var/obj/machinery/power/turbine/core_rotor/main_control = turbine_core?.resolve() - - data["connected"] = main_control ? TRUE : FALSE + data["connected"] = !!QDELETED(main_control) if(!main_control) return + data["active"] = main_control.active data["rpm"] = main_control.rpm ? main_control.rpm : 0 data["power"] = main_control.produced_energy ? main_control.produced_energy : 0 - data["temp"] = main_control.compressor.input_turf?.air.temperature data["integrity"] = main_control.get_turbine_integrity() data["parts_linked"] = main_control.all_parts_connected data["parts_ready"] = main_control.all_parts_ready() data["max_rpm"] = main_control.max_allowed_rpm data["max_temperature"] = main_control.max_allowed_temperature + data["temp"] = main_control.compressor?.input_turf?.air.temperature || 0 data["regulator"] = QDELETED(main_control.compressor) ? 0 : main_control.compressor.intake_regulator return data diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm index 2c8ae376a3c..5251f5e8435 100644 --- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm +++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm @@ -3,10 +3,10 @@ spawnableTurfs = list(/turf/open/misc/asteroid/basalt/lava_land_surface = 100) /datum/map_generator_module/bottom_layer/lavaland_mineral - spawnableTurfs = list(/turf/closed/mineral/random/volcanic = 100) + spawnableTurfs = list(/turf/closed/mineral/volcanic = 100) /datum/map_generator_module/bottom_layer/lavaland_mineral/dense - spawnableTurfs = list(/turf/closed/mineral/random/high_chance/volcanic = 100) + spawnableTurfs = list(/turf/closed/mineral/volcanic = 100) /datum/map_generator_module/splatter_layer/lavaland_monsters spawnableTurfs = list() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 12faf4b8f72..609585b24da 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -574,6 +574,9 @@ knife_overlay.pixel_y = knife_y_offset . += knife_overlay +/obj/item/gun/animate_atom_living(mob/living/owner) + new /mob/living/simple_animal/hostile/mimic/copy/ranged(drop_location(), src, owner) + /obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) if(!ishuman(user) || !ishuman(target)) return diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index d7e2d16a9b0..b5525bb8703 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -433,10 +433,9 @@ return TRUE /obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(magazine && chambered.loaded_projectile && can_misfire && misfire_probability > 0) - if(prob(misfire_probability)) - if(blow_up(user)) - to_chat(user, span_userdanger("[src] misfires!")) + if(target != user && chambered.loaded_projectile && can_misfire && prob(misfire_probability) && blow_up(user)) + to_chat(user, span_userdanger("[src] misfires!")) + return if (sawn_off) bonus_spread += SAWN_OFF_ACC_PENALTY @@ -704,11 +703,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( ///used for sawing guns, causes the gun to fire without the input of the user /obj/item/gun/ballistic/proc/blow_up(mob/user) - . = FALSE - for(var/obj/item/ammo_casing/AC in magazine.stored_ammo) - if(AC.loaded_projectile) - process_fire(user, user, FALSE) - . = TRUE + return chambered && process_fire(user, user, FALSE) /obj/item/gun/ballistic/proc/instant_reload() SIGNAL_HANDLER diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index a7a1206db1f..966dd2caf32 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -274,6 +274,7 @@ alternative_fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' can_modify_ammo = TRUE can_bayonet = TRUE + knife_x_offset = 25 knife_y_offset = 11 can_be_sawn_off = FALSE projectile_damage_multiplier = 0.75 diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 374cdd16f80..e3ed515a708 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -153,7 +153,7 @@ icon_state = "kineticgun" // SKYRAT EDIT CHANGE holds_charge = TRUE unique_frequency = TRUE - max_mod_capacity = 80 + max_mod_capacity = 100 // SKYRAT EDIT CHANGE FROM 90 - Balance due to fauna changes and no level perks applying /obj/item/gun/energy/recharge/kinetic_accelerator/minebot trigger_guard = TRIGGER_GUARD_ALLOW_ALL @@ -166,7 +166,7 @@ projectile_type = /obj/projectile/kinetic select_name = "kinetic" e_cost = LASER_SHOTS(1, STANDARD_CELL_CHARGE * 0.5) - fire_sound = 'sound/weapons/kenetic_accel.ogg' // fine spelling there chap + fire_sound = 'sound/weapons/kinetic_accel.ogg' /obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") ..() diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index eed27478755..26fbdef6e13 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -12,7 +12,7 @@ /// How much time we need to recharge var/recharge_time = 1.6 SECONDS /// Sound we use when recharged - var/recharge_sound = 'sound/weapons/kenetic_reload.ogg' + var/recharge_sound = 'sound/weapons/kinetic_reload.ogg' /// An ID for our recharging timer. var/recharge_timerid /// Do we recharge slower with more of our type? diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 5d2bcd9f4d2..625b4d4df99 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -810,9 +810,7 @@ set_angle(get_angle(src, target)) original_angle = Angle if(!nondirectional_sprite) - var/matrix/matrix = new - matrix.Turn(Angle) - transform = matrix + transform = transform.Turn(Angle) trajectory_ignore_forcemove = TRUE forceMove(starting) trajectory_ignore_forcemove = FALSE @@ -829,11 +827,9 @@ pixel_move(pixel_speed_multiplier, FALSE) //move it now! /obj/projectile/proc/set_angle(new_angle) //wrapper for overrides. - Angle = new_angle if(!nondirectional_sprite) - var/matrix/matrix = new - matrix.Turn(Angle) - transform = matrix + transform = transform.TurnTo(Angle, new_angle) + Angle = new_angle if(trajectory) trajectory.set_angle(new_angle) if(fired && hitscan && isloc(loc) && (loc != last_angle_set_hitscan_store)) @@ -845,11 +841,9 @@ /// Same as set_angle, but the reflection continues from the center of the object that reflects it instead of the side /obj/projectile/proc/set_angle_centered(new_angle) - Angle = new_angle if(!nondirectional_sprite) - var/matrix/matrix = new - matrix.Turn(Angle) - transform = matrix + transform = transform.TurnTo(Angle, new_angle) + Angle = new_angle if(trajectory) trajectory.set_angle(new_angle) @@ -927,10 +921,6 @@ if(!loc || !trajectory) return last_projectile_move = world.time - if(!nondirectional_sprite && !hitscanning) - var/matrix/matrix = new - matrix.Turn(Angle) - transform = matrix if(homing) process_homing() var/forcemoved = FALSE diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index deb8440cd66..d3f13f4bdbe 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -179,7 +179,7 @@ if(pierce_hits <= 0) projectile_piercing = NONE pierce_hits -= 1 - ..() + return ..() /obj/projectile/beam/emitter name = "emitter beam" diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 45a1b8cb577..ae91fb6c603 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -173,41 +173,12 @@ /obj/projectile/magic/animate/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - target.animate_atom_living(firer) + if(!is_type_in_typecache(target, GLOB.animatable_blacklist)) + target.animate_atom_living(firer) -/atom/proc/animate_atom_living(mob/living/owner = null) - if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.animatable_blacklist)) - if(istype(src, /obj/structure/statue/petrified)) - var/obj/structure/statue/petrified/P = src - if(P.petrified_mob) - var/mob/living/L = P.petrified_mob - var/mob/living/basic/statue/S = new(P.loc, owner) - S.name = "statue of [L.name]" - if(owner) - S.faction = list("[REF(owner)]") - S.icon = P.icon - S.icon_state = P.icon_state - S.copy_overlays(P, TRUE) - S.color = P.color - S.atom_colours = P.atom_colours.Copy() - if(L.mind) - L.mind.transfer_to(S) - if(owner) - to_chat(S, span_userdanger("You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.")) - P.forceMove(S) - return - else - var/obj/O = src - if(isgun(O)) - new /mob/living/simple_animal/hostile/mimic/copy/ranged(drop_location(), src, owner) - else - new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) - - else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy)) - // Change our allegiance! - var/mob/living/simple_animal/hostile/mimic/copy/C = src - if(owner) - C.ChangeOwner(owner) +///proc to animate the target into a living creature +/atom/proc/animate_atom_living(mob/living/owner) + return /obj/projectile/magic/spellblade name = "blade energy" diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index ffa8e0c32d4..d2a037f91d1 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -84,6 +84,8 @@ * Don't call this unless you know what you're doing, this is an internal proc */ /datum/equilibrium/proc/check_inital_conditions() + PRIVATE_PROC(TRUE) + if(QDELETED(holder)) stack_trace("an equilibrium is missing it's holder.") return FALSE @@ -95,7 +97,7 @@ return FALSE //Make sure we have the right multipler for on_reaction() - for(var/single_reagent in reaction.required_reagents) + for(var/datum/reagent/single_reagent as anything in reaction.required_reagents) multiplier = min(multiplier, holder.get_reagent_amount(single_reagent) / reaction.required_reagents[single_reagent]) multiplier = round(multiplier, CHEMICAL_QUANTISATION_LEVEL) if(!multiplier) //we have no more or very little reagents left @@ -108,7 +110,7 @@ //All checks pass. cache the product ratio if(length(reaction.results)) product_ratio = 0 - for(var/product in reaction.results) + for(var/datum/reagent/product as anything in reaction.results) product_ratio += reaction.results[product] else product_ratio = 1 @@ -123,6 +125,8 @@ * otherwise, generally, don't call this directed except internally */ /datum/equilibrium/proc/check_reagent_properties() + PRIVATE_PROC(TRUE) + //Have we exploded from on_reaction or did we run out of reagents? if(QDELETED(holder.my_atom) || !holder.reagent_list.len) return FALSE @@ -150,8 +154,10 @@ * Generally an internal proc */ /datum/equilibrium/proc/calculate_yield() + PRIVATE_PROC(TRUE) + multiplier = INFINITY - for(var/reagent in reaction.required_reagents) + for(var/datum/reagent/reagent as anything in reaction.required_reagents) multiplier = min(multiplier, holder.get_reagent_amount(reagent) / reaction.required_reagents[reagent]) multiplier = round(multiplier, CHEMICAL_QUANTISATION_LEVEL) if(!multiplier) //we have no more or very little reagents left @@ -160,14 +166,14 @@ //Incase of no reagent product if(!length(reaction.results)) step_target_vol = INFINITY - for(var/reagent in reaction.required_reagents) + for(var/datum/reagent/reagent as anything in reaction.required_reagents) step_target_vol = min(step_target_vol, multiplier * reaction.required_reagents[reagent]) return TRUE //If we have reagent products step_target_vol = 0 reacted_vol = 0 //Because volumes can be lost mid reactions - for(var/product in reaction.results) + for(var/datum/reagent/product as anything in reaction.results) step_target_vol += multiplier * reaction.results[product] reacted_vol += holder.get_reagent_amount(product) target_vol = reacted_vol + step_target_vol @@ -181,6 +187,8 @@ * step_volume_added is how much product (across all products) was added for this single step */ /datum/equilibrium/proc/check_fail_states(step_volume_added) + PRIVATE_PROC(TRUE) + //Are we overheated? if(reaction.is_cold_recipe) if(holder.chem_temp < reaction.overheat_temp && reaction.overheat_temp != NO_OVERHEAT) //This is before the process - this is here so that overly_impure and overheated() share the same code location (and therefore vars) for calls. @@ -192,7 +200,7 @@ reaction.overheated(holder, src, step_volume_added) //is our product too impure? - for(var/product in reaction.results) + for(var/datum/reagent/product as anything in reaction.results) var/datum/reagent/reagent = holder.has_reagent(product) if(!reagent) //might be missing from overheat exploding continue @@ -212,6 +220,8 @@ * * seconds_per_tick - the time between the last proc in world.time */ /datum/equilibrium/proc/deal_with_time(seconds_per_tick) + PRIVATE_PROC(TRUE) + if(seconds_per_tick > 1) time_deficit += seconds_per_tick - 1 seconds_per_tick = 1 //Lets make sure reactions aren't super speedy and blow people up from a big lag spike @@ -306,7 +316,7 @@ purity = delta_ph //Then adjust purity of result with beaker reagent purity. - purity *= reactant_purity(reaction) + purity *= average_purity() //Then adjust it from the input modifier purity *= purity_modifier @@ -317,20 +327,20 @@ if(delta_chem_factor > step_target_vol) delta_chem_factor = step_target_vol //Normalise to multiproducts - delta_chem_factor = round(delta_chem_factor / product_ratio, CHEMICAL_QUANTISATION_LEVEL) + delta_chem_factor = round(delta_chem_factor / product_ratio, CHEMICAL_VOLUME_ROUNDING) if(delta_chem_factor <= 0) to_delete = TRUE return //Calculate how much product to make and how much reactant to remove factors.. var/required_amount + var/pH_adjust for(var/datum/reagent/requirement as anything in reaction.required_reagents) required_amount = reaction.required_reagents[requirement] if(!holder.remove_reagent(requirement, delta_chem_factor * required_amount)) to_delete = TRUE return //Apply pH changes - var/pH_adjust if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) pH_adjust = ((delta_chem_factor * required_amount) / target_vol) * (reaction.H_ion_release * h_ion_mod) else //Default adds pH independant of volume @@ -347,7 +357,6 @@ return //Apply pH changes - var/pH_adjust if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) pH_adjust = (step_add / target_vol) * (reaction.H_ion_release * h_ion_mod) else @@ -386,9 +395,9 @@ to_delete = TRUE return - //end reactions faster so plumbing is faster - //length is so that plumbing is faster - but it doesn't disable competitive reactions. Basically, competitive reactions will likely reach their step target at the start, so this will disable that. We want to avoid that. But equally, we do want to full stop a holder from reacting asap so plumbing isn't waiting an tick to resolve. - if((step_add >= step_target_vol) && (length(holder.reaction_list) == 1)) + //If the volume of reagents created(total_step_added) >= volume of reagents still to be created(step_target_vol) then end + //i.e. we have created all the reagents needed for this reaction + if(total_step_added >= step_target_vol) to_delete = TRUE /* @@ -396,12 +405,14 @@ * Currently calculates it irrespective of required reagents at the start, but this should be changed if this is powergamed to required reagents * It's not currently because overly_impure affects all reagents */ -/datum/equilibrium/proc/reactant_purity(datum/chemical_reaction/C) +/datum/equilibrium/proc/average_purity() + PRIVATE_PROC(TRUE) + var/list/cached_reagents = holder.reagent_list var/num_of_reagents = cached_reagents.len if(!num_of_reagents)//I've never seen it get here with 0, but in case - it gets here when it blows up from overheat - stack_trace("No reactants found mid reaction for [C.type]. Beaker: [holder.my_atom]") + stack_trace("No reactants found mid reaction for [reaction.type]. Beaker: [holder.my_atom]") return 0 //we exploded and cleared reagents - but lets not kill the process var/cached_purity diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index 5872f5db1ae..a4e149a2bc8 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -532,9 +532,14 @@ remove_reagent(reagent.type, transfer_amount) transfer_log[reagent.type] = list(REAGENT_TRANSFER_AMOUNT = transfer_amount, REAGENT_PURITY = reagent.purity) + //combat log if(transferred_by && target_atom) - target_atom.add_hiddenprint(transferred_by) //log prints so admins can figure out who touched it last. - log_combat(transferred_by, target_atom, "transferred reagents ([get_external_reagent_log_string(transfer_log)]) from [my_atom] to") + var/atom/log_target = target_atom + if(isorgan(target_atom)) + var/obj/item/organ/organ_item = target_atom + log_target = organ_item.owner ? organ_item.owner : organ_item + log_target.add_hiddenprint(transferred_by) //log prints so admins can figure out who touched it last. + log_combat(transferred_by, log_target, "transferred reagents to", my_atom, "which had [get_external_reagent_log_string(transfer_log)]") update_total() target_holder.update_total() @@ -642,7 +647,7 @@ reagent_volume = round(reagent.volume, CHEMICAL_QUANTISATION_LEVEL) //round to this many decimal places //remove very small amounts of reagents - if(!reagent_volume || (reagent_volume <= 0.05 && !is_reacting)) + if(reagent_volume <= 0 || (!is_reacting && reagent_volume < CHEMICAL_VOLUME_ROUNDING)) //end metabolization if(isliving(my_atom)) if(reagent.metabolizing) diff --git a/code/modules/reagents/chemistry/holder/reactions.dm b/code/modules/reagents/chemistry/holder/reactions.dm index e1ac01dfa93..520a99687a8 100644 --- a/code/modules/reagents/chemistry/holder/reactions.dm +++ b/code/modules/reagents/chemistry/holder/reactions.dm @@ -63,8 +63,9 @@ if(cached_my_atom) if(reaction.required_container) - if(reaction.required_container_accepts_subtypes && !istype(cached_my_atom, reaction.required_container)) - continue + if(reaction.required_container_accepts_subtypes) + if(!istype(cached_my_atom, reaction.required_container)) + continue else if(cached_my_atom.type != reaction.required_container) continue diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 2c3dd704235..2e2bcf4e6d1 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -303,11 +303,11 @@ beaker_data["maxVolume"] = beaker.volume beaker_data["transferAmounts"] = beaker.possible_transfer_amounts beaker_data["pH"] = round(beaker.reagents.ph, 0.01) - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, 0.01) + beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) - beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) // list in a list because Byond merges the first list... + beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING))) // list in a list because Byond merges the first list... beaker_data["contents"] = beakerContents .["beaker"] = beaker_data @@ -781,7 +781,7 @@ /obj/machinery/chem_dispenser/mutagensaltpeter name = "botanical chemical dispenser" desc = "Creates and dispenses chemicals useful for botany." - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION circuit = /obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter /// The default list of dispensable reagents available in the mutagensaltpeter chem dispenser diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index a81b189f426..6c036d37bef 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -34,65 +34,6 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) - . = ..() - if(gone == beaker) - UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) - beaker = null - update_appearance() - -/obj/machinery/chem_heater/update_icon_state() - icon_state = "[base_icon_state][beaker ? 1 : 0]b" - return ..() - -/obj/machinery/chem_heater/attack_hand_secondary(mob/user, list/modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - if(!user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) - return - replace_beaker(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/machinery/chem_heater/attack_robot_secondary(mob/user, list/modifiers) - return attack_hand_secondary(user, modifiers) - -/obj/machinery/chem_heater/attack_ai_secondary(mob/user, list/modifiers) - return attack_hand_secondary(user, modifiers) - -/** - * Replace or eject the beaker inside this machine - * Arguments - * * mob/living/user - the player operating this machine - * * obj/item/reagent_containers/new_beaker - the new beaker to replace the current one if not null else it will just eject - */ -/obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) - PRIVATE_PROC(TRUE) - - if(!QDELETED(beaker)) - try_put_in_hand(beaker, user) - - if(!QDELETED(new_beaker)) - if(!user.transferItemToLoc(new_beaker, src)) - update_appearance() - return FALSE - beaker = new_beaker - RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_heater, refresh_ui)) - - update_appearance() - - return TRUE - -/obj/machinery/chem_heater/RefreshParts() - . = ..() - heater_coefficient = 0.1 - for(var/datum/stock_part/micro_laser/micro_laser in component_parts) - heater_coefficient *= micro_laser.tier - -/obj/machinery/chem_heater/proc/refresh_ui() - SIGNAL_HANDLER - - SStgui.update_uis(src) /obj/machinery/chem_heater/add_context(atom/source, list/context, obj/item/held_item, mob/user) if(isnull(held_item) || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) @@ -118,6 +59,89 @@ return NONE + +/obj/machinery/chem_heater/update_icon_state() + icon_state = "[base_icon_state][beaker ? 1 : 0]b" + return ..() + +/obj/machinery/chem_heater/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) + return + replace_beaker(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) + UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) + beaker = null + update_appearance() + +/obj/machinery/chem_heater/attack_robot_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) + +/obj/machinery/chem_heater/attack_ai_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) + +/** + * Replace or eject the beaker inside this machine + * Arguments + * * mob/living/user - the player operating this machine + * * obj/item/reagent_containers/new_beaker - the new beaker to replace the current one if not null else it will just eject + */ +/obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + PRIVATE_PROC(TRUE) + + if(!QDELETED(beaker)) + try_put_in_hand(beaker, user) + + if(!QDELETED(new_beaker)) + if(!user.transferItemToLoc(new_beaker, src)) + update_appearance() + return FALSE + beaker = new_beaker + RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_heater, on_reaction_step)) + + update_appearance() + + return TRUE + +/obj/machinery/chem_heater/RefreshParts() + . = ..() + heater_coefficient = 0.1 + for(var/datum/stock_part/micro_laser/micro_laser in component_parts) + heater_coefficient *= micro_laser.tier + +/** + * Heats the reagents of the currently inserted beaker only if machine is on & beaker has some reagents inside + * Arguments + * * seconds_per_tick - passed from process() or from reaction_step() + */ +/obj/machinery/chem_heater/proc/heat_reagents(seconds_per_tick) + PRIVATE_PROC(TRUE) + + //must be on and beaker must have something inside to heat + if(!on || (machine_stat & NOPOWER) || QDELETED(beaker) || !beaker.reagents.total_volume) + return FALSE + + //heat the beaker and use some power. we want to use only a small amount of power since this proc gets called frequently + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) + use_power(active_power_usage * seconds_per_tick * 0.3) + return TRUE + +/obj/machinery/chem_heater/proc/on_reaction_step(datum/reagents/holder, num_reactions, seconds_per_tick) + SIGNAL_HANDLER + + //adjust temp + heat_reagents(seconds_per_tick) + + //send updates to ui. faster than SStgui.update_uis + for(var/datum/tgui/ui in src.open_uis) + ui.send_update() + /obj/machinery/chem_heater/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) @@ -136,23 +160,17 @@ . += span_notice("Its panel can be [EXAMINE_HINT("pried")] open") /obj/machinery/chem_heater/process(seconds_per_tick) - if(!on || (machine_stat & NOPOWER) || QDELETED(beaker)) + //is_reacting is handled in reaction_step() + if(QDELETED(beaker) || beaker.reagents.is_reacting) return - if(beaker.reagents.total_volume) - var/randomness = 1 - if(beaker.reagents.is_reacting) //Give it a little wiggle room since we're actively reacting - randomness = rand(8, 11) * 0.1 - - //keep constant with the chemical acclimator please - beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume * randomness) + if(heat_reagents(seconds_per_tick)) + //create new reactions after temperature adjust beaker.reagents.handle_reactions() - //use power - use_power(active_power_usage * seconds_per_tick) - - //show changes to ui immediatly for responsivenes - SStgui.update_uis(src) + //send updates to ui. faster than SStgui.update_uis + for(var/datum/tgui/ui in src.open_uis) + ui.send_update() /obj/machinery/chem_heater/wrench_act(mob/living/user, obj/item/tool) . = ITEM_INTERACT_BLOCKING @@ -204,13 +222,12 @@ if(!QDELETED(beaker)) beaker_data = list() beaker_data["maxVolume"] = beaker.volume - beaker_data["transferAmounts"] = beaker.possible_transfer_amounts beaker_data["pH"] = round(beaker.reagents.ph, 0.01) - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, 0.01) + beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) - beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) // list in a list because Byond merges the first list... + beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING))) // list in a list because Byond merges the first list... beaker_data["contents"] = beakerContents chem_temp = beaker.reagents.chem_temp .["beaker"] = beaker_data @@ -218,15 +235,13 @@ var/list/active_reactions = list() var/flashing = DISABLE_FLASHING //for use with alertAfter - since there is no alertBefore, I set the after to 0 if true, or to the max value if false - for(var/_reaction in beaker?.reagents.reaction_list) - var/datum/equilibrium/equilibrium = _reaction + for(var/datum/equilibrium/equilibrium as anything in beaker?.reagents.reaction_list) if(!equilibrium.reaction.results)//Incase of no result reactions continue - var/_reagent = equilibrium.reaction.results[1] - var/datum/reagent/reagent = beaker?.reagents.has_reagent(_reagent) //Reactions are named after their primary products + var/datum/reagents/beaker_reagents = beaker.reagents + var/datum/reagent/reagent = beaker_reagents.has_reagent(equilibrium.reaction.results[1]) //Reactions are named after their primary products if(!reagent) continue - var/datum/reagents/beaker_reagents = beaker.reagents //check for danger levels primirarly overheating var/overheat = FALSE @@ -288,7 +303,7 @@ if("temperature") var/target = params["target"] - if(!target) + if(isnull(target)) return FALSE target = text2num(target) @@ -350,12 +365,11 @@ //trying to absorb buffer from currently inserted beaker if(volume < 0) - var/datum/reagent/buffer_reagent = reagents.has_reagent(buffer_type) - if(!buffer_reagent) + if(!beaker.reagents.has_reagent(buffer_type)) var/name = initial(buffer_type.name) say("Unable to find [name] in beaker to draw from! Please insert a beaker containing [name].") return FALSE - beaker.reagents.trans_to(src, (reagents.maximum_volume / 2) - buffer_reagent.volume, target_id = buffer_type) + beaker.reagents.trans_to(src, (reagents.maximum_volume / 2) - reagents.get_reagent_amount(buffer_type), target_id = buffer_type) return TRUE //trying to inject buffer into currently inserted beaker diff --git a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm index b5f2d31dfa5..9d81188fb40 100644 --- a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm +++ b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm @@ -2,394 +2,240 @@ * A debug chem tester that will process through all recipies automatically and try to react them. * Highlights low purity reactions and and reactions that don't happen */ + +///don't alter the temperatrue of the reaction +#define USE_REACTION_TEMPERATURE 0 +///force a user specified value for temperature on the reaction +#define USE_USER_TEMPERATURE 1 +///force the minimum required temperature for the reaction to start on the reaction +#define USE_MINIMUM_TEMPERATURE 2 +///force the optimal temperature for the reaction +#define USE_OPTIMAL_TEMPERATURE 3 +///force the overheat temperature for the reaction. At this point reagents start to decrease +#define USE_OVERHEAT_TEMPERATURE 4 + +///Play the next reaction i.e. increment current_reaction_index +#define PLAY_NEXT_REACTION 0 +///Play the previous reaction i.e. decrement current_reaction_index +#define PLAY_PREVIOUS_REACTION 1 +///Pick a reaction at random i.e. user decides via input list what the value of current_reaction_index should be +#define PLAY_USER_REACTION 2 + +///Maximum volume of reagents this machine & its required container can hold +#define MAXIMUM_HOLDER_VOLUME 9000 + /obj/machinery/chem_recipe_debug name = "chemical reaction tester" - density = TRUE icon = 'icons/obj/medical/chemical.dmi' icon_state = "HPLC_debug" + density = TRUE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.4 resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE - ///List of every reaction in the game kept locally for easy access - var/list/cached_reactions = list() - ///What index in the cached_reactions we're in - var/index = 1 - ///If the machine is currently processing through the list - var/processing = FALSE - ///Final output that highlights all of the reactions with inoptimal purity/voolume at base - var/problem_string - ///Final output that highlights all of the reactions with inoptimal purity/voolume at base - var/impure_string - ///The count of reactions that resolve between 1 - 0.9 purity - var/minorImpurity - ///The count of reactions that resolve below 0.9 purity - var/majorImpurity - ///If we failed to react this current chem so use a lower temp - all reactions only - var/failed = 0 - ///If we're forcing optimal conditions - var/should_force_temp = FALSE - var/should_force_ph = FALSE - ///Forced values - var/force_temp = 300 - var/force_ph = 7 - ///Multiplier of product - var/vol_multiplier = 20 - ///If we're reacting - var/react = FALSE - ///Number of delta times taken to react - var/react_time = 0 - ///IF we're doing EVERY reaction - var/process_all = FALSE - ///The name - var/list/reaction_names = list() - ///If it's started - var/reaction_stated = FALSE - ///If we spawn a beaker at the end of a reaction or not - var/beaker_spawn = FALSE - ///If we force min temp on reaction setup - var/min_temp = FALSE - ///The recipe we're editing - var/datum/chemical_reaction/edit_recipe -///Create reagents datum + ///Temperature to be imposed on the reaction + var/forced_temp = DEFAULT_REAGENT_TEMPERATURE + ///The mode for setting reaction temps. see temp defines + var/temp_mode = USE_REACTION_TEMPERATURE + ///The ph to be imposed on the reaction + var/forced_ph = CHEMICAL_NORMAL_PH + ///if TRUE will use forced_ph else don't alter the ph of the reaction + var/use_forced_ph = FALSE + ///The purity of all reagents to be imposed on the reaction + var/forced_purity = 1.0 + ///If TRUE will use forced_purity else don't alter the purity of the reaction + var/use_forced_purity = FALSE + ///The multiplier to be applied on the selected reaction required reagents to start the reaction + var/volume_multiplier = 1 + + ///Cached copy all reactions mapped with their name + var/static/list/all_reaction_list + ///The list of reactions to test + var/list/datum/chemical_reaction/reactions_to_test = list() + ///The index in reactions_to_test list which points to the current reaction under test + var/current_reaction_index = 0 + ///Decides which reaction to play in the reactions_to_test list see Play defines + var/current_reaction_mode = PLAY_NEXT_REACTION + ///The current reaction we are editing + var/datum/chemical_reaction/edit_reaction + ///The current var of the reaction we are editing + var/edit_var = "Required Temp" + + ///The target reagents to we are working with. can vary if an reaction requires a specific container + var/datum/reagents/target_reagents + ///The beaker inside this machine, if null will create a new one + var/obj/item/reagent_containers/cup/beaker/bluespace/beaker + ///The default reagent container required for the selected test reaction if any + var/obj/item/reagent_containers/required_container + /obj/machinery/chem_recipe_debug/Initialize(mapload) . = ..() - create_reagents(9000)//I want to make sure everything fits - end_processing() -///Enable the machine -/obj/machinery/chem_recipe_debug/attackby(obj/item/I, mob/user, params) + create_reagents(MAXIMUM_HOLDER_VOLUME) + target_reagents = reagents + RegisterSignal(reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_recipe_debug, on_reaction_step)) + register_context() + + if(isnull(all_reaction_list)) + all_reaction_list = list() + for(var/datum/reagent/reagent as anything in GLOB.chemical_reactions_list_reactant_index) + for(var/datum/chemical_reaction/reaction as anything in GLOB.chemical_reactions_list_reactant_index[reagent]) + all_reaction_list[extract_reaction_name(reaction)] = reaction + +/obj/machinery/chem_recipe_debug/Destroy() + reactions_to_test.Cut() + target_reagents = null + edit_reaction = null + QDEL_NULL(beaker) + QDEL_NULL(required_container) + UnregisterSignal(reagents, COMSIG_REAGENTS_REACTION_STEP) . = ..() - ui_interact(usr) -///Enable the machine -/obj/machinery/chem_recipe_debug/AltClick(mob/living/user) +/obj/machinery/chem_recipe_debug/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - if(processing) - say("currently processing reaction [index]: [cached_reactions[index]] of [cached_reactions.len]") - return - process_all = TRUE - say("Starting processing") - setup_reactions() - begin_processing() + if(isnull(held_item) || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) + return NONE -///Resets the index, and creates the cached_reaction list from all possible reactions -/obj/machinery/chem_recipe_debug/proc/setup_reactions() - cached_reactions = list() - if(process_all) - for(var/reaction in GLOB.chemical_reactions_list_reactant_index) - if(is_type_in_list(GLOB.chemical_reactions_list_reactant_index[reaction], cached_reactions)) - continue - cached_reactions += GLOB.chemical_reactions_list_reactant_index[reaction] + if(!QDELETED(beaker)) + if(is_reagent_container(held_item) && held_item.is_open_container()) + context[SCREENTIP_CONTEXT_LMB] = "Replace beaker" + return CONTEXTUAL_SCREENTIP_SET + else if(is_reagent_container(held_item) && held_item.is_open_container()) + context[SCREENTIP_CONTEXT_LMB] = "Insert beaker" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/chem_recipe_debug/examine(mob/user) + . = ..() + if(!QDELETED(beaker)) + . += span_notice("A beaker of [beaker.reagents.maximum_volume]u capacity is inside.") else - cached_reactions = reaction_names - reagents.clear_reagents() - index = 1 - processing = TRUE + . += span_notice("No beaker is present. A new will be created when ejecting.") + +/obj/machinery/chem_recipe_debug/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) + beaker = null + +/obj/machinery/chem_recipe_debug/attackby(obj/item/held_item, mob/user, params) + if((held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) + return ..() + + if(is_reagent_container(held_item) && held_item.is_open_container()) + . = TRUE + if(!QDELETED(beaker)) + try_put_in_hand(beaker, user) + if(!user.transferItemToLoc(held_item, src)) + return + beaker = held_item + +/** + * Extracts a human readable name for this chemical reaction + * Arguments + * + * * datum/chemical_reaction/reaction - the reaction who's name we have to decode + */ +/obj/machinery/chem_recipe_debug/proc/extract_reaction_name(datum/chemical_reaction/reaction) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + var/reaction_name = "[reaction]" + reaction_name = copytext(reaction_name, findlasttext(reaction_name, "/") + 1) + reaction_name = replacetext(reaction_name, "_", " ") + return full_capitalize(reaction_name) + +///Retrives the target temperature to be imposed on the test reaction based on temp_mode +/obj/machinery/chem_recipe_debug/proc/decode_target_temperature() + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + if(temp_mode == USE_REACTION_TEMPERATURE) + return null //simply means don't alter the reaction temperature + else if(temp_mode == USE_USER_TEMPERATURE) + return forced_temp + else + var/datum/chemical_reaction/test_reaction = reactions_to_test[current_reaction_index || 1] + switch(temp_mode) + if(USE_MINIMUM_TEMPERATURE) + return test_reaction.required_temp + (test_reaction.is_cold_recipe ? - 20 : 20) //20k is good enough offset to account for reaction rate rounding + if(USE_OPTIMAL_TEMPERATURE) + return test_reaction.optimal_temp + if(USE_OVERHEAT_TEMPERATURE) + return test_reaction.overheat_temp + + +/** + * Adjusts the temperature, ph & purity of the holder + * Arguments + * + * * seconds_per_tick - passed from on_reaction_step or process + */ +/obj/machinery/chem_recipe_debug/proc/adjust_environment(seconds_per_tick) + PRIVATE_PROC(TRUE) + + var/target_temperature = decode_target_temperature() + if(!isnull(target_temperature)) + target_reagents.adjust_thermal_energy((target_temperature - target_reagents.chem_temp) * 0.4 * seconds_per_tick * SPECIFIC_HEAT_DEFAULT * target_reagents.total_volume) + + if(use_forced_purity) + target_reagents.set_all_reagents_purity(forced_purity) + + if(use_forced_ph) + for(var/datum/reagent/reagent as anything in target_reagents.reagent_list) + reagent.ph = clamp(forced_ph, CHEMICAL_MIN_PH, CHEMICAL_MAX_PH) + + target_reagents.update_total() -/* -* The main loop that sets up, creates and displays results from a reaction -* warning: this code is a hot mess -*/ /obj/machinery/chem_recipe_debug/process(seconds_per_tick) - if(processing == FALSE) - setup_reactions() - if(should_force_ph) - reagents.ph = force_ph - if(should_force_temp) - reagents.chem_temp = force_temp - if(reagents.is_reacting == TRUE) - react_time += seconds_per_tick + if(!target_reagents.is_reacting) + adjust_environment(seconds_per_tick) + target_reagents.handle_reactions() + + //send updates to ui. faster than SStgui.update_uis + for(var/datum/tgui/ui in src.open_uis) + ui.send_update() + +/obj/machinery/chem_recipe_debug/proc/on_reaction_step(datum/reagents/holder, num_reactions, seconds_per_tick) + SIGNAL_HANDLER + + adjust_environment(seconds_per_tick) + + //send updates to ui. faster than SStgui.update_uis + for(var/datum/tgui/ui in src.open_uis) + ui.send_update() + +/** + * Decodes the ui reaction var into it's original name + * Arguments + * + * * variable - the name of the variable as seen in the UI + */ +/obj/machinery/chem_recipe_debug/proc/decode_var(variable) + PRIVATE_PROC(TRUE) + + . = null + + if(isnull(edit_reaction)) return - if(reaction_stated == TRUE) - reaction_stated = FALSE - relay_ended_reaction() - if(index > cached_reactions.len) - relay_all_reactions() - return - setup_reaction() - reaction_stated = TRUE -/obj/machinery/chem_recipe_debug/proc/relay_all_reactions() - say("Completed testing, missing reactions products (may have exploded) are:") - say("[problem_string]", sanitize=FALSE) - say("Problem with results are:") - say("[impure_string]", sanitize=FALSE) - say("Reactions with minor impurity: [minorImpurity], reactions with major impurity: [majorImpurity]") - processing = FALSE - problem_string = null - impure_string = null - minorImpurity = null - majorImpurity = null - end_processing() - -/obj/machinery/chem_recipe_debug/proc/relay_ended_reaction() - if(reagents.reagent_list) - var/cached_purity - say("Reaction completed for [cached_reactions[index]] final temperature = [reagents.chem_temp], ph = [reagents.ph], time taken = [react_time]s.") - var/datum/chemical_reaction/reaction = cached_reactions[index] - for(var/reagent_type in reaction.results) - var/datum/reagent/reagent = reagents.has_reagent(reagent_type) - if(!reagent) - say(span_warning("Unable to find product [reagent_type] in holder after reaction! reagents found are:")) - for(var/other_reagent in reagents.reagent_list) - say("[other_reagent]") - var/obj/item/reagent_containers/cup/beaker/bluespace/beaker = new /obj/item/reagent_containers/cup/beaker/bluespace(loc) - reagents.trans_to(beaker) - beaker.name = "[cached_reactions[index]] failed" - if(!failed) - problem_string += "[cached_reactions[index]] [span_warning("Unable to find product [reagent_type] in holder after reaction! Trying alternative setup. index:[index]")]\n" - failed++ - return - say("Reaction has a product [reagent_type] [reagent.volume]u purity of [reagent.purity]") - if(reagent.purity < 0.9) - impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [reagent.volume]u [span_boldwarning("purity of [reagent.purity]")] index:[index]\n" - majorImpurity++ - else if (reagent.purity < 1) - impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [reagent.volume]u [span_warning("purity of [reagent.purity]")] index:[index]\n" - minorImpurity++ - if(reagent.volume < reaction.results[reagent_type]) - impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [span_warning("[reagent.volume]u")] purity of [reagent.purity] index:[index]\n" - cached_purity = reagent.purity - if(beaker_spawn && reagents.total_volume) - var/obj/item/reagent_containers/cup/beaker/bluespace/beaker = new /obj/item/reagent_containers/cup/beaker/bluespace(loc) - reagents.trans_to(beaker) - beaker.name = "[cached_reactions[index]] purity: [cached_purity]" - reagents.clear_reagents() - reagents.chem_temp = 300 - index++ - failed = 0 - else - say("No reagents left in beaker!") - index++ - -/obj/machinery/chem_recipe_debug/proc/setup_reaction() - react_time = 0 - if(!length(cached_reactions)) - return FALSE - var/datum/chemical_reaction/reaction = cached_reactions[index] - if(!reaction) - say("Unable to find reaction on index: [index]") - say("Using forced temperatures.") - if(reaction.reaction_flags & REACTION_INSTANT) - say("This reaction is instant") - for(var/reagent_type in reaction.required_reagents) - reagents.add_reagent(reagent_type, reaction.required_reagents[reagent_type]*vol_multiplier) - for(var/catalyst_type in reaction.required_catalysts) - reagents.add_reagent(catalyst_type, reaction.required_catalysts[catalyst_type]) - if(should_force_temp && !min_temp) - say("Using forced temperatures.") - reagents.chem_temp = force_temp ? force_temp : reaction.optimal_temp - if(should_force_ph) - say("Using forced pH.") - reagents.ph = force_ph ? force_ph : (reaction.optimal_ph_max + reaction.optimal_ph_min)/2 - if(failed == 0 && !should_force_temp) - reagents.chem_temp = reaction.optimal_temp - if(failed == 1 && !should_force_temp) - reagents.chem_temp = reaction.required_temp+25 - failed++ - if(min_temp) - say("Overriding temperature to required temp.") - reagents.chem_temp = reaction.is_cold_recipe ? reaction.required_temp - 1 : reaction.required_temp + 1 - say("Reacting [span_nicegreen("[cached_reactions[index]]")] starting pH: [reagents.ph] index [index] of [cached_reactions.len]") - -/obj/machinery/chem_recipe_debug/ui_data(mob/user) - var/data = list() - data["targetTemp"] = force_temp - data["targatpH"] = force_ph - data["isActive"] = reagents.is_reacting - data["forcepH"] = should_force_ph - data["forceTemp"] = should_force_temp - data["targetVol"] = vol_multiplier - data["processAll"] = process_all - data["currentTemp"] = reagents.chem_temp - data["currentpH"] = round(reagents.ph, 0.01) - data["processing"] = processing - data["index"] = index - data["endIndex"] = cached_reactions.len - data["beakerSpawn"] = beaker_spawn - data["minTemp"] = min_temp - data["editRecipe"] = null - - var/list/beaker_contents = list() - for(var/datum/reagent/reagent as anything in reagents.reagent_list) - beaker_contents.len++ - beaker_contents[length(beaker_contents)] = list("name" = reagent.name, "volume" = round(reagent.volume, 0.01), "purity" = round(reagent.purity)) - data["chamberContents"] = beaker_contents - - var/list/queued_reactions = list() - for(var/datum/chemical_reaction/reaction as anything in reaction_names) - var/datum/reagent/reagent = find_reagent_object_from_type(reaction.results[1]) - queued_reactions.len++ - queued_reactions[length(queued_reactions)] = list("name" = reagent.name) - data["queuedReactions"] = queued_reactions - - var/list/active_reactions = list() - var/flashing = DISABLE_FLASHING //for use with alertAfter - since there is no alertBefore, I set the after to 0 if true, or to the max value if false - for(var/datum/equilibrium/equilibrium as anything in reagents.reaction_list) - if(!length(reagents.reaction_list))//I'm not sure why when it explodes it causes the gui to fail (it's missing danger (?) ) - stack_trace("Chem debug managed to find an equilibrium in a location where there should be none (skipping this entry and continuing). This is usually because of an ill timed explosion.") - continue - if(!equilibrium.reaction.results)//Incase of no result reactions - continue - var/datum/reagent/reagent = reagents.has_reagent(equilibrium.reaction.results[1]) //Reactions are named after their primary products - if(!reagent) - continue - var/overheat = FALSE - var/danger = FALSE - var/purity_alert = 2 //same as flashing - if(reagent.purity < equilibrium.reaction.purity_min) - purity_alert = ENABLE_FLASHING//Because 0 is seen as null - danger = TRUE - if(flashing != ENABLE_FLASHING)//So that the pH meter flashes for ANY reactions out of optimal - if(equilibrium.reaction.optimal_ph_min > reagents.ph || equilibrium.reaction.optimal_ph_max < reagents.ph) - flashing = ENABLE_FLASHING - if(equilibrium.reaction.is_cold_recipe) - if(equilibrium.reaction.overheat_temp > reagents.chem_temp && equilibrium.reaction.overheat_temp != NO_OVERHEAT) - danger = TRUE - overheat = TRUE - else - if(equilibrium.reaction.overheat_temp < reagents.chem_temp) - danger = TRUE - overheat = TRUE - if(equilibrium.reaction.reaction_flags & REACTION_COMPETITIVE) //We have a compeitive reaction - concatenate the results for the different reactions - for(var/entry in active_reactions) - if(entry["name"] == reagent.name) //If we have multiple reaction methods for the same result - combine them - entry["reactedVol"] = equilibrium.reacted_vol - entry["targetVol"] = round(equilibrium.target_vol, 1)//Use the first result reagent to name the reaction detected - entry["quality"] = (entry["quality"] + equilibrium.reaction_quality) /2 - continue - active_reactions.len++ - active_reactions[length(active_reactions)] = list("name" = reagent.name, "danger" = danger, "purityAlert" = purity_alert, "quality" = equilibrium.reaction_quality, "overheat" = overheat, "inverse" = reagent.inverse_chem_val, "minPure" = equilibrium.reaction.purity_min, "reactedVol" = equilibrium.reacted_vol, "targetVol" = round(equilibrium.target_vol, 1))//Use the first result reagent to name the reaction detected - data["activeReactions"] = active_reactions - data["isFlashing"] = flashing - - if(edit_recipe) - data["editRecipeName"] = edit_recipe.type - data["editRecipeCold"] = edit_recipe.is_cold_recipe - data["editRecipe"] = list( - list("name" = "required_temp" , "var" = edit_recipe.required_temp), - list("name" = "optimal_temp" , "var" = edit_recipe.optimal_temp), - list("name" = "overheat_temp" , "var" = edit_recipe.overheat_temp), - list("name" = "optimal_ph_min" , "var" = edit_recipe.optimal_ph_min), - list("name" = "optimal_ph_max" , "var" = edit_recipe.optimal_ph_max), - list("name" = "determin_ph_range" , "var" = edit_recipe.determin_ph_range), - list("name" = "temp_exponent_factor" , "var" = edit_recipe.temp_exponent_factor), - list("name" = "ph_exponent_factor" , "var" = edit_recipe.ph_exponent_factor), - list("name" = "thermic_constant" , "var" = edit_recipe.thermic_constant), - list("name" = "H_ion_release" , "var" = edit_recipe.H_ion_release), - list("name" = "rate_up_lim" , "var" = edit_recipe.rate_up_lim), - list("name" = "purity_min" , "var" = edit_recipe.purity_min), + var/static/list/ui_to_var + if(isnull(ui_to_var)) + ui_to_var = list( + "Required Temp" = "required_temp", + "Optimal Temp" = "optimal_temp", + "Overheat Temp" = "overheat_temp", + "Optimal Min Ph" = "optimal_ph_min", + "Optimal Max Ph" = "optimal_ph_max", + "Ph Range" = "determin_ph_range", + "Temp Exp Factor" = "temp_exponent_factor", + "Ph Exp Factor" = "ph_exponent_factor", + "Thermic Constant" = "thermic_constant", + "H Ion Release" = "H_ion_release", + "Rate Up Limit" = "rate_up_lim", + "Purity Min" = "purity_min", ) - return data - -/obj/machinery/chem_recipe_debug/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("power") - return - if("temperature") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - force_temp = clamp(target, 0, 1000) - if("pH") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - force_ph = target - if("forceTemp") - should_force_temp = ! should_force_temp - . = TRUE - if("forcepH") - should_force_ph = ! should_force_ph - . = TRUE - if("react") - react = TRUE - return TRUE - if("all") - process_all = !process_all - return TRUE - if("beakerSpawn") - beaker_spawn = !beaker_spawn - return TRUE - if("setTargetList") - var/text = tgui_input_text(usr, "Enter a list of Recipe product names separated by commas", "Recipe List", multiline = TRUE) - reaction_names = list() - if(!text) - say("Could not find reaction") - var/list/names = splittext("[text]", ",") - for(var/name in names) - var/datum/reagent/reagent = find_reagent_object_from_type(get_chem_id(name)) - if(!reagent) - say("Could not find [name]") - continue - var/datum/chemical_reaction/reaction = GLOB.chemical_reactions_list_product_index[reagent.type] - if(!reaction) - say("Could not find [name] reaction!") - continue - reaction_names += reaction - if("vol") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - vol_multiplier = clamp(target, 1, 200) - if("start") - if(processing) - say("currently processing reaction [index]: [cached_reactions[index]] of [cached_reactions.len]") - return - say("Starting processing") - index = 1 - setup_reactions() - begin_processing() - return TRUE - if("stop") - relay_all_reactions() - if("minTemp") - min_temp = !min_temp - if("setEdit") - var/name = (input("Enter the name of any reagent", "Input") as text|null) - reaction_names = list() - if(!text) - say("Could not find reaction") - var/datum/reagent/reagent = find_reagent_object_from_type(get_chem_id(name)) - if(!reagent) - say("Could not find [name]") - return - var/datum/chemical_reaction/reaction = GLOB.chemical_reactions_list_product_index[reagent.type] - if(!reaction) - say("Could not find [name] reaction!") - return - edit_recipe = reaction[1] - if("updateVar") - var/target = params["target"] - edit_recipe.vars[params["type"]] = target - if("export") - var/export = {"[edit_recipe.type] -[edit_recipe.is_cold_recipe ? "is_cold_recipe = TRUE" : ""] -required_temp = [edit_recipe.required_temp] -optimal_temp = [edit_recipe.optimal_temp] -overheat_temp = [edit_recipe.overheat_temp] -optimal_ph_min = [edit_recipe.optimal_ph_min] -optimal_ph_max = [edit_recipe.optimal_ph_max] -determin_ph_range = [edit_recipe.determin_ph_range] -temp_exponent_factor = [edit_recipe.temp_exponent_factor] -ph_exponent_factor = [edit_recipe.ph_exponent_factor] -thermic_constant = [edit_recipe.thermic_constant] -H_ion_release = [edit_recipe.H_ion_release] -rate_up_lim = [edit_recipe.rate_up_lim] -purity_min = [edit_recipe.purity_min]"} - say(export) - text2file(export, "[GLOB.log_directory]/chem_parse.txt") - + var/value = ui_to_var[variable] + if(!isnull(value)) + . = value /obj/machinery/chem_recipe_debug/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -397,10 +243,443 @@ purity_min = [edit_recipe.purity_min]"} ui = new(user, src, "ChemRecipeDebug", name) ui.open() -///Moves a type of buffer from the heater to the beaker, +/obj/machinery/chem_recipe_debug/ui_data(mob/user) + . = list() -/obj/machinery/chem_recipe_debug/ui_status(mob/user) - return UI_INTERACTIVE + .["forced_temp"] = forced_temp + .["temp_mode"] = temp_mode + .["forced_ph"] = forced_ph + .["use_forced_ph"] = use_forced_ph + .["forced_purity"] = forced_purity + .["use_forced_purity"] = use_forced_purity + .["volume_multiplier"] = volume_multiplier -/obj/machinery/chem_recipe_debug/ui_state(mob/user) - return GLOB.physical_state + var/datum/chemical_reaction/current_reaction = null + if(reactions_to_test.len) + current_reaction = reactions_to_test[current_reaction_index || 1] + if(isnull(current_reaction)) + .["current_reaction_name"] = "N/A" + else + .["current_reaction_name"] = extract_reaction_name(current_reaction) + .["current_reaction_mode"] = current_reaction_mode + + var/list/active_reactions = list() + var/flashing = DISABLE_FLASHING //for use with alertAfter - since there is no alertBefore, I set the after to 0 if true, or to the max value if false + for(var/datum/equilibrium/equilibrium as anything in target_reagents.reaction_list) + if(!equilibrium.reaction.results)//Incase of no result reactions + continue + var/datum/reagent/reagent = target_reagents.has_reagent(equilibrium.reaction.results[1]) //Reactions are named after their primary products + if(!reagent) + continue + + //check for danger levels primirarly overheating + var/overheat = FALSE + var/danger = FALSE + var/purity_alert = 2 //same as flashing + if(reagent.purity < equilibrium.reaction.purity_min) + purity_alert = ENABLE_FLASHING//Because 0 is seen as null + danger = TRUE + if(flashing != ENABLE_FLASHING)//So that the pH meter flashes for ANY reactions out of optimal + if(equilibrium.reaction.optimal_ph_min > target_reagents.ph || equilibrium.reaction.optimal_ph_max < target_reagents.ph) + flashing = ENABLE_FLASHING + if(equilibrium.reaction.is_cold_recipe) + if(equilibrium.reaction.overheat_temp > target_reagents.chem_temp && equilibrium.reaction.overheat_temp != NO_OVERHEAT) + danger = TRUE + overheat = TRUE + else + if(equilibrium.reaction.overheat_temp < target_reagents.chem_temp) + danger = TRUE + overheat = TRUE + + //create ui data + active_reactions += list(list( + "name" = reagent.name, + "danger" = danger, + "overheat" = overheat, + "purityAlert" = purity_alert, + "quality" = equilibrium.reaction_quality, + "inverse" = reagent.inverse_chem_val, + "minPure" = equilibrium.reaction.purity_min, + "reactedVol" = equilibrium.reacted_vol, + "targetVol" = round(equilibrium.target_vol, 1) + ) + ) + + //additional data for competitive reactions + if(equilibrium.reaction.reaction_flags & REACTION_COMPETITIVE) //We have a compeitive reaction - concatenate the results for the different reactions + for(var/entry in active_reactions) + if(entry["name"] == reagent.name) //If we have multiple reaction methods for the same result - combine them + entry["reactedVol"] = equilibrium.reacted_vol + entry["targetVol"] = round(equilibrium.target_vol, 1)//Use the first result reagent to name the reaction detected + entry["quality"] = (entry["quality"] + equilibrium.reaction_quality) /2 + continue + .["activeReactions"] = active_reactions + + .["isFlashing"] = flashing + .["isReacting"] = target_reagents.is_reacting + + var/list/reaction_data = null + if(!isnull(edit_reaction)) + var/reaction_name + if(length(edit_reaction.results)) //soups can have no results + var/datum/reagent/reagent = edit_reaction.results[1] + reaction_name = initial(reagent.name) + else + reaction_name = "[edit_reaction]" + reaction_data = list( + "name" = reaction_name, + "editVar" = edit_var, + "editValue" = edit_reaction.vars[decode_var(edit_var)] + ) + .["editReaction"] = reaction_data + + var/list/beaker_data = null + if(target_reagents.reagent_list.len) + beaker_data = list() + beaker_data["maxVolume"] = target_reagents.maximum_volume + beaker_data["pH"] = round(target_reagents.ph, 0.01) + beaker_data["purity"] = round(target_reagents.get_average_purity(), 0.01) + beaker_data["currentVolume"] = round(target_reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentTemp"] = round(target_reagents.chem_temp, 1) + beaker_data["purity"] = round(target_reagents.get_average_purity(), 0.001) + var/list/beakerContents = list() + if(length(target_reagents.reagent_list)) + for(var/datum/reagent/reagent in target_reagents.reagent_list) + beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING))) + + if(!QDELETED(required_container)) + //as of now we only decode soup pots. If more exotic containers are made make sure to add them here + if(istype(required_container, /obj/item/reagent_containers/cup/soup_pot)) + var/obj/item/reagent_containers/cup/soup_pot/pot = required_container + for(var/obj/item as anything in pot.added_ingredients) + //increment count if item already exists + var/entry_found = FALSE + for(var/list/entry as anything in beakerContents) + if(entry["name"] == item.name) + entry["volume"] += 1 + entry_found = TRUE + break + //new entry if non existent + if(!entry_found) + beakerContents += list(list("name" = item.name, "volume" = 1)) + + beaker_data["contents"] = beakerContents + .["beaker"] = beaker_data + +/obj/machinery/chem_recipe_debug/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("forced_temp") + var/target = params["target"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + forced_temp = target + return TRUE + + if("temp_mode") + var/target = params["target"] + if(isnull(target)) + return + + switch(target) + if("Reaction Temp") + temp_mode = USE_REACTION_TEMPERATURE + return TRUE + if("Forced Temp") + temp_mode = USE_USER_TEMPERATURE + return TRUE + if("Minimum Temp") + temp_mode = USE_MINIMUM_TEMPERATURE + return TRUE + if("Optimal Temp") + temp_mode = USE_OPTIMAL_TEMPERATURE + return TRUE + if("Overheat Temp") + temp_mode = USE_OVERHEAT_TEMPERATURE + return TRUE + + if("forced_ph") + var/target = params["target"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + forced_ph = target + return TRUE + + if("toggle_forced_ph") + use_forced_ph = !use_forced_ph + return TRUE + + if("forced_purity") + var/target = params["target"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + forced_purity = target + return TRUE + + if("toggle_forced_purity") + use_forced_purity = !use_forced_purity + return TRUE + + if("volume_multiplier") + var/target = params["target"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + volume_multiplier = target + return TRUE + + if("pick_reaction") + var/mode = tgui_alert(usr, "Play all or an specific reaction?","Select Reaction", list("All", "Specific")) + if(mode == "All") + reactions_to_test.Cut() + for(var/reaction as anything in all_reaction_list) + reactions_to_test += all_reaction_list[reaction] + current_reaction_index = 0 + return TRUE + + var/selected_reaction = tgui_input_list(ui.user, "Select Reaction", "Reaction", all_reaction_list) + if(!selected_reaction) + return + + var/datum/chemical_reaction/reaction = all_reaction_list[selected_reaction] + if(!reaction) + return + + reactions_to_test.Cut() + reactions_to_test += reaction + current_reaction_index = 0 + return TRUE + + if("reaction_mode") + var/target = params["target"] + if(isnull(target)) + return + + switch(target) + if("Next Reaction") + current_reaction_mode = PLAY_NEXT_REACTION + return TRUE + if("Previous Reaction") + current_reaction_mode = PLAY_PREVIOUS_REACTION + return TRUE + if("Pick Reaction") + current_reaction_mode = PLAY_USER_REACTION + return TRUE + + if("start_reaction") + var/datum/chemical_reaction/test_reaction + + //pick the reaction based on the reaction mode + var/len = reactions_to_test.len + if(len > 1) + switch(current_reaction_mode) + if(PLAY_NEXT_REACTION) + current_reaction_index = (current_reaction_index + 1) % len + if(PLAY_PREVIOUS_REACTION) + current_reaction_index = max(current_reaction_index - 1, 1) + if(PLAY_USER_REACTION) + var/list/reaction_names = list() + for(var/datum/chemical_reaction/reaction as anything in reactions_to_test) + reaction_names += extract_reaction_name(reaction) + if(!reaction_names.len) + return + + var/selected_reaction = tgui_input_list(ui.user, "Select Reaction", "Reaction", reaction_names) + if(!selected_reaction) + return + for(var/i = 1; i <= reaction_names.len; i++) + if(selected_reaction == reaction_names[i]) + current_reaction_index = i + break + test_reaction = reactions_to_test[current_reaction_index] + else if(len == 1) + current_reaction_index = 1 + test_reaction = reactions_to_test[1] + + //clear the previous reaction stuff + target_reagents.force_stop_reacting() + target_reagents.clear_reagents() + + //If the reaction requires a specific container initialize & do other stuff accordingly + target_reagents = reagents + if(!QDELETED(required_container)) + UnregisterSignal(required_container.reagents, COMSIG_REAGENTS_REACTION_STEP) + QDEL_NULL(required_container) + if(!isnull(test_reaction.required_container)) + required_container = new test_reaction.required_container(src) + required_container.create_reagents(MAXIMUM_HOLDER_VOLUME) + target_reagents = required_container.reagents + RegisterSignal(target_reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_recipe_debug, on_reaction_step)) + + //append everything required + var/list/reagent_list = list() + if(length(test_reaction.required_catalysts)) + reagent_list += test_reaction.required_catalysts + if(length(test_reaction.required_reagents)) + reagent_list += test_reaction.required_reagents + //now add the required reagents + var/target_temperature + switch(temp_mode) + if(USE_REACTION_TEMPERATURE) + target_temperature = DEFAULT_REAGENT_TEMPERATURE + else + target_temperature = decode_target_temperature() + for(var/datum/reagent/_reagent as anything in reagent_list) + var/vol_mul = volume_multiplier + if(length(test_reaction.required_catalysts) && test_reaction.required_catalysts[_reagent.type]) + vol_mul = 1 //catalysts don't need to be present in large amounts + + //add the required reagents with the precise conditions + target_reagents.add_reagent( + _reagent, + reagent_list[_reagent] * vol_mul, + reagtemp = target_temperature, + added_purity = use_forced_purity ? forced_purity : null, + added_ph = use_forced_ph ? forced_ph : null, + no_react = TRUE + ) + + //add solid ingredients for soups + if(istype(test_reaction, /datum/chemical_reaction/food/soup)) + var/datum/chemical_reaction/food/soup/soup_reaction = test_reaction + var/obj/item/reagent_containers/cup/soup_pot/pot = required_container + for(var/obj/item as anything in soup_reaction.required_ingredients) + for(var/_ in 1 to soup_reaction.required_ingredients[item]) + LAZYADD(pot.added_ingredients, new item(pot)) + + target_reagents.handle_reactions() + return TRUE + + if("edit_reaction") + var/selected_reaction = tgui_input_list(ui.user, "Select Reaction", "Reaction", all_reaction_list) + if(!selected_reaction) + return + + var/datum/chemical_reaction/reaction = all_reaction_list[selected_reaction] + if(!reaction) + return + + edit_reaction = reaction + edit_var = initial(edit_var) + return TRUE + + if("edit_var") + var/target = params["target"] + if(isnull(target)) + return + if(isnull(decode_var(target))) + return + edit_var = target + return TRUE + + if("edit_value") + var/target = params["target"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + edit_reaction.vars[decode_var(edit_var)] = target + return TRUE + + if("reset_value") + switch(edit_var) + if("Required Temp") + edit_reaction.required_temp = initial(edit_reaction.required_temp) + return TRUE + if("Optimal Temp") + edit_reaction.optimal_temp = initial(edit_reaction.optimal_temp) + return TRUE + if("Overheat Temp") + edit_reaction.overheat_temp = initial(edit_reaction.overheat_temp) + return TRUE + if("Optimal Min Ph") + edit_reaction.optimal_ph_min = initial(edit_reaction.optimal_ph_min) + return TRUE + if("Optimal Max Ph") + edit_reaction.optimal_ph_max = initial(edit_reaction.optimal_ph_max) + return TRUE + if("Ph Range") + edit_reaction.determin_ph_range = initial(edit_reaction.determin_ph_range) + return TRUE + if("Temp Exp Factor") + edit_reaction.temp_exponent_factor = initial(edit_reaction.temp_exponent_factor) + return TRUE + if("Ph Exp Factor") + edit_reaction.ph_exponent_factor = initial(edit_reaction.ph_exponent_factor) + return TRUE + if("Thermic Constant") + edit_reaction.thermic_constant = initial(edit_reaction.thermic_constant) + return TRUE + if("H Ion Release") + edit_reaction.H_ion_release = initial(edit_reaction.H_ion_release) + return TRUE + if("Rate Up Limit") + edit_reaction.rate_up_lim = initial(edit_reaction.rate_up_lim) + return TRUE + if("Purity Min") + edit_reaction.purity_min = initial(edit_reaction.purity_min) + return TRUE + + if("export") + var/export = "[edit_reaction]\n" + export += "\tis_cold_recipe = [edit_reaction.is_cold_recipe]\n" + export += "\trequired_temp = [edit_reaction.required_temp]\n" + export += "\toptimal_temp = [edit_reaction.optimal_temp]\n" + export += "\toverheat_temp = [edit_reaction.overheat_temp]\n" + export += "\toptimal_ph_min = [edit_reaction.optimal_ph_min]\n" + export += "\toptimal_ph_max = [edit_reaction.optimal_ph_max]\n" + export += "\tdetermin_ph_range = [edit_reaction.determin_ph_range]\n" + export += "\ttemp_exponent_factor = [edit_reaction.temp_exponent_factor]\n" + export += "\tph_exponent_factor = [edit_reaction.ph_exponent_factor]\n" + export += "\tthermic_constant = [edit_reaction.thermic_constant]\n" + export += "\tH_ion_release = [edit_reaction.H_ion_release]\n" + export += "\trate_up_lim = [edit_reaction.rate_up_lim]\n" + export += "\tpurity_min = [edit_reaction.purity_min]\n" + + var/dest = "[GLOB.log_directory]/chem_parse.txt" + text2file(export, dest) + tgui_alert(ui.user, "Saved to [dest]") + + if("eject") + if(!target_reagents.total_volume) + return + if(QDELETED(beaker)) + beaker = new /obj/item/reagent_containers/cup/beaker/bluespace(src) + target_reagents.trans_to(beaker, target_reagents.total_volume) + try_put_in_hand(beaker, ui.user) + return TRUE + +#undef USE_REACTION_TEMPERATURE +#undef USE_MINIMUM_TEMPERATURE +#undef USE_USER_TEMPERATURE +#undef USE_OPTIMAL_TEMPERATURE +#undef USE_OVERHEAT_TEMPERATURE +#undef PLAY_NEXT_REACTION +#undef PLAY_PREVIOUS_REACTION +#undef PLAY_USER_REACTION +#undef MAXIMUM_HOLDER_VOLUME diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm index 686196b73ff..c0cb45dda2a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm +++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm @@ -6,7 +6,7 @@ base_icon_state = "dispenser" amount = 10 resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION use_power = NO_POWER_USE var/static/list/shortcuts = list( "meth" = /datum/reagent/drug/methamphetamine diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index bdc008ce336..791feb80039 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -1,6 +1,6 @@ /obj/item/storage/portable_chem_mixer name = "Portable Chemical Mixer" - desc = "A portable device that dispenses and mixes chemicals. All necessary reagents need to be supplied with beakers. A label indicates that the 'CTRL'-button on the device may be used to open it for refills. This device can be worn as a belt. The letters 'S&T' are imprinted on the side." + desc = "A portable device that dispenses and mixes chemicals using the beakers inserted inside." icon = 'icons/obj/medical/chemical.dmi' icon_state = "portablechemicalmixer_open" worn_icon_state = "portable_chem_mixer" @@ -11,7 +11,7 @@ custom_premium_price = PAYCHECK_CREW * 14 ///Creating an empty slot for a beaker that can be added to dispense into - var/obj/item/reagent_containers/beaker = null + var/obj/item/reagent_containers/beaker ///The amount of reagent that is to be dispensed currently var/amount = 30 ///List in which all currently dispensable reagents go @@ -31,12 +31,11 @@ register_context() /obj/item/storage/portable_chem_mixer/Destroy() + dispensable_reagents.Cut() QDEL_NULL(beaker) return ..() /obj/item/storage/portable_chem_mixer/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - context[SCREENTIP_CONTEXT_CTRL_LMB] = "[atom_storage.locked ? "Un" : ""]Lock storage" if(atom_storage.locked && !QDELETED(beaker)) context[SCREENTIP_CONTEXT_ALT_LMB] = "Eject beaker" @@ -44,6 +43,7 @@ if(!isnull(held_item)) if (!atom_storage.locked || \ (held_item.item_flags & ABSTRACT) || \ + (held_item.flags_1 & HOLOGRAM_1) || \ !is_reagent_container(held_item) || \ !held_item.is_open_container() \ ) @@ -55,70 +55,34 @@ /obj/item/storage/portable_chem_mixer/examine(mob/user) . = ..() if(!atom_storage.locked) - . += span_notice("Use [EXAMINE_HINT("ctrl click")] to lock in order to use its interface.") + . += span_notice("Use [EXAMINE_HINT("Ctrl Click")] to lock in order to use its interface.") else - . += span_notice("Its storage is locked, use [EXAMINE_HINT("ctrl click")] to unlock it.") + . += span_notice("Its storage is locked, use [EXAMINE_HINT("Ctrl Click")] to unlock it.") if(QDELETED(beaker)) . += span_notice("A beaker can be inserted to dispense reagents after it is locked.") else - . += span_notice("A beaker of [beaker.reagents.maximum_volume] units capacity is inserted.") - . += span_notice("It can be ejected with [EXAMINE_HINT("alt click")].") - -/obj/item/storage/portable_chem_mixer/ex_act(severity, target) - return severity > EXPLODE_LIGHT ? ..() : FALSE - -/obj/item/storage/portable_chem_mixer/attackby(obj/item/weapon, mob/user, params) - if (!atom_storage.locked || \ - (weapon.item_flags & ABSTRACT) || \ - !is_reagent_container(weapon) || \ - !weapon.is_open_container() \ - ) - return ..() - - replace_beaker(user, weapon) - update_appearance() - return TRUE + . += span_notice("A beaker of [beaker.reagents.maximum_volume]u capacity is inserted.") + . += span_notice("It can be ejected with [EXAMINE_HINT("Alt Click")].") /obj/item/storage/portable_chem_mixer/update_icon_state() if(!atom_storage.locked) icon_state = "portablechemicalmixer_open" return ..() - if(beaker) + if(!QDELETED(beaker)) icon_state = "portablechemicalmixer_full" return ..() icon_state = "portablechemicalmixer_empty" return ..() -/obj/item/storage/portable_chem_mixer/AltClick(mob/living/user) - if(!atom_storage.locked) - balloon_alert(user, "lock first to use alt eject!") - return ..() - if(!can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - - replace_beaker(user) - update_appearance() - -/obj/item/storage/portable_chem_mixer/CtrlClick(mob/living/user) - if(atom_storage.locked == STORAGE_FULLY_LOCKED) - atom_storage.locked = STORAGE_NOT_LOCKED - replace_beaker(user) - SStgui.close_all_uis() - else - atom_storage.locked = STORAGE_FULLY_LOCKED - atom_storage.hide_contents(usr) - - update_appearance() - -/obj/item/storage/portable_chem_mixer/Exited(atom/movable/gone, direction) +/obj/item/storage/portable_chem_mixer/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() - if(gone == beaker) - beaker = null - else + if(!atom_storage.locked) update_contents() /// Reload dispensable reagents from new contents /obj/item/storage/portable_chem_mixer/proc/update_contents() + PRIVATE_PROC(TRUE) + dispensable_reagents.Cut() for (var/obj/item/reagent_containers/container in contents) var/datum/reagent/key = container.reagents.get_master_reagent() @@ -131,11 +95,29 @@ dispensable_reagents[key_type]["reagents"] = list() dispensable_reagents[key_type]["reagents"] += container.reagents -/obj/item/storage/portable_chem_mixer/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) +/obj/item/storage/portable_chem_mixer/Exited(atom/movable/gone, direction) . = ..() - if(!atom_storage.locked) + if(gone == beaker) + beaker = null + else update_contents() +/obj/item/storage/portable_chem_mixer/ex_act(severity, target) + return severity > EXPLODE_LIGHT ? ..() : FALSE + +/obj/item/storage/portable_chem_mixer/attackby(obj/item/weapon, mob/user, params) + if (!atom_storage.locked || \ + (weapon.item_flags & ABSTRACT) || \ + (weapon.flags_1 & HOLOGRAM_1) || \ + !is_reagent_container(weapon) || \ + !weapon.is_open_container() \ + ) + return ..() + + replace_beaker(user, weapon) + update_appearance() + return TRUE + /** * Replaces the beaker of the portable chemical mixer with another beaker, or simply adds the new beaker if none is in currently * @@ -145,21 +127,16 @@ * * obj/item/reagent_containers/new_beaker - The new beaker that the user wants to put into the device */ /obj/item/storage/portable_chem_mixer/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) - if(beaker) + PRIVATE_PROC(TRUE) + + if(!QDELETED(beaker)) user.put_in_hands(beaker) - if(new_beaker) + + if(!QDELETED(new_beaker)) if(!user.transferItemToLoc(new_beaker, src)) return beaker = new_beaker -/obj/item/storage/portable_chem_mixer/MouseDrop(obj/over_object) - . = ..() - if(ismob(loc)) - var/mob/M = loc - if(!M.incapacitated() && 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/ui_interact(mob/user, datum/tgui/ui) if(loc != user) balloon_alert(user, "hold it in your hand!") @@ -183,26 +160,24 @@ . = list() .["amount"] = amount - var/list/chemicals = list() var/is_hallucinating = FALSE if(isliving(user)) var/mob/living/living_user = user is_hallucinating = !!living_user.has_status_effect(/datum/status_effect/hallucination) - for(var/re in dispensable_reagents) - var/value = dispensable_reagents[re] - var/datum/reagent/temp = GLOB.chemical_reagents_list[re] + .["chemicals"] = list() + for(var/datum/reagent/reagent_type as anything in dispensable_reagents) + var/datum/reagent/temp = GLOB.chemical_reagents_list[reagent_type] if(temp) var/chemname = temp.name var/total_volume = 0 var/total_ph = 0 - for (var/datum/reagents/rs in value["reagents"]) + for (var/datum/reagents/rs as anything in dispensable_reagents[reagent_type]["reagents"]) total_volume += rs.total_volume total_ph = rs.ph if(is_hallucinating && prob(5)) chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" - chemicals += list(list("title" = chemname, "id" = temp.name, "volume" = total_volume, "pH" = total_ph)) - .["chemicals"] = chemicals + .["chemicals"] += list(list("title" = chemname, "id" = temp.name, "volume" = total_volume, "pH" = total_ph)) var/list/beaker_data = null if(!QDELETED(beaker)) @@ -212,7 +187,7 @@ beaker_data["pH"] = round(beaker.reagents.ph, 0.01) beaker_data["currentVolume"] = round(beaker.reagents.total_volume, 0.01) var/list/beakerContents = list() - if(length(beaker?.reagents.reagent_list)) + if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) beakerContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) // list in a list because Byond merges the first list... beaker_data["contents"] = beakerContents @@ -225,7 +200,15 @@ switch(action) if("amount") - amount = text2num(params["target"]) + var/target = params["target"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + amount = target return TRUE if("dispense") @@ -236,17 +219,54 @@ if(!QDELETED(beaker)) var/datum/reagents/container = beaker.reagents var/actual = min(amount, container.maximum_volume - container.total_volume) - for (var/datum/reagents/source in dispensable_reagents[reagent]["reagents"]) + for(var/datum/reagents/source as anything in dispensable_reagents[reagent]["reagents"]) actual -= source.trans_to(beaker, min(source.total_volume, actual), transferred_by = ui.user) - if (actual <= 0) + if(actual <= 0) break - return TRUE + return TRUE if("remove") - beaker.reagents.remove_all(text2num(params["amount"])) + var/target = params["amount"] + if(isnull(target)) + return + + target = text2num(target) + if(isnull(target)) + return + + beaker.reagents.remove_all(target) return TRUE if("eject") replace_beaker(ui.user) update_appearance() return TRUE + +/obj/item/storage/portable_chem_mixer/MouseDrop(obj/over_object) + . = ..() + if(ismob(loc)) + var/mob/M = loc + if(!M.incapacitated() && 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/AltClick(mob/living/user) + if(!atom_storage.locked) + balloon_alert(user, "lock first to use alt eject!") + return ..() + if(!can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return + + replace_beaker(user) + update_appearance() + +/obj/item/storage/portable_chem_mixer/CtrlClick(mob/living/user) + if(atom_storage.locked == STORAGE_FULLY_LOCKED) + atom_storage.locked = STORAGE_NOT_LOCKED + replace_beaker(user) + SStgui.close_uis(src) + else + atom_storage.locked = STORAGE_FULLY_LOCKED + atom_storage.hide_contents(usr) + + update_appearance() diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 272ff5bd687..a8d1765891b 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -77,7 +77,6 @@ /obj/machinery/smoke_machine/process() - ..() if(reagents.total_volume == 0) on = FALSE update_appearance() diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 99442273495..9439176fd09 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -420,7 +420,7 @@ description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication." color = "#AB3C05" // rgb: 171, 60, 5 boozepwr = 75 - taste_description = "angry and irish" + taste_description = "smooth and french" ph = 3.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK @@ -2728,7 +2728,7 @@ description = "A drink glorifying Cybersun's enduring business." boozepwr = 20 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_FANTASTIC taste_description = "betrayal" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2737,7 +2737,7 @@ description = "A variation on the Long Island Iced Tea, made with yuyake for an alternative flavour that's hard to place." boozepwr = 40 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "an asian twist on the liquor cabinet" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2746,7 +2746,7 @@ description = "It's a melon cream soda, except with alcohol- what's not to love? Well... possibly the hangovers." boozepwr = 6 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_GOOD taste_description = "creamy melon soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2755,7 +2755,7 @@ description = "A new take on a classic cocktail, the Kumicho takes the Godfather formula and adds shochu for an Asian twist." boozepwr = 62 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "rice and rye" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2764,7 +2764,7 @@ description = "Made in celebration of the Martian Concession, the Red Planet is based on the classic El Presidente, and is as patriotic as it is bright crimson." boozepwr = 45 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "the spirit of freedom" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2773,7 +2773,7 @@ description = "Named for Amaterasu, the Shinto Goddess of the Sun, this cocktail embodies radiance- or something like that, anyway." boozepwr = 54 //1 part bitters is a lot color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "sweet nectar of the gods" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2782,7 +2782,7 @@ description = "An overly sweet cocktail, made with melon liqueur, melon juice, and champagne (which contains no melon, unfortunately)." boozepwr = 17 color = "#FF0C8D" - quality = DRINK_NICE + quality = DRINK_GOOD taste_description = "MELON" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2791,7 +2791,7 @@ description = "Based on the galaxy-famous \"Kyūkyoku no Ninja Pawā Sentai\", the Sentai Quencha is a favourite at anime conventions and weeb bars." boozepwr = 28 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_GOOD taste_description = "ultimate ninja power" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2800,7 +2800,7 @@ description = "A simple summer drink from Mars, made from a 1:1 mix of rice beer and lemonade." boozepwr = 6 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_GOOD taste_description = "bittersweet lemon" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2809,7 +2809,7 @@ description = "Sweet, bitter, spicy- that's a great combination." boozepwr = 6 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "spicy pineapple beer" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2827,7 +2827,7 @@ description = "A stiff, bitter drink with an odd name and odder recipe." boozepwr = 26 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "bitter raspberry" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2836,7 +2836,7 @@ description = "A drink to power your typing hands." boozepwr = 26 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_GOOD taste_description = "cyberspace" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2845,7 +2845,7 @@ description = "A take on the classic White Russian, subbing out the classics for some tropical flavours." boozepwr = 16 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_GOOD taste_description = "COCONUT" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2854,7 +2854,7 @@ description = "Behind this drink's red facade lurks a sharp, complex flavour." boozepwr = 15 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "sunrise over the pacific" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2863,7 +2863,7 @@ description = "For when orgeat is in short supply, do as the spacers do- make do and mend." boozepwr = 52 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "spicy nutty rum" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2872,7 +2872,7 @@ description = "Coconut rum, coffee liqueur, and espresso- an odd combination, to be sure, but a welcomed one." boozepwr = 20 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "coconut coffee" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2881,7 +2881,7 @@ description = "Sweet, sharp and coconutty." boozepwr = 30 color = "#F54040" - quality = DRINK_NICE + quality = DRINK_VERYGOOD taste_description = "the aloha state" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4dafd97c094..df126b01ccd 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2856,7 +2856,7 @@ /datum/reagent/eldritch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() var/need_mob_update = FALSE - if(IS_HERETIC(drinker)) + if(IS_HERETIC_OR_MONSTER(drinker)) drinker.adjust_drowsiness(-10 * REM * seconds_per_tick) drinker.AdjustAllImmobility(-40 * REM * seconds_per_tick) need_mob_update += drinker.adjustStaminaLoss(-10 * REM * seconds_per_tick, updating_stamina = FALSE) diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 013d9831ee7..83754dd571f 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -479,7 +479,7 @@ /obj/item/reagent_containers/cup/glass/bottle/amaretto name = "Luini Amaretto" - desc = "A gentle and syrup like drink, tastes of almonds and apricots" + desc = "A gentle, syrupy drink that tastes of almonds and apricots." icon_state = "disaronno" list_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 100) diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index b42345ae97d..4eabfa1095a 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -74,8 +74,8 @@ /datum/addiction/hallucinogens/withdrawal_enters_stage_2(mob/living/carbon/affected_carbon) . = ..() var/atom/movable/plane_master_controller/game_plane_master_controller = affected_carbon.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] - game_plane_master_controller.add_filter("hallucinogen_wave", 10, wave_filter(300, 300, 3, 0, WAVE_SIDEWAYS)) game_plane_master_controller.add_filter("hallucinogen_blur", 10, angular_blur_filter(0, 0, 3)) + game_plane_master_controller.add_filter("hallucinogen_wave", 10, wave_filter(300, 300, 3, 0, WAVE_SIDEWAYS)) /datum/addiction/hallucinogens/withdrawal_enters_stage_3(mob/living/carbon/affected_carbon) diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index cb1a0800c51..14108f22bd9 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -248,7 +248,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor/proc/conveyable_exit(datum/source, atom/convayable, direction) SIGNAL_HANDLER var/has_conveyor = neighbors["[direction]"] - if(!has_conveyor || !isturf(convayable.loc)) //If you've entered something on us, stop moving + if(convayable.z != z || !has_conveyor || !isturf(convayable.loc)) //If you've entered something on us, stop moving SSmove_manager.stop_looping(convayable, SSconveyors) /obj/machinery/conveyor/proc/start_conveying(atom/movable/moving) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 66c1e073e2b..ea5e557f35d 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -61,7 +61,7 @@ RegisterSignal(src, COMSIG_RAT_INTERACT, PROC_REF(on_rat_rummage)) RegisterSignal(src, COMSIG_STORAGE_DUMP_CONTENT, PROC_REF(on_storage_dump)) var/static/list/loc_connections = list( - COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(trash_carbon), + COMSIG_LIVING_DISARM_COLLIDE = PROC_REF(trash_living), COMSIG_TURF_RECEIVE_SWEEPED_ITEMS = PROC_REF(ready_for_trash), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -551,17 +551,17 @@ return COMPONENT_RAT_INTERACTED /// Handles a carbon mob getting shoved into the disposal bin -/obj/machinery/disposal/proc/trash_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) +/obj/machinery/disposal/proc/trash_living(datum/source, mob/living/shover, mob/living/target, shove_flags, obj/item/weapon) SIGNAL_HANDLER - if(!shove_blocked) + if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) return target.Knockdown(SHOVE_KNOCKDOWN_SOLID) target.forceMove(src) target.visible_message(span_danger("[shover.name] shoves [target.name] into \the [src]!"), - span_userdanger("You're shoved into \the [src] by [target.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + span_userdanger("You're shoved into \the [src] by [target.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) to_chat(src, span_danger("You shove [target.name] into \the [src]!")) - log_combat(shover, target, "shoved", "into [src] (disposal bin)") - return COMSIG_CARBON_SHOVE_HANDLED + log_combat(shover, target, "shoved", "into [src] (disposal bin)[weapon ? " with [weapon]" : ""]") + return COMSIG_LIVING_SHOVE_HANDLED ///Called when a push broom is trying to sweep items onto the turf this object is standing on. Garbage will be moved inside. /obj/machinery/disposal/proc/ready_for_trash(datum/source, obj/item/pushbroom/broom, mob/user, list/items_to_sweep) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index f4c0d4362a4..785fab73097 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -325,7 +325,7 @@ /obj/item/sales_tagger name = "sales tagger" desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo." - icon = 'icons/obj/devices/tool.dmi' + icon = 'icons/obj/devices/scanner.dmi' icon_state = "sales tagger" worn_icon_state = "salestagger" inhand_icon_state = "electronic" diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index f43e33aa25a..bd063dea439 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -317,8 +317,8 @@ var/atom/movable/plane_master_controller/game_plane_master_controller = owner.hud_used?.plane_master_controllers[PLANE_MASTERS_GAME] if(!game_plane_master_controller) return FALSE - game_plane_master_controller.add_filter("psychic_wave", 10, wave_filter(240, 240, 3, 0, WAVE_SIDEWAYS)) game_plane_master_controller.add_filter("psychic_blur", 10, angular_blur_filter(0, 0, 3)) + game_plane_master_controller.add_filter("psychic_wave", 10, wave_filter(240, 240, 3, 0, WAVE_SIDEWAYS)) return TRUE /datum/status_effect/psychic_projection/on_remove() diff --git a/code/modules/religion/pyre/pyre_rites.dm b/code/modules/religion/pyre/pyre_rites.dm index c36783e6b12..79f95ad6af6 100644 --- a/code/modules/religion/pyre/pyre_rites.dm +++ b/code/modules/religion/pyre/pyre_rites.dm @@ -10,9 +10,9 @@ name = "Unmelting Protection" desc = "Grants fire immunity to any piece of clothing." ritual_length = 12 SECONDS - ritual_invocations = list("And so to support the holder of the Ever-Burning candle...", + ritual_invocations = list("And so to support the holder of the Ever-Burning candle ...", "... allow this unworthy apparel to serve you ...", - "... make it strong enough to burn a thousand time and more ...") + "... make it strong enough to burn a thousand times and more ...") invoke_msg = "... Come forth in your new form, and join the unmelting wax of the one true flame!" favor_cost = 1000 ///the piece of clothing that will be fireproofed, only one per rite diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index a7124bf122b..ce68dd8d454 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -32,7 +32,7 @@ other types of metals and chemistry for reagents). /// List of materials required to create one unit of the product. Format is (typepath or caregory) -> amount var/list/materials = list() /// The amount of time required to create one unit of the product. - var/construction_time + var/construction_time = 3.2 SECONDS /// The typepath of the object produced by this design var/build_path = null /// Reagent produced by this design. Currently only supported by the biogenerator. diff --git a/code/modules/research/designs/autolathe/mining.dm b/code/modules/research/designs/autolathe/mining.dm new file mode 100644 index 00000000000..bc83d27123d --- /dev/null +++ b/code/modules/research/designs/autolathe/mining.dm @@ -0,0 +1,32 @@ +// Autolathe-able circuitboards for starting with boulder processing machines. +/datum/design/board/smelter + name = "Boulder Smelter" + desc = "A circuitboard for a boulder smelter. Lowtech enough to be printed from the lathe." + id = "b_smelter" + build_type = AUTOLATHE + materials = list( + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/circuitboard/machine/smelter + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO, + ) + departmental_flags = DEPARTMENT_BITFLAG_CARGO + +/datum/design/board/refinery + name = "Boulder Refinery" + desc = "A circuitboard for a boulder refinery. Lowtech enough to be printed from the lathe." + id = "b_refinery" + build_type = AUTOLATHE + materials = list( + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/circuitboard/machine/refinery + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO, + ) + departmental_flags = DEPARTMENT_BITFLAG_CARGO diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 11e6f026f68..a73b4459333 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -1135,3 +1135,16 @@ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/brm + name = "Boulder Retrieval Matrix" + id = "brm" + materials = list( + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/circuitboard/machine/brm + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELEPORT, + ) + departmental_flags = DEPARTMENT_BITFLAG_CARGO diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 098cac6a389..21deb54280c 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -226,7 +226,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -244,7 +244,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_ammo/scattershot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) - construction_time = 20 + construction_time = 2 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -262,7 +262,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -280,7 +280,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_ammo/incendiary materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) - construction_time = 20 + construction_time = 2 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -298,7 +298,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT*3,/datum/material/uranium=SHEET_MATERIAL_AMOUNT) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -316,7 +316,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -334,7 +334,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -352,7 +352,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -370,7 +370,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -388,7 +388,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*11,/datum/material/gold=SHEET_MATERIAL_AMOUNT*3,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -406,7 +406,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_ammo/flashbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2,/datum/material/gold=SMALL_MATERIAL_AMOUNT*5) - construction_time = 20 + construction_time = 2 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -424,7 +424,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*11,/datum/material/gold=SHEET_MATERIAL_AMOUNT*3,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -442,7 +442,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_ammo/missiles_pep materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*4,/datum/material/gold=SMALL_MATERIAL_AMOUNT*5) - construction_time = 20 + construction_time = 2 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -460,7 +460,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/gold=SHEET_MATERIAL_AMOUNT*5,/datum/material/uranium=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -478,7 +478,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_ammo/clusterbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3,/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT * 1.5,/datum/material/uranium=HALF_SHEET_MATERIAL_AMOUNT * 1.5) - construction_time = 20 + construction_time = 2 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -496,7 +496,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -517,7 +517,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/teleporter materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/diamond=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -538,7 +538,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/rcd materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*15,/datum/material/gold=SHEET_MATERIAL_AMOUNT*10,/datum/material/plasma=SHEET_MATERIAL_AMOUNT*12.5,/datum/material/silver=SHEET_MATERIAL_AMOUNT*10) - construction_time = 1200 + construction_time = 2 MINUTES category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -559,7 +559,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*12.5,/datum/material/titanium=SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/silver=SHEET_MATERIAL_AMOUNT*1.5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -579,7 +579,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -600,7 +600,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT,/datum/material/silver=SHEET_MATERIAL_AMOUNT) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -621,7 +621,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT * 2.5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -642,7 +642,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/gold=SHEET_MATERIAL_AMOUNT * 2.5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -663,7 +663,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/diamond=SHEET_MATERIAL_AMOUNT*3.25) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, @@ -678,7 +678,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plasma =SHEET_MATERIAL_AMOUNT) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -698,7 +698,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -718,7 +718,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -735,7 +735,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_ammo/lmg materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT *2) - construction_time = 20 + construction_time = 2 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -752,7 +752,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -766,7 +766,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*1.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -779,7 +779,7 @@ id = "mech_medi_beam" build_type = MECHFAB materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4, /datum/material/plasma =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT*4, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) - construction_time = 250 + construction_time = 25 SECONDS build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 053a3a2b5e8..392d42221e7 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -7,7 +7,7 @@ build_type = MECHFAB build_path = /obj/item/robot_suit materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 500 + construction_time = 50 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -18,7 +18,7 @@ build_type = MECHFAB build_path = /obj/item/bodypart/chest/robot materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT*20) - construction_time = 350 + construction_time = 35 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -29,7 +29,7 @@ build_type = MECHFAB build_path = /obj/item/bodypart/head/robot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5) - construction_time = 350 + construction_time = 35 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -40,7 +40,7 @@ build_type = MECHFAB build_path = /obj/item/bodypart/arm/left/robot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -51,7 +51,7 @@ build_type = MECHFAB build_path = /obj/item/bodypart/arm/right/robot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -62,7 +62,7 @@ build_type = MECHFAB build_path = /obj/item/bodypart/leg/left/robot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -73,7 +73,7 @@ build_type = MECHFAB build_path = /obj/item/bodypart/leg/right/robot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS ) @@ -148,7 +148,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/ripley materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -162,7 +162,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/glass =SHEET_MATERIAL_AMOUNT*3.75, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -173,7 +173,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/ripley_left_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -184,7 +184,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/ripley_right_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -195,7 +195,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/ripley_left_leg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -206,7 +206,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/ripley_right_leg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -218,7 +218,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/odysseus materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -229,7 +229,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/odysseus_torso materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*6) - construction_time = 180 + construction_time = 18 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -243,7 +243,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*3, /datum/material/glass =SHEET_MATERIAL_AMOUNT*5 ) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -254,7 +254,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/odysseus_left_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -265,7 +265,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/odysseus_right_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -276,7 +276,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/odysseus_left_leg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3.5) - construction_time = 130 + construction_time = 13 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -287,7 +287,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/odysseus_right_leg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3.5) - construction_time = 130 + construction_time = 13 SECONDS category = list( RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -299,7 +299,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/gygax materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -315,7 +315,7 @@ /datum/material/gold=SHEET_MATERIAL_AMOUNT, /datum/material/silver=SHEET_MATERIAL_AMOUNT, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -331,7 +331,7 @@ /datum/material/gold=SHEET_MATERIAL_AMOUNT, /datum/material/silver=SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -346,7 +346,7 @@ /datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver=HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -361,7 +361,7 @@ /datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver=HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -376,7 +376,7 @@ /datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver=HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -391,7 +391,7 @@ /datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver=HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -407,7 +407,7 @@ /datum/material/silver=SHEET_MATERIAL_AMOUNT*5, /datum/material/titanium=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 600 + construction_time = 60 SECONDS category = list( RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -419,7 +419,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/durand materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*12.5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -434,7 +434,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -449,7 +449,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*7.5, /datum/material/silver=SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -463,7 +463,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -477,7 +477,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -491,7 +491,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -505,7 +505,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -520,7 +520,7 @@ /datum/material/uranium=SHEET_MATERIAL_AMOUNT*12.5, /datum/material/titanium=SHEET_MATERIAL_AMOUNT*10, ) - construction_time = 600 + construction_time = 60 SECONDS category = list( RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -532,7 +532,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/honker materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -547,7 +547,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, /datum/material/bananium=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -562,7 +562,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -576,7 +576,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -590,7 +590,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -604,7 +604,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -618,7 +618,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -630,7 +630,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/phazon materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -645,7 +645,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*10, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -660,7 +660,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -674,7 +674,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -688,7 +688,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -702,7 +702,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -716,7 +716,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -731,7 +731,7 @@ /datum/material/plasma=SHEET_MATERIAL_AMOUNT*10, /datum/material/titanium=SHEET_MATERIAL_AMOUNT*10, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -743,7 +743,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/savannah_ivanov materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -757,7 +757,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/glass =SHEET_MATERIAL_AMOUNT*3.75, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -771,7 +771,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*3, /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -782,7 +782,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -793,7 +793,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -804,7 +804,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/savannah_ivanov materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*12.5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -819,7 +819,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -834,7 +834,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*7.5, /datum/material/silver=SHEET_MATERIAL_AMOUNT, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -848,7 +848,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -862,7 +862,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -876,7 +876,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -890,7 +890,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -905,7 +905,7 @@ /datum/material/uranium=SHEET_MATERIAL_AMOUNT*12.5, /datum/material/titanium=SHEET_MATERIAL_AMOUNT*10, ) - construction_time = 600 + construction_time = 60 SECONDS category = list( RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -917,7 +917,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/chassis/clarke materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -931,7 +931,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/glass =SHEET_MATERIAL_AMOUNT*3.75, ) - construction_time = 200 + construction_time = 20 SECONDS category = list( RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -945,7 +945,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*3, /datum/material/glass =SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -956,7 +956,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/clarke_left_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -967,7 +967,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/part/clarke_right_arm materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*7.5) - construction_time = 150 + construction_time = 15 SECONDS category = list( RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CHASSIS ) @@ -982,7 +982,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, /datum/material/plasma=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -998,7 +998,7 @@ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/titanium = SHEET_MATERIAL_AMOUNT *5, ) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_CHASSIS, @@ -1010,7 +1010,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1022,7 +1022,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/weapon/paddy_claw materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_PADDY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1034,7 +1034,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/drill materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1055,7 +1055,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT *1.25, ) - construction_time = 50 + construction_time = 5 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1068,7 +1068,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1086,7 +1086,7 @@ /datum/material/silver=SHEET_MATERIAL_AMOUNT, /datum/material/plasma=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1107,7 +1107,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -1123,7 +1123,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 300 + construction_time = 30 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -1139,7 +1139,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/bananium=SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 500 + construction_time = 50 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -1155,7 +1155,7 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT*10, /datum/material/bananium=SHEET_MATERIAL_AMOUNT*3.75, ) - construction_time = 400 + construction_time = 40 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -1168,7 +1168,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/radio materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2.5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1186,7 +1186,7 @@ build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/air_tank materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1208,7 +1208,7 @@ build_type = MECHFAB build_path = /obj/item/borg/upgrade/rename materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1222,7 +1222,7 @@ /datum/material/iron = SHEET_MATERIAL_AMOUNT*10, /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1238,7 +1238,7 @@ /datum/material/plasma =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/uranium =SHEET_MATERIAL_AMOUNT*3, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1254,7 +1254,7 @@ /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SECURITY ) @@ -1269,7 +1269,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*3, /datum/material/diamond =SHEET_MATERIAL_AMOUNT, ) - construction_time = 80 + construction_time = 8 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING ) @@ -1284,7 +1284,7 @@ /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/uranium =HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 40 + construction_time = 4 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING ) @@ -1299,7 +1299,7 @@ /datum/material/plasma =SHEET_MATERIAL_AMOUNT*2, /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING ) @@ -1314,7 +1314,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*7.5, /datum/material/diamond =SHEET_MATERIAL_AMOUNT*5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1329,7 +1329,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*7.5, /datum/material/bananium =HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1343,7 +1343,7 @@ /datum/material/iron =SHEET_MATERIAL_AMOUNT*7.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT*7.5, ) - construction_time = 80 + construction_time = 8 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1359,7 +1359,7 @@ /datum/material/plasma =SHEET_MATERIAL_AMOUNT*4, /datum/material/uranium =SHEET_MATERIAL_AMOUNT*4, ) - construction_time = 80 + construction_time = 8 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL ) @@ -1375,7 +1375,7 @@ /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/diamond =SHEET_MATERIAL_AMOUNT * 1.5, ) - construction_time = 80 + construction_time = 8 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL ) @@ -1391,7 +1391,7 @@ /datum/material/silver =SHEET_MATERIAL_AMOUNT*2, /datum/material/gold =SHEET_MATERIAL_AMOUNT * 1.5, ) - construction_time = 80 + construction_time = 8 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL ) @@ -1406,7 +1406,7 @@ /datum/material/glass =SHEET_MATERIAL_AMOUNT*2, /datum/material/silver =SHEET_MATERIAL_AMOUNT*2, ) - construction_time = 40 + construction_time = 4 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL ) @@ -1420,7 +1420,7 @@ /datum/material/gold =SHEET_MATERIAL_AMOUNT, /datum/material/uranium =HALF_SHEET_MATERIAL_AMOUNT, ) - construction_time = 40 + construction_time = 4 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR ) @@ -1434,7 +1434,7 @@ /datum/material/iron =SHEET_MATERIAL_AMOUNT, /datum/material/glass =SHEET_MATERIAL_AMOUNT, ) - construction_time = 40 + construction_time = 4 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR ) @@ -1448,7 +1448,7 @@ /datum/material/iron = SHEET_MATERIAL_AMOUNT*1.125, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT*0.75, ) - construction_time = 40 + construction_time = 4 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR ) @@ -1542,8 +1542,11 @@ id = "borg_upgrade_expand" build_type = MECHFAB build_path = /obj/item/borg/upgrade/expand - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*1, /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5) //bubberstation edit - 100 sheets of iron for one upgrade?? - construction_time = 120 + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT*1, // BUBBER EDIT - 100 -> 1 + /datum/material/titanium =SHEET_MATERIAL_AMOUNT * 2.5, + ) + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL ) @@ -1558,7 +1561,7 @@ /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/gold =SMALL_MATERIAL_AMOUNT * 2, ) - construction_time = 50 + construction_time = 5 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CONTROL_INTERFACES ) @@ -1573,7 +1576,7 @@ /datum/material/iron =SHEET_MATERIAL_AMOUNT*5, /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING ) @@ -1584,7 +1587,7 @@ build_type = MECHFAB build_path = /obj/item/borg/upgrade/inducer materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING ) @@ -1598,7 +1601,7 @@ /datum/material/iron =SHEET_MATERIAL_AMOUNT, /datum/material/titanium =SMALL_MATERIAL_AMOUNT*5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING ) @@ -1612,7 +1615,7 @@ /datum/material/iron =SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.125, ) //Need glass for the new beaker too - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL ) @@ -1626,7 +1629,7 @@ /datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL ) @@ -1640,7 +1643,7 @@ /datum/material/iron =SHEET_MATERIAL_AMOUNT*2, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, ) - construction_time = 120 + construction_time = 12 SECONDS category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR ) @@ -1654,7 +1657,7 @@ /datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, ) - construction_time = 75 + construction_time = 7.5 SECONDS build_path = /obj/item/mmi category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CONTROL_INTERFACES @@ -1679,7 +1682,7 @@ /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT*1.35, /datum/material/gold =SMALL_MATERIAL_AMOUNT*5 ) - construction_time = 75 + construction_time = 7.5 SECONDS build_path = /obj/item/mmi/posibrain category = list( RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CONTROL_INTERFACES @@ -1693,7 +1696,7 @@ build_type = MECHFAB build_path =/obj/item/mecha_parts/mecha_tracking materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5) - construction_time = 50 + construction_time = 5 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1715,7 +1718,7 @@ /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT * 2, ) - construction_time = 50 + construction_time = 5 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, @@ -1739,7 +1742,7 @@ /datum/material/plasma =SMALL_MATERIAL_AMOUNT * 2, /datum/material/titanium =SMALL_MATERIAL_AMOUNT * 2, ) - construction_time = 50 + construction_time = 5 SECONDS category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, @@ -1760,7 +1763,7 @@ /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 7.5, ) - construction_time = 100 + construction_time = 10 SECONDS build_path = /obj/item/assembly/flash/handheld category = list( RND_CATEGORY_MECHFAB_CYBORG diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 9f83ae957ee..0b09edf44ac 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -390,7 +390,7 @@ desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." id = "ci-breather" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 35 + construction_time = 3.5 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*2.5) build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube category = list( @@ -404,7 +404,7 @@ id = "ci-surgery" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) - construction_time =SMALL_MATERIAL_AMOUNT * 2 + construction_time = 2 SECONDS build_path = /obj/item/organ/internal/cyberimp/arm/surgery category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY @@ -417,7 +417,7 @@ id = "ci-toolset" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) - construction_time =SMALL_MATERIAL_AMOUNT * 2 + construction_time = 2 SECONDS build_path = /obj/item/organ/internal/cyberimp/arm/toolset category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY @@ -429,7 +429,7 @@ desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." id = "ci-medhud" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 50 + construction_time = 5 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -447,7 +447,7 @@ desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." id = "ci-sechud" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 50 + construction_time = 5 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -465,7 +465,7 @@ desc = "These cybernetic eyes will display a diagnostic HUD over everything you see. Wiggle eyes to control." id = "ci-diaghud" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 50 + construction_time = 5 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -483,7 +483,7 @@ desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 60 + construction_time = 6 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -510,7 +510,7 @@ desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." id = "ci-thermals" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 60 + construction_time = 6 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -535,7 +535,7 @@ desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." id = "ci-antidrop" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 60 + construction_time = 6 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -553,7 +553,7 @@ desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." id = "ci-antistun" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 60 + construction_time = 6 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -571,7 +571,7 @@ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." id = "ci-nutriment" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list( /datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, @@ -588,7 +588,7 @@ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." id = "ci-nutrimentplus" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 50 + construction_time = 5 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*6, @@ -606,7 +606,7 @@ desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!" id = "ci-reviver" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 60 + construction_time = 6 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*8, /datum/material/glass = SMALL_MATERIAL_AMOUNT*8, @@ -624,7 +624,7 @@ desc = "This implant will allow you to use gas from environment or your internals for propulsion in zero-gravity areas." id = "ci-thrusters" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 80 + construction_time = 8 SECONDS materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT*2, /datum/material/glass =SHEET_MATERIAL_AMOUNT, @@ -708,7 +708,7 @@ desc = "A basic cybernetic liver." id = "cybernetic_liver" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/organ/internal/liver/cybernetic category = list( @@ -731,7 +731,7 @@ name = "Upgraded Cybernetic Liver" desc = "An upgraded cybernetic liver." id = "cybernetic_liver_tier3" - construction_time = 50 + construction_time = 5 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/internal/liver/cybernetic/tier3 category = list( @@ -744,7 +744,7 @@ desc = "A basic cybernetic heart." id = "cybernetic_heart" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/organ/internal/heart/cybernetic category = list( @@ -767,7 +767,7 @@ name = "Upgraded Cybernetic Heart" desc = "An upgraded cybernetic heart." id = "cybernetic_heart_tier3" - construction_time = 50 + construction_time = 5 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/internal/heart/cybernetic/tier3 category = list( @@ -780,7 +780,7 @@ desc = "A basic pair of cybernetic lungs." id = "cybernetic_lungs" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/organ/internal/lungs/cybernetic category = list( @@ -803,7 +803,7 @@ name = "Upgraded Cybernetic Lungs" desc = "A pair of upgraded cybernetic lungs." id = "cybernetic_lungs_tier3" - construction_time = 50 + construction_time = 5 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/internal/lungs/cybernetic/tier3 category = list( @@ -816,7 +816,7 @@ desc = "A basic cybernetic stomach." id = "cybernetic_stomach" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) build_path = /obj/item/organ/internal/stomach/cybernetic category = list( @@ -839,7 +839,7 @@ name = "Upgraded Cybernetic Stomach" desc = "An upgraded cybernetic stomach." id = "cybernetic_stomach_tier3" - construction_time = 50 + construction_time = 5 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/internal/stomach/cybernetic/tier3 category = list( @@ -852,7 +852,7 @@ desc = "A Basic pair of cybernetic ears." id = "cybernetic_ears" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 30 + construction_time = 3 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) build_path = /obj/item/organ/internal/ears/cybernetic category = list( @@ -865,7 +865,7 @@ desc = "A pair of cybernetic ears." id = "cybernetic_ears_u" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, @@ -882,7 +882,7 @@ desc = "A pair of whisper-sensitive cybernetic ears." id = "cybernetic_ears_whisper" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, @@ -899,7 +899,7 @@ desc = "A pair of wall-penetrating cybernetic ears." id = "cybernetic_ears_xray" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list( /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, @@ -916,7 +916,7 @@ desc = "A basic pair of cybernetic eyes." id = "cybernetic_eyes" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 30 + construction_time = 3 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) build_path = /obj/item/organ/internal/eyes/robotic/basic category = list( @@ -949,7 +949,7 @@ desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." id = "ci-welding" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass = SMALL_MATERIAL_AMOUNT*4) build_path = /obj/item/organ/internal/eyes/robotic/shield category = list( @@ -967,7 +967,7 @@ desc = "A pair of cybernetic eyes that can emit multicolored light" id = "ci-gloweyes" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - construction_time = 40 + construction_time = 4 SECONDS materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*6, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/organ/internal/eyes/robotic/glow category = list( diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index 80844562eb4..3548d8ac38d 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -8,7 +8,7 @@ id = "basic_cell" build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE |MECHFAB materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass =SMALL_MATERIAL_AMOUNT * 0.5) - construction_time=100 + construction_time = 10 SECONDS build_path = /obj/item/stock_parts/cell/empty category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_1 @@ -21,7 +21,7 @@ id = "high_cell" build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE | MECHFAB materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.6) - construction_time=100 + construction_time = 10 SECONDS build_path = /obj/item/stock_parts/cell/high/empty category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_2 @@ -34,7 +34,7 @@ id = "super_cell" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7) - construction_time=100 + construction_time = 10 SECONDS build_path = /obj/item/stock_parts/cell/super/empty category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_3 @@ -47,7 +47,7 @@ id = "hyper_cell" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.8) - construction_time=100 + construction_time = 10 SECONDS build_path = /obj/item/stock_parts/cell/hyper/empty category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_3 @@ -60,7 +60,7 @@ id = "bluespace_cell" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 8, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 1.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.6, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 1.6, /datum/material/titanium =SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace =SMALL_MATERIAL_AMOUNT) - construction_time=100 + construction_time = 10 SECONDS build_path = /obj/item/stock_parts/cell/bluespace/empty category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_4 @@ -107,7 +107,7 @@ id = "turbine_part_compressor" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS build_path = /obj/item/turbine_parts/compressor category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE @@ -120,7 +120,7 @@ id = "turbine_part_rotor" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS build_path = /obj/item/turbine_parts/rotor category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE @@ -133,7 +133,7 @@ id = "turbine_part_stator" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5) - construction_time = 100 + construction_time = 10 SECONDS build_path = /obj/item/turbine_parts/stator category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 404a953595d..ce61208b322 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -26,7 +26,7 @@ density = TRUE use_power = IDLE_POWER_USE circuit = /obj/item/circuitboard/machine/experimentor - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE + interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON var/recentlyExperimented = 0 /// Weakref to the first ian we can find at init var/datum/weakref/tracked_ian_ref @@ -98,7 +98,6 @@ /obj/item/aicard, /obj/item/storage/backpack/holding, /obj/item/slime_extract, - /obj/item/onetankbomb, /obj/item/transfer_valve)) /obj/machinery/rnd/experimentor/RefreshParts() @@ -117,14 +116,6 @@ if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Malfunction probability reduced by [malfunction_probability_coeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.") -/obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) - //snowflake check to only take "made" bombs - if(istype(O, /obj/item/transfer_valve)) - var/obj/item/transfer_valve/T = O - if(!T.tank_one || !T.tank_two || !T.attached_device) - return FALSE - return TRUE - /obj/machinery/rnd/experimentor/attackby(obj/item/weapon, mob/living/user, params) if(user.combat_mode) return ..() @@ -142,117 +133,115 @@ ejectItem() return ..(O) -/obj/machinery/rnd/experimentor/ui_interact(mob/user) - var/list/dat = list("
") - if(loaded_item) - dat += "Loaded Item: [loaded_item]" +/obj/machinery/rnd/experimentor/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new (user, src, "Experimentator") + ui.open() - dat += "
Available tests:" - dat += "Poke" - dat += "Irradiate" - dat += "Gas" - dat += "Burn" - dat += "Freeze" - dat += "Destroy
" - if(istype(loaded_item,/obj/item/relic)) - dat += "Discover" - dat += "Eject" - var/list/listin = techweb_item_unlock_check(src) - if(listin) - var/list/output = list("Research Boost Data:") - var/list/res = list("Already researched:") - for(var/node_id in listin) - var/datum/techweb_node/N = SSresearch.techweb_node_by_id(node_id) - var/str = "[N.display_name]: [listin[N]] points." - var/datum/techweb/science_web = locate(/datum/techweb/science) in SSresearch.techwebs - if(science_web.researched_nodes[N.id]) - res += str - if(science_web.visible_nodes[N.id]) //JOY OF DISCOVERY! - output += str - output += res - dat += output - else - dat += "Nothing loaded." - dat += "Refresh" - dat += "Close
" - var/datum/browser/popup = new(user, "experimentor","Experimentor", 700, 400, src) - popup.set_content(dat.Join("
")) - popup.open() - onclose(user, "experimentor") +/obj/machinery/rnd/experimentor/ui_data(mob/user) + var/list/data = list() -/obj/machinery/rnd/experimentor/Topic(href, href_list) - if(..()) + data["hasItem"] = !!loaded_item + data["isOnCooldown"] = recentlyExperimented + data["isServerConnected"] = !!stored_research + + if(!isnull(loaded_item)) + var/list/item_data = list() + + item_data["name"] = loaded_item.name + item_data["icon"] = icon2base64(getFlatIcon(loaded_item, no_anim = TRUE)) + item_data["isRelic"] = istype(loaded_item, /obj/item/relic) + + item_data["associatedNodes"] = list() + var/list/unlockable_nodes = techweb_item_unlock_check(loaded_item) + for(var/node_id in unlockable_nodes) + var/datum/techweb_node/node = SSresearch.techweb_node_by_id(node_id) + + item_data["associatedNodes"] += list(list( + "name" = node.display_name, + "isUnlocked" = !(node_id in stored_research.hidden_nodes), + )) + + data["loadedItem"] = item_data + + return data + +/obj/machinery/rnd/experimentor/ui_act(action, list/params) + . = ..() + if(.) return - usr.set_machine(src) - var/scantype = href_list["function"] - var/obj/item/process = locate(href_list["item"]) in src + switch(action) + if("eject") + ejectItem() + return TRUE - if(href_list["close"]) - usr << browse(null, "window=experimentor") + if("experiment") + var/reaction = text2num(params["id"]) + if(isnull(reaction)) + return + + try_perform_experiment(reaction) + return TRUE + +/obj/machinery/rnd/experimentor/proc/ejectItem(delete = FALSE) + if(isnull(loaded_item)) return - else if(scantype == "eject") - ejectItem() - else if(scantype == "refresh") - updateUsrDialog() - else - if(recentlyExperimented) - to_chat(usr, span_warning("[src] has been used too recently!")) - else if(!loaded_item) - to_chat(usr, span_warning("[src] is not currently loaded!")) - else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item) - to_chat(usr, span_danger("Interface failure detected in [src]. Please try again.")) - else - var/dotype - if(text2num(scantype) == SCANTYPE_DISCOVER) - dotype = SCANTYPE_DISCOVER - else - dotype = matchReaction(process,scantype) - experiment(dotype,process) - use_power(750) - if(dotype != FAIL) - var/list/nodes = techweb_item_unlock_check(process) - var/picked = pick_weight(nodes) //This should work. - stored_research.unhide_node(SSresearch.techweb_node_by_id(picked)) - updateUsrDialog() -/obj/machinery/rnd/experimentor/proc/matchReaction(matching,reaction) - var/obj/item/D = matching - if(D) - var/list/item_reactions = item_reactions() - if(item_reactions.Find("[D.type]")) - var/tor = item_reactions["[D.type]"] - if(tor == text2num(reaction)) - return tor - else - return FAIL - else - return FAIL - else + if(delete) + QDEL_NULL(loaded_item) + return + + var/atom/drop_atom = get_step(src, EAST) || drop_location() + if(cloneMode) + visible_message(span_notice("A duplicate of \the [loaded_item] pops out!")) + new loaded_item.type(drop_atom) + cloneMode = FALSE + return + + loaded_item.forceMove(drop_atom) + loaded_item = null + +/obj/machinery/rnd/experimentor/proc/match_reaction(obj/item/matching, target_reaction) + PRIVATE_PROC(TRUE) + if(isnull(matching) || isnull(target_reaction)) return FAIL -/obj/machinery/rnd/experimentor/proc/ejectItem(delete=FALSE) - if(loaded_item) - if(cloneMode) - visible_message(span_notice("A duplicate [loaded_item] pops out!")) - var/type_to_make = loaded_item.type - new type_to_make(get_turf(pick(oview(1,src)))) - cloneMode = FALSE - return - var/turf/dropturf = get_turf(pick(view(1,src))) - if(!dropturf) //Failsafe to prevent the object being lost in the void forever. - dropturf = drop_location() - loaded_item.forceMove(dropturf) - if(delete) - qdel(loaded_item) - loaded_item = null + var/list/item_reactions = item_reactions() + if("[matching.type]" in item_reactions) + var/associated_reaction = item_reactions["[matching.type]"] + if(associated_reaction == target_reaction) + return associated_reaction + + return FAIL + +/obj/machinery/rnd/experimentor/proc/try_perform_experiment(reaction) + PRIVATE_PROC(TRUE) + if(isnull(stored_research)) + return + + if(recentlyExperimented) + return + + if(isnull(loaded_item)) + return + + if(reaction != SCANTYPE_DISCOVER) + reaction = match_reaction(loaded_item, reaction) + + if(reaction != FAIL) + var/picked_node_id = pick(techweb_item_unlock_check(loaded_item)) + stored_research.unhide_node(SSresearch.techweb_node_by_id(picked_node_id)) + + experiment(reaction, loaded_item) + use_power(750) /obj/machinery/rnd/experimentor/proc/throwSmoke(turf/where) var/datum/effect_system/fluid_spread/smoke/smoke = new smoke.set_up(0, holder = src, location = where) smoke.start() - /obj/machinery/rnd/experimentor/proc/experiment(exp,obj/item/exp_on) recentlyExperimented = 1 icon_state = "[base_icon_state]_wloop" diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 7a87763479f..dd282040ab0 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -10,7 +10,7 @@ /// The material storage used by this fabricator. var/datum/component/remote_materials/materials - /// Which departments forego the lathe tax when using this lathe. + /// Which departments are allowed to process this design var/allowed_department_flags = ALL /// What's flick()'d on print. @@ -156,7 +156,7 @@ return data -/obj/machinery/rnd/production/ui_act(action, list/params) +/obj/machinery/rnd/production/ui_act(action, list/params, datum/tgui/ui) . = ..() if(.) @@ -172,7 +172,7 @@ materials.eject_sheets(material, amount) if("build") - user_try_print_id(params["ref"], params["amount"]) + user_try_print_id(ui.user, params["ref"], params["amount"]) /// Updates the fabricator's efficiency coefficient based on the installed parts. /obj/machinery/rnd/production/proc/calculate_efficiency() @@ -193,19 +193,13 @@ efficiency_coeff = max(total_rating, 0) -/obj/machinery/rnd/production/proc/do_print(path, amount) - for(var/i in 1 to amount) - new path(get_turf(src)) - - SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) - /obj/machinery/rnd/production/proc/build_efficiency(path) if(ispath(path, /obj/item/stack/sheet) || ispath(path, /obj/item/stack/ore/bluespace_crystal)) return 1 else return efficiency_coeff -/obj/machinery/rnd/production/proc/user_try_print_id(design_id, print_quantity) +/obj/machinery/rnd/production/proc/user_try_print_id(mob/user, design_id, print_quantity) if(!design_id) return FALSE @@ -243,55 +237,83 @@ print_quantity = clamp(print_quantity, 1, 50) var/coefficient = build_efficiency(design.build_path) - //check if sufficient materials are available + // check if sufficient materials are available. if(!materials.mat_container.has_materials(design.materials, coefficient, print_quantity)) - say("Not enough materials to complete prototype[print_quantity > 1? "s" : ""].") + say("Not enough materials to complete prototype[print_quantity > 1 ? "s" : ""].") return FALSE //use power - var/power = active_power_usage + var/total_charge = 0 for(var/material in design.materials) - power += round(design.materials[material] * print_quantity / 35) - power = min(active_power_usage, power) - use_power(power) + total_charge += round(design.materials[material] * coefficient * print_quantity / 35) + var/charge_per_item = total_charge / print_quantity - // Charge the lathe tax at least once per ten items. - // var/total_cost = LATHE_TAX * max(round(print_quantity / 10), 1) // BUBBED EDIT - LATHE TAX CONFIG - // if(!charges_tax) - // total_cost = 0 - // if(isliving(usr)) - // var/mob/living/user = usr - // var/obj/item/card/id/card = user.get_idcard(TRUE) - - // if(!card && istype(user.pulling, /obj/item/card/id)) - // card = user.pulling - - // if(card && card.registered_account) - // var/datum/bank_account/our_acc = card.registered_account - // if(our_acc.account_job.departments_bitflags & allowed_department_flags) - // total_cost = 0 // We are not charging crew for printing their own supplies and equipment. - // if(attempt_charge(src, usr, total_cost) & COMPONENT_OBJ_CANCEL_CHARGE) - // say("Insufficient funds to complete prototype. Please present a holochip or valid ID card.") - // return FALSE - // if(iscyborg(usr)) - // var/mob/living/silicon/robot/borg = usr - // if(!borg.cell) - // return FALSE - // borg.cell.use(SILICON_LATHE_TAX) // BUBBED EDIT - LATHE TAX CONFIG - lathe_tax() // BUBBER EDIT ADDITION - LATHE TAX CONFIG - //consume materials - materials.use_materials(design.materials, coefficient, print_quantity, "built", "[design.name]") - //produce item - busy = TRUE if(production_animation) flick(production_animation, src) - var/time_coefficient = design.lathe_time_factor * efficiency_coeff - addtimer(CALLBACK(src, PROC_REF(reset_busy)), (30 * time_coefficient * print_quantity) ** 0.5) - addtimer(CALLBACK(src, PROC_REF(do_print), design.build_path, print_quantity), (32 * time_coefficient * print_quantity) ** 0.8) - update_static_data_for_all_viewers() + + var/total_time = (design.construction_time * design.lathe_time_factor * print_quantity) ** 0.8 + var/time_per_item = total_time / print_quantity + start_making(design, print_quantity, time_per_item, coefficient, charge_per_item) return TRUE +/// Begins the act of making the given design the given number of items +/// Does not check or use materials/power/etc +/obj/machinery/rnd/production/proc/start_making(datum/design/design, build_count, build_time_per_item, build_efficiency, charge_per_item) + PROTECTED_PROC(TRUE) + + busy = TRUE + update_static_data_for_all_viewers() + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, build_efficiency, build_time_per_item, charge_per_item, build_count), build_time_per_item) + +/// Callback for start_making, actually makes the item +/// Called using timers started by start_making +/obj/machinery/rnd/production/proc/do_make_item(datum/design/design, build_efficiency, time_per_item, charge_per_item, items_remaining) + PROTECTED_PROC(TRUE) + + if(!items_remaining) // how + finalize_build() + return + + if(!directly_use_power(charge_per_item)) + say("Unable to continue production, power failure.") + finalize_build() + return + + var/is_stack = ispath(design.build_path, /obj/item/stack) + var/list/design_materials = design.materials + if(!materials.mat_container.has_materials(design_materials, build_efficiency, is_stack ? items_remaining : 1)) + say("Unable to continue production, missing materials.") + return + materials.use_materials(design_materials, build_efficiency, is_stack ? items_remaining : 1, "built", "[design.name]") + + var/atom/movable/created + if(is_stack) + created = new design.build_path(get_turf(src), items_remaining) + else + created = new design.build_path(get_turf(src)) + split_materials_uniformly(design_materials, build_efficiency, created) + + created.pixel_x = created.base_pixel_x + rand(-6, 6) + created.pixel_y = created.base_pixel_y + rand(-6, 6) + + if(is_stack) + items_remaining = 0 + else + items_remaining -= 1 + + if(!items_remaining) + finalize_build() + return + addtimer(CALLBACK(src, PROC_REF(do_make_item), design, build_efficiency, time_per_item, items_remaining), time_per_item) + +/// Resets the busy flag +/// Called at the end of do_make_item's timer loop +/obj/machinery/rnd/production/proc/finalize_build() + PROTECTED_PROC(TRUE) + busy = FALSE + update_static_data_for_all_viewers() + // Stuff for the stripe on the department machines /obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 85a2cf44836..ff03b368291 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -85,9 +85,6 @@ update_appearance() return TRUE -/obj/machinery/atmospherics/components/binary/circulator/get_node_connects() - return list(REVERSE_DIR(dir), dir) // airs[2] is input which is facing dir, airs[1] is output which is facing the other side of dir - /obj/machinery/atmospherics/components/binary/tank_compressor/screwdriver_act(mob/living/user, obj/item/tool) if(active || inserted_tank) return FALSE diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index b12cca4b859..963e507c45b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1472,6 +1472,9 @@ "superresonator", "triggermod", "mining_scanner", + "brm", + "b_smelter", + "b_refinery", )//e a r l y g a m e) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 8d849c36569..0103ee40b91 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -36,7 +36,7 @@ Burning extracts: new_slime.visible_message(span_danger("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!")) new_slime.set_friendship(user, 20) //Gas, gas, gas new_slime.bodytemperature = T0C + 400 //We gonna step on the gas. - new_slime.set_nutrition(new_slime.get_hunger_nutrition()) //Tonight, we fight! + new_slime.set_nutrition(new_slime.hunger_nutrition) //Tonight, we fight! ..() /obj/item/slimecross/burning/orange @@ -183,12 +183,13 @@ Burning extracts: effect_desc = "Shatters all lights in the current room." /obj/item/slimecross/burning/pyrite/do_effect(mob/user) + var/area/user_area = get_area(user) + if(isnull(user_area.apc)) + user.visible_message(span_danger("[src] releases a colorful wave of energy, but nothing seems to happen.")) + return + + user_area.apc.break_lights() user.visible_message(span_danger("[src] releases a colorful wave of energy, which shatters the lights!")) - var/area/A = get_area(user.loc) - for(var/obj/machinery/light/L in A) //Shamelessly copied from the APC effect. - L.on = TRUE - L.break_light_tube() - stoplag() ..() /obj/item/slimecross/burning/red diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 84b184bf892..8890db9a890 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -53,13 +53,15 @@ Chilling extracts: effect_desc = "Injects everyone in the area with some regenerative jelly." /obj/item/slimecross/chilling/purple/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - if(A.outdoors) + var/area/user_area = get_area(user) + if(user_area.outdoors) to_chat(user, span_warning("[src] can't affect such a large area.")) return user.visible_message(span_notice("[src] shatters, and a healing aura fills the room briefly.")) - for(var/mob/living/carbon/C in A) - C.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) + for (var/list/zlevel_turfs as anything in user_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/mob/living/carbon/nearby in area_turf) + nearby.reagents?.add_reagent(/datum/reagent/medicine/regen_jelly,10) ..() /obj/item/slimecross/chilling/blue @@ -87,11 +89,14 @@ Chilling extracts: effect_desc = "Recharges the room's APC by 50%." /obj/item/slimecross/chilling/yellow/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - user.visible_message(span_notice("[src] shatters, and a the air suddenly feels charged for a moment.")) - for(var/obj/machinery/power/apc/C in A) - if(C.cell) - C.cell.charge = min(C.cell.charge + C.cell.maxcharge/2, C.cell.maxcharge) + var/area/user_area = get_area(user) + if(isnull(user_area.apc?.cell)) + user.visible_message(span_notice("[src] shatters, yet the air around you feels normal.")) + return + + var/obj/machinery/power/apc/area_apc = user_area.apc + area_apc.cell.charge = min(area_apc.cell.charge + area_apc.cell.maxcharge / 2, area_apc.cell.maxcharge) + user.visible_message(span_notice("[src] shatters, and the air suddenly feels charged for a moment.")) ..() /obj/item/slimecross/chilling/darkpurple @@ -104,7 +109,7 @@ Chilling extracts: to_chat(user, span_warning("[src] can't affect such a large area.")) return var/filtered = FALSE - for(var/turf/open/T in A) + for(var/turf/open/T in A.get_turfs_from_all_zlevels()) var/datum/gas_mixture/G = T.air if(istype(G)) G.assert_gas(/datum/gas/plasma) @@ -332,6 +337,8 @@ Chilling extracts: to_chat(user, span_warning("[src] can't affect such a large area.")) return user.visible_message(span_warning("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!")) - for(var/obj/machinery/door/airlock/door in area) - new /obj/effect/forcefield/slimewall/rainbow(door.loc) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/door/airlock/door in area_turf) + new /obj/effect/forcefield/slimewall/rainbow(door.loc) return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index eb49f5dc2c3..ad5750de9ff 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -53,7 +53,7 @@ Stabilized extracts: if (holder.has_status_effect(effectpath)) return holder.apply_status_effect(effectpath, src) - STOP_PROCESSING(SSobj,src) + return PROCESS_KILL //Colors and subtypes: /obj/item/slimecross/stabilized/grey diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index 3230f44dabb..08caca83854 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -652,7 +652,7 @@ /datum/reagent/drug/nicotine = -1) virus_suspectibility = 0 - resulting_atoms = list(/obj/item/queen_bee = 1) + resulting_atoms = list(/obj/item/queen_bee/bought = 1) /datum/micro_organism/cell_line/queen_bee/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) //we love job hazards vat.visible_message(span_warning("You hear angry buzzing coming from the inside of the vat!")) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 70be6275763..49f7bfa61f3 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -73,7 +73,7 @@ if(target_slime.stat) to_chat(user, span_warning("The slime is dead!")) return - if(!target_slime.is_adult) + if(target_slime.life_stage != SLIME_LIFE_STAGE_ADULT) to_chat(user, span_warning("The slime must be an adult to cross its core!")) return if(target_slime.crossbreed_modification && target_slime.crossbreed_modification != crossbreed_modification) @@ -804,22 +804,22 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potred" -/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M))//If target is not a slime. +/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/target, mob/user) + if(!isslime(target))//If target is not a slime. to_chat(user, span_warning("The steroid only works on baby slimes!")) return ..() - if(M.is_adult) //Can't steroidify adults + if(target.life_stage == SLIME_LIFE_STAGE_ADULT) //Can't steroidify adults to_chat(user, span_warning("Only baby slimes can use the steroid!")) return - if(M.stat) + if(target.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.cores >= 5) + if(target.cores >= 5) to_chat(user, span_warning("The slime already has the maximum amount of extract!")) return to_chat(user, span_notice("You feed the slime the steroid. It will now produce one more extract.")) - M.cores++ + target.cores++ qdel(src) /obj/item/slimepotion/enhancer @@ -1065,9 +1065,10 @@ /obj/item/areaeditor/blueprints/slime/edit_area() ..() - var/area/A = get_area(src) - for(var/turf/T in A) - T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) - A.area_flags |= XENOBIOLOGY_COMPATIBLE + var/area/area = get_area(src) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + area_turf.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + area_turf.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) + area.area_flags |= XENOBIOLOGY_COMPATIBLE qdel(src) diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 33bbdd76f29..7e0f8ec4341 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -180,21 +180,25 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) GLOBAL_VAR_INIT(emergency_access, FALSE) /proc/make_maint_all_access() - for(var/area/station/maintenance/A in GLOB.areas) - for(var/turf/in_area as anything in A.get_contained_turfs()) - for(var/obj/machinery/door/airlock/D in in_area) - D.emergency = TRUE - D.update_icon(ALL, 0) + for(var/area/station/maintenance/area in GLOB.areas) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/door/airlock/airlock in area_turf) + airlock.emergency = TRUE + airlock.update_icon(ALL, 0) + minor_announce("Access restrictions on maintenance and external airlocks have been lifted.", "Attention! Station-wide emergency declared!",1) GLOB.emergency_access = TRUE SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled")) /proc/revoke_maint_all_access() - for(var/area/station/maintenance/A in GLOB.areas) - for(var/turf/in_area as anything in A.get_contained_turfs()) - for(var/obj/machinery/door/airlock/D in in_area) - D.emergency = FALSE - D.update_icon(ALL, 0) + for(var/area/station/maintenance/area in GLOB.areas) + for (var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/door/airlock/airlock in area_turf) + airlock.emergency = FALSE + airlock.update_icon(ALL, 0) + minor_announce("Access restrictions in maintenance areas have been restored.", "Attention! Station-wide emergency rescinded:") GLOB.emergency_access = FALSE SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled")) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index ea1ba8ed052..272638ce404 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -36,12 +36,14 @@ areas = list() var/list/new_latejoin = list() - for(var/area/shuttle/arrival/A in GLOB.areas) - for(var/obj/structure/chair/C in A) - new_latejoin += C - if(!console) - console = locate(/obj/machinery/requests_console) in A - areas += A + for(var/area/shuttle/arrival/arrival_area in GLOB.areas) + for (var/list/zlevel_turfs as anything in arrival_area.get_zlevel_turf_lists()) + for(var/turf/arrival_turf as anything in zlevel_turfs) + for(var/obj/structure/chair/shuttle_chair in arrival_turf) + new_latejoin += shuttle_chair + if(isnull(console)) + console = locate() in arrival_turf + areas += arrival_area if(SSjob.latejoin_trackers.len) log_mapping("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.") diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 73de05a8f37..ff2da672213 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -88,6 +88,11 @@ if(!isliving(usr)) return + var/area/my_area = get_area(src) + if(!istype(my_area, /area/shuttle/escape)) + say("Error - Network connectivity: Console has lost connection to the shuttle.") + return + var/mob/living/user = usr . = FALSE @@ -206,6 +211,10 @@ if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) to_chat(user, span_warning("You need your hands free before you can manipulate [src].")) return + var/area/my_area = get_area(src) + if(!istype(my_area, /area/shuttle/escape)) + say("Error - Network connectivity: Console has lost connection to the shuttle.") + return if(!user?.mind?.get_hijack_speed()) to_chat(user, span_warning("You manage to open a user-mode shell on [src], and hundreds of lines of debugging output fly through your vision. It is probably best to leave this alone.")) return @@ -544,7 +553,6 @@ color_override = "orange", ) INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, poll_hearts)) - bolt_all_doors() //SKYRAT EDIT ADDITION SSmapping.mapvote() //If no map vote has been run yet, start one. if(!is_reserved_level(z)) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 03777cd2d5b..f8b460a783d 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -95,19 +95,19 @@ var/mob/camera/ai_eye/remote/shuttle_docker/the_eye = eyeobj the_eye.setDir(shuttle_port.dir) var/turf/origin = locate(shuttle_port.x + x_offset, shuttle_port.y + y_offset, shuttle_port.z) - for(var/V in shuttle_port.shuttle_areas) - var/area/A = V - for(var/turf/T in A) - if(T.z != origin.z) - continue - var/image/I = image('icons/effects/alphacolors.dmi', origin, "red") - var/x_off = T.x - origin.x - var/y_off = T.y - origin.y - I.loc = locate(origin.x + x_off, origin.y + y_off, origin.z) //we have to set this after creating the image because it might be null, and images created in nullspace are immutable. - I.layer = ABOVE_NORMAL_TURF_LAYER - SET_PLANE(I, ABOVE_GAME_PLANE, T) - I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - the_eye.placement_images[I] = list(x_off, y_off) + for(var/area/shuttle_area as anything in shuttle_port.shuttle_areas) + for (var/list/zlevel_turfs as anything in shuttle_area.get_zlevel_turf_lists()) + for(var/turf/shuttle_turf as anything in zlevel_turfs) + if(shuttle_turf.z != origin.z) + continue + var/image/I = image('icons/effects/alphacolors.dmi', origin, "red") + var/x_off = shuttle_turf.x - origin.x + var/y_off = shuttle_turf.y - origin.y + I.loc = locate(origin.x + x_off, origin.y + y_off, origin.z) //we have to set this after creating the image because it might be null, and images created in nullspace are immutable. + I.layer = ABOVE_NORMAL_TURF_LAYER + SET_PLANE(I, ABOVE_GAME_PLANE, shuttle_turf) + I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + the_eye.placement_images[I] = list(x_off, y_off) /obj/machinery/computer/camera_advanced/shuttle_docker/give_eye_control(mob/user) ..() @@ -186,7 +186,7 @@ if(current_user.client) current_user.client.images -= the_eye.placed_images - QDEL_LIST(the_eye.placed_images) + LAZYCLEARLIST(the_eye.placed_images) for(var/image/place_spots as anything in the_eye.placement_images) var/image/newI = image('icons/effects/alphacolors.dmi', the_eye.loc, "blue") @@ -303,8 +303,8 @@ /mob/camera/ai_eye/remote/shuttle_docker visible_icon = FALSE use_static = FALSE - var/list/placement_images = list() - var/list/placed_images = list() + var/list/image/placement_images = list() + var/list/image/placed_images = list() /mob/camera/ai_eye/remote/shuttle_docker/Initialize(mapload, obj/machinery/computer/camera_advanced/origin) src.origin = origin diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 8be7ee651fb..a55bee71eb3 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -516,13 +516,14 @@ var/min_y = -1 var/max_x = WORLDMAXX_CUTOFF var/max_y = WORLDMAXY_CUTOFF - for(var/area/area as anything in shuttle_areas) - for(var/turf/turf in area) - min_x = max(turf.x, min_x) - max_x = min(turf.x, max_x) - min_y = max(turf.y, min_y) - max_y = min(turf.y, max_y) - CHECK_TICK + for(var/area/shuttle_area as anything in shuttle_areas) + for (var/list/zlevel_turfs as anything in shuttle_area.get_zlevel_turf_lists()) + for(var/turf/turf as anything in zlevel_turfs) + min_x = max(turf.x, min_x) + max_x = min(turf.x, max_x) + min_y = max(turf.y, min_y) + max_y = min(turf.y, max_y) + CHECK_TICK if(min_x == -1 || max_x == WORLDMAXX_CUTOFF) CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index 7338d336bde..2c0b95239b6 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -5,7 +5,7 @@ icon_state = "beacon_active" base_icon_state = "beacon" density = TRUE - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /// Locked beacons cannot be jumped to by ships. var/locked = FALSE diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index b897bb76111..e5b8d5e87ff 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -79,7 +79,7 @@ var/obj/machinery/power/emitter/energycannon/magical/our_statue var/list/mob/living/sleepers = list() var/never_spoken = TRUE - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /obj/structure/table/abductor/wabbajack/Initialize(mapload) . = ..() @@ -90,17 +90,14 @@ . = ..() /obj/structure/table/abductor/wabbajack/process() - var/area = orange(4, src) - if(!our_statue) - for(var/obj/machinery/power/emitter/energycannon/magical/M in area) - our_statue = M - break + if(isnull(our_statue)) + our_statue = locate() in orange(4, src) - if(!our_statue) + if(isnull(our_statue)) name = "inert [initial(name)]" return - else - name = initial(name) + + name = initial(name) var/turf/T = get_turf(src) var/list/found = list() @@ -201,7 +198,7 @@ /obj/structure/table/wood/shuttle_bar resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION max_integrity = 1000 var/boot_dir = 1 diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 9680f829411..8985cefe449 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -59,22 +59,23 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( return ..() /obj/docking_port/mobile/supply/proc/check_blacklist(areaInstances) - for(var/place in areaInstances) - var/area/shuttle/shuttle_area = place - for(var/turf/shuttle_turf in shuttle_area.get_contained_turfs()) - for(var/atom/passenger in shuttle_turf.get_all_contents()) - if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) - return FALSE + for(var/area/shuttle_area as anything in areaInstances) + for (var/list/zlevel_turfs as anything in shuttle_area.get_zlevel_turf_lists()) + for(var/turf/shuttle_turf as anything in zlevel_turfs) + for(var/atom/passenger in shuttle_turf.get_all_contents()) + if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) + return FALSE return TRUE /// Returns anything on the cargo blacklist found within areas_to_check back to the turf of the home docking port via Centcom branded supply pod. /obj/docking_port/mobile/supply/proc/return_blacklisted_things_home(list/area/areas_to_check, obj/docking_port/stationary/home) var/list/stuff_to_send_home = list() for(var/area/shuttle_area as anything in areas_to_check) - for(var/turf/shuttle_turf in shuttle_area.get_contained_turfs()) - for(var/atom/passenger in shuttle_turf.get_all_contents()) - if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) - stuff_to_send_home += passenger + for (var/list/zlevel_turfs as anything in shuttle_area.get_zlevel_turf_lists()) + for(var/turf/shuttle_turf as anything in zlevel_turfs) + for(var/atom/passenger in shuttle_turf.get_all_contents()) + if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) + stuff_to_send_home += passenger if(!length(stuff_to_send_home)) return FALSE @@ -135,7 +136,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( var/list/empty_turfs = list() for(var/area/shuttle/shuttle_area as anything in shuttle_areas) - for(var/turf/open/floor/shuttle_turf in shuttle_area) + for(var/turf/open/floor/shuttle_turf in shuttle_area.get_turfs_from_all_zlevels()) if(shuttle_turf.is_blocked_turf()) continue empty_turfs += shuttle_turf @@ -283,12 +284,14 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( var/datum/export_report/report = new for(var/area/shuttle/shuttle_area as anything in shuttle_areas) - for(var/atom/movable/exporting_atom in shuttle_area) - if(iscameramob(exporting_atom)) - continue - if(exporting_atom.anchored) - continue - export_item_and_contents(exporting_atom, apply_elastic = TRUE, dry_run = FALSE, external_report = report) + for (var/list/zlevel_turfs as anything in shuttle_area.get_zlevel_turf_lists()) + for(var/turf/shuttle_turf as anything in zlevel_turfs) + for(var/atom/movable/exporting_atom in shuttle_turf) + if(iscameramob(exporting_atom)) + continue + if(exporting_atom.anchored) + continue + export_item_and_contents(exporting_atom, apply_elastic = TRUE, dry_run = FALSE, external_report = report) if(report.exported_atoms) report.exported_atoms += "." //ugh @@ -316,9 +319,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( //spawn crate var/list/empty_turfs = list() - for(var/place as anything in shuttle_areas) - var/area/shuttle/shuttle_area = place - for(var/turf/open/floor/shuttle_floor in shuttle_area) + for(var/area/shuttle/shuttle_area as anything in shuttle_areas) + for(var/turf/open/floor/shuttle_floor in shuttle_area.get_turfs_from_all_zlevels()) if(shuttle_floor.is_blocked_turf()) continue empty_turfs += shuttle_floor diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 4c59d9848fc..f08446b650d 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -11,7 +11,7 @@ shuttleId = "syndicate" possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /obj/machinery/computer/shuttle/syndicate/launch_check(mob/user) . = ..() diff --git a/code/modules/spells/spell_types/self/stop_time.dm b/code/modules/spells/spell_types/self/stop_time.dm index cab47375eb3..d3e937972fd 100644 --- a/code/modules/spells/spell_types/self/stop_time.dm +++ b/code/modules/spells/spell_types/self/stop_time.dm @@ -16,9 +16,14 @@ /// The duration of the time stop. var/timestop_duration = 10 SECONDS + /// if TRUE, the owner is immune to all time stop, from anyone + var/owner_is_immune_to_all_timestop = TRUE + /// if TRUE, the owner is immune to their own timestop (but not other people's, if above is FALSE) + var/owner_is_immune_to_self_timestop = TRUE + /datum/action/cooldown/spell/timestop/Grant(mob/grant_to) . = ..() - if(owner) + if(!isnull(owner) && owner_is_immune_to_all_timestop) ADD_TRAIT(owner, TRAIT_TIME_STOP_IMMUNE, REF(src)) /datum/action/cooldown/spell/timestop/Remove(mob/remove_from) @@ -27,4 +32,17 @@ /datum/action/cooldown/spell/timestop/cast(atom/cast_on) . = ..() - new /obj/effect/timestop/magic(get_turf(cast_on), timestop_range, timestop_duration, list(cast_on)) + var/list/default_immune_atoms = list() + if(owner_is_immune_to_self_timestop) + default_immune_atoms += cast_on + new /obj/effect/timestop/magic(get_turf(cast_on), timestop_range, timestop_duration, default_immune_atoms) + +/datum/action/cooldown/spell/timestop/vv_edit_var(var_name, var_value) + . = ..() + if(var_name != NAMEOF(src, owner_is_immune_to_all_timestop) || isnull(owner)) + return + + if(var_value) + ADD_TRAIT(owner, TRAIT_TIME_STOP_IMMUNE, REF(src)) + else + REMOVE_TRAIT(owner, TRAIT_TIME_STOP_IMMUNE, REF(src)) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 9e5de07ab7d..40a8a99ac57 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -249,12 +249,12 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) ) if(!blocker) - message_admins("[ADMIN_LOOKUPFLW(user)] has launched an artillery strike targeting [ADMIN_VERBOSEJMP(bullseye)].") - user.log_message("has launched an artillery strike targeting [AREACOORD(bullseye)].", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] has launched a bluespace artillery strike targeting [ADMIN_VERBOSEJMP(bullseye)].") + user.log_message("has launched a bluespace artillery strike targeting [AREACOORD(bullseye)].", LOG_GAME) explosion(bullseye, devastation_range = ex_power, heavy_impact_range = ex_power*2, light_impact_range = ex_power*4, explosion_cause = src) else - message_admins("[ADMIN_LOOKUPFLW(user)] has launched an artillery strike targeting [ADMIN_VERBOSEJMP(bullseye)] but it was blocked by [blocker] at [ADMIN_VERBOSEJMP(target)].") - user.log_message("has launched an artillery strike targeting [AREACOORD(bullseye)] but it was blocked by [blocker] at [AREACOORD(target)].", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] has launched a bluespace artillery strike targeting [ADMIN_VERBOSEJMP(bullseye)] but it was blocked by [blocker] at [ADMIN_VERBOSEJMP(target)].") + user.log_message("has launched a bluespace artillery strike targeting [AREACOORD(bullseye)] but it was blocked by [blocker] at [AREACOORD(target)].", LOG_GAME) /obj/machinery/bsa/full/proc/reload() @@ -344,7 +344,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(isnull(options[victim])) return target = options[victim] - log_game("[key_name(user)] has aimed the artillery strike at [target].") + log_game("[key_name(user)] has aimed the bluespace artillery strike at [target].") /obj/machinery/computer/bsa_control/proc/get_target_name() diff --git a/code/modules/station_goals/meteor_shield.dm b/code/modules/station_goals/meteor_shield.dm index 7b16606013b..3b87ef74578 100644 --- a/code/modules/station_goals/meteor_shield.dm +++ b/code/modules/station_goals/meteor_shield.dm @@ -89,7 +89,7 @@ /obj/machinery/satellite/meteor_shield/process() if(obj_flags & EMAGGED) //kills the processing because emagged meteor shields no longer stop meteors in any way - return ..() + return PROCESS_KILL if(!active) return for(var/obj/effect/meteor/meteor_to_destroy in GLOB.meteor_list) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index d47bdec35d1..1c73cabf52f 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -17,6 +17,8 @@ VAR_PROTECTED/icon_invisible = 'icons/mob/human/bodyparts.dmi' ///The type of husk for building an iconstate var/husk_type = "humanoid" + ///The color to multiply the greyscaled husk sprites by. Can be null. Old husk sprite chest color is #A6A6A6 + var/husk_color = "#A6A6A6" layer = BELOW_MOB_LAYER //so it isn't hidden behind objects when on the floor grind_results = list(/datum/reagent/bone_dust = 10, /datum/reagent/consumable/liquidgibs = 5) // robotic bodyparts and chests/heads cannot be ground /// The mob that "owns" this limb @@ -1016,16 +1018,6 @@ var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) var/image/aux - // Handles making bodyparts look husked - if(is_husked) - limb.icon = icon_husk - limb.icon_state = "[husk_type]_husk_[body_zone]" - icon_exists(limb.icon, limb.icon_state, scream = TRUE) //Prints a stack trace on the first failure of a given iconstate. - . += limb - if(aux_zone) //Hand shit - aux = image(limb.icon, "[husk_type]_husk_[aux_zone]", -aux_layer, image_dir) - . += aux - // Handles invisibility (not alpha or actual invisibility but invisibility) if(is_invisible) limb.icon = icon_invisible @@ -1034,42 +1026,43 @@ return . // Normal non-husk handling - if(!is_husked) // This is the MEAT of limb icon code - limb.icon = icon_greyscale - if(!should_draw_greyscale || !icon_greyscale) - limb.icon = icon_static + limb.icon = icon_greyscale + if(!should_draw_greyscale || !icon_greyscale) + limb.icon = icon_static - if(is_dimorphic) //Does this type of limb have sexual dimorphism? - limb.icon_state = "[limb_id]_[body_zone]_[limb_gender]" - else - limb.icon_state = "[limb_id]_[body_zone]" + if(is_dimorphic) //Does this type of limb have sexual dimorphism? + limb.icon_state = "[limb_id]_[body_zone]_[limb_gender]" + else + limb.icon_state = "[limb_id]_[body_zone]" - icon_exists(limb.icon, limb.icon_state, TRUE) //Prints a stack trace on the first failure of a given iconstate. + icon_exists(limb.icon, limb.icon_state, TRUE) //Prints a stack trace on the first failure of a given iconstate. - . += limb + . += limb - if(aux_zone) //Hand shit - aux = image(limb.icon, "[limb_id]_[aux_zone]", -aux_layer, image_dir) - . += aux + if(aux_zone) //Hand shit + aux = image(limb.icon, "[limb_id]_[aux_zone]", -aux_layer, image_dir) + . += aux + draw_color = variable_color + if(should_draw_greyscale) //Should the limb be colored outside of a forced color? + draw_color ||= (species_color) || (skin_tone && skintone2hex(skin_tone)) - draw_color = variable_color - if(should_draw_greyscale) //Should the limb be colored outside of a forced color? - draw_color ||= (species_color) || (skin_tone && skintone2hex(skin_tone)) - - if(draw_color) - //SKYRAT EDIT BEGIN - Alpha values on limbs //We check if the limb is attached and if the owner has an alpha value to append - var/limb_color = alpha != 255 ? "[draw_color][num2hex(alpha, 2)]" : "[draw_color]" - - limb.color = limb_color - if(aux_zone) - aux.color = limb_color - //SKYRAT EDIT END + if(is_husked) + huskify_image(thing_to_husk = limb) + if(aux) + huskify_image(thing_to_husk = aux) + draw_color = husk_color + if(draw_color) + var/limb_color = alpha != 255 ? "[draw_color][num2hex(alpha, 2)]" : "[draw_color]" // SKYRAT EDIT ADDITION - Alpha values on limbs. We check if the limb is attached and if the owner has an alpha value to append + limb.color = limb_color // SKYRAT EDIT CHANGE - ORIGINAL: limb.color = "[draw_color]" + if(aux_zone) + aux.color = limb_color // SKYRAT EDIT CHANGE - ORIGINAL: aux.color = "[draw_color]" //EMISSIVE CODE START // For some reason this was applied as an overlay on the aux image and limb image before. // I am very sure that this is unnecessary, and i need to treat it as part of the return list // to be able to mask it proper in case this limb is a leg. + if(!is_husked) if(blocks_emissive != EMISSIVE_BLOCK_NONE) var/atom/location = loc || owner || src var/mutable_appearance/limb_em_block = emissive_blocker(limb.icon, limb.icon_state, location, layer = limb.layer, alpha = limb.alpha) @@ -1162,6 +1155,17 @@ return . +/obj/item/bodypart/proc/huskify_image(image/thing_to_husk, draw_blood = TRUE) + var/icon/husk_icon = new(thing_to_husk.icon) + husk_icon.ColorTone(HUSK_COLOR_TONE) + thing_to_husk.icon = husk_icon + if(draw_blood) + var/mutable_appearance/husk_blood = mutable_appearance(icon_husk, "[husk_type]_husk_[body_zone]") + husk_blood.blend_mode = BLEND_INSET_OVERLAY + husk_blood.appearance_flags |= RESET_COLOR + husk_blood.dir = thing_to_husk.dir + thing_to_husk.add_overlay(husk_blood) + ///Add a bodypart overlay and call the appropriate update procs /obj/item/bodypart/proc/add_bodypart_overlay(datum/bodypart_overlay/overlay) bodypart_overlays += overlay diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 8595a62b802..1d308ad52ed 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -26,7 +26,7 @@ if (wounding_type) LAZYSET(limb_owner.body_zone_dismembered_by, body_zone, wounding_type) - drop_limb() + drop_limb(dismembered = TRUE) limb_owner.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment var/turf/owner_location = limb_owner.loc @@ -193,38 +193,6 @@ var/datum/wound/loss/dismembering = new return dismembering.apply_dismember(src, wounding_type) -/obj/item/organ/internal/eyes/on_bodypart_insert(obj/item/bodypart/head/head) - head.eyes = src - ..() - -/obj/item/organ/internal/ears/on_bodypart_insert(obj/item/bodypart/head/head) - head.ears = src - ..() - -/obj/item/organ/internal/tongue/on_bodypart_insert(obj/item/bodypart/head/head) - head.tongue = src - ..() - -/obj/item/organ/internal/brain/on_bodypart_insert(obj/item/bodypart/head/head) - head.brain = src - ..() - -/obj/item/organ/internal/eyes/on_bodypart_remove(obj/item/bodypart/head/head) - head.eyes = null - ..() - -/obj/item/organ/internal/ears/on_bodypart_remove(obj/item/bodypart/head/head) - head.ears = null - ..() - -/obj/item/organ/internal/tongue/on_bodypart_remove(obj/item/bodypart/head/head) - head.tongue = null - ..() - -/obj/item/organ/internal/brain/on_bodypart_remove(obj/item/bodypart/head/head) - head.brain = null - ..() - /obj/item/bodypart/chest/drop_limb(special, dismembered, move_to_floor = TRUE) if(special) return ..() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 097f9d5e216..a606c70f510 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -26,11 +26,6 @@ unarmed_effectiveness = 0 bodypart_trait_source = HEAD_TRAIT - var/obj/item/organ/internal/brain/brain //The brain organ - var/obj/item/organ/internal/eyes/eyes - var/obj/item/organ/internal/ears/ears - var/obj/item/organ/internal/tongue/tongue - /// Do we show the information about missing organs upon being examined? Defaults to TRUE, useful for Dullahan heads. var/show_organs_on_examine = TRUE @@ -75,11 +70,6 @@ ///Current lipstick trait, if any (such as TRAIT_KISS_OF_DEATH) var/stored_lipstick_trait - /// Draw this head as "debrained" - VAR_PROTECTED/show_debrained = FALSE - /// Draw this head as missing eyes - VAR_PROTECTED/show_eyeless = FALSE - /// Offset to apply to equipment worn on the ears var/datum/worn_feature_offset/worn_ears_offset /// Offset to apply to equipment worn on the eyes @@ -91,6 +81,16 @@ /// Offset to apply to overlays placed on the face var/datum/worn_feature_offset/worn_face_offset + VAR_PROTECTED + /// Draw this head as "debrained" + show_debrained = FALSE + + /// Draw this head as missing eyes + show_eyeless = FALSE + + /// Can this head be dismembered normally? + can_dismember = FALSE + /obj/item/bodypart/head/Destroy() QDEL_NULL(worn_ears_offset) QDEL_NULL(worn_glasses_offset) @@ -99,22 +99,10 @@ QDEL_NULL(worn_face_offset) return ..() -/obj/item/bodypart/head/Exited(atom/movable/gone, direction) - if(gone == brain) - brain = null - update_icon_dropped() - if(gone == eyes) - eyes = null - update_icon_dropped() - if(gone == ears) - ears = null - if(gone == tongue) - tongue = null - return ..() - /obj/item/bodypart/head/examine(mob/user) . = ..() if(show_organs_on_examine && IS_ORGANIC_LIMB(src)) + var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in src if(!brain) . += span_info("The brain has been removed from [src].") else if(brain.suicided || (brain.brainmob && HAS_TRAIT(brain.brainmob, TRAIT_SUICIDED))) @@ -131,23 +119,28 @@ else . += span_info("It's completely lifeless.") - if(!eyes) + if(!(locate(/obj/item/organ/internal/eyes) in src)) . += span_info("[real_name]'s eyes have been removed.") - if(!ears) + if(!(locate(/obj/item/organ/internal/ears) in src)) . += span_info("[real_name]'s ears have been removed.") - if(!tongue) + if(!(locate(/obj/item/organ/internal/tongue) in src)) . += span_info("[real_name]'s tongue has been removed.") /obj/item/bodypart/head/can_dismember(obj/item/item) + if (!can_dismember) + return FALSE + if(owner.stat < HARD_CRIT) return FALSE + return ..() /obj/item/bodypart/head/drop_organs(mob/user, violent_removal) if(user) user.visible_message(span_warning("[user] saws [src] open and pulls out a brain!"), span_notice("You saw [src] open and pull out a brain.")) + var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in src if(brain && violent_removal && prob(90)) //ghetto surgery can damage the brain. to_chat(user, span_warning("[brain] was damaged in the process!")) brain.set_organ_damage(brain.maxHealth) @@ -172,6 +165,7 @@ . += get_hair_and_lips_icon(dropped) // We need to get the eyes if we are dropped (ugh) if(dropped) + var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in src // This is a bit of copy/paste code from eyes.dm:generate_body_overlay if(eyes?.eye_icon_state && (head_flags & HEAD_EYESPRITES)) var/image/eye_left = image('icons/mob/human/human_face.dmi', "[eyes.eye_icon_state]_l", -BODY_LAYER, SOUTH) diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index 12093f71408..fbe219ba01f 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -49,12 +49,12 @@ else show_eyeless = FALSE else - if(!hair_hidden && !brain) + if(!hair_hidden && !(locate(/obj/item/organ/internal/brain) in src)) show_debrained = TRUE else show_debrained = FALSE - if(!eyes) + if(!(locate(/obj/item/organ/internal/eyes) in src)) show_eyeless = TRUE else show_eyeless = FALSE diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index c657e89cefd..2031ea4c723 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -227,7 +227,7 @@ if(bodypart_disabled) owner.set_usable_hands(owner.usable_hands - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) else if(!bodypart_disabled) @@ -324,7 +324,7 @@ if(bodypart_disabled) owner.set_usable_hands(owner.usable_hands - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) else if(!bodypart_disabled) @@ -443,7 +443,7 @@ if(bodypart_disabled) owner.set_usable_legs(owner.usable_legs - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) @@ -532,7 +532,7 @@ if(bodypart_disabled) owner.set_usable_legs(owner.usable_legs - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index e1521cad3e5..7e415f61cda 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -183,6 +183,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN + can_dismember = TRUE /obj/item/bodypart/chest/zombie limb_id = SPECIES_ZOMBIE diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index deaa734dd64..1fc16c7ca8f 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -75,7 +75,7 @@ injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) var/list/series_wounding_mods = check_series_wounding_mods() - if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100)) + if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100) && can_dismember()) var/datum/wound/loss/dismembering = new dismembering.apply_dismember(src, woundtype, outright = TRUE, attack_direction = attack_direction) return @@ -123,10 +123,13 @@ possible_wounds -= other_path continue - while (length(possible_wounds)) + while (TRUE) var/datum/wound/possible_wound = pick_weight(possible_wounds) - var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] + if (isnull(possible_wound)) + break + possible_wounds -= possible_wound + var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] var/datum/wound/replaced_wound for(var/datum/wound/existing_wound as anything in wounds) diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index 48114fe6d04..cac9051ceb4 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -153,15 +153,18 @@ var/obj/item/stack/used_stack = tool used_stack.use(1) +#define IMPLEMENTS_THAT_FIX_BONES list( \ + /obj/item/stack/medical/bone_gel = 100, \ + /obj/item/stack/sticky_tape/surgical = 100, \ + /obj/item/stack/sticky_tape/super = 50, \ + /obj/item/stack/sticky_tape = 30, \ +) + ///// Repair Compound Fracture (Crticial) /datum/surgery_step/repair_bone_compound name = "repair compound fracture (bone gel/tape)" - implements = list( - /obj/item/stack/medical/bone_gel = 100, - /obj/item/stack/sticky_tape/surgical = 100, - /obj/item/stack/sticky_tape/super = 50, - /obj/item/stack/sticky_tape = 30) + implements = IMPLEMENTS_THAT_FIX_BONES time = 40 /datum/surgery_step/repair_bone_compound/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -200,3 +203,87 @@ if(isstack(tool)) var/obj/item/stack/used_stack = tool used_stack.use(1) + +/// Surgery to repair cranial fissures +/datum/surgery/cranial_reconstruction + name = "Cranial reconstruction" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + targetable_wound = /datum/wound/cranial_fissure + possible_locs = list( + BODY_ZONE_HEAD, + ) + steps = list( + /datum/surgery_step/clamp_bleeders/discard_skull_debris, + /datum/surgery_step/repair_skull + ) + +/datum/surgery/cranial_reconstruction/can_start(mob/living/user, mob/living/carbon/target) + . = ..() + if(!.) + return FALSE + + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + return !isnull(targeted_bodypart.get_wound_type(targetable_wound)) + +/datum/surgery_step/clamp_bleeders/discard_skull_debris + name = "discard skull debris (hemostat)" + implements = list( + TOOL_HEMOSTAT = 100, + TOOL_WIRECUTTER = 40, + TOOL_SCREWDRIVER = 40, + ) + time = 2.4 SECONDS + preop_sound = 'sound/surgery/hemostat1.ogg' + +/datum/surgery_step/clamp_bleeders/discard_skull_debris/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to discard the smaller skull debris in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to discard the smaller skull debris in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to poke around in [target]'s [parse_zone(target_zone)]..."), + ) + + display_pain(target, "Your brain feels like it's getting stabbed by little shards of glass!") + +/datum/surgery_step/repair_skull + name = "repair skull (bone gel/tape)" + implements = IMPLEMENTS_THAT_FIX_BONES + time = 4 SECONDS + +/datum/surgery_step/repair_skull/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + ASSERT(surgery.operated_wound, "Repairing skull without a wound") + + display_results( + user, + target, + span_notice("You begin to repair [target]'s skull as best you can..."), + span_notice("[user] begins to repair [target]'s skull with [tool]."), + span_notice("[user] begins to repair [target]'s skull."), + ) + + display_pain(target, "You can feel pieces of your skull rubbing against your brain!") + +/datum/surgery_step/repair_skull/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if (isnull(surgery.operated_wound)) + to_chat(user, span_warning("[target]'s skull is fine!")) + return ..() + + + if (isstack(tool)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + + display_results( + user, + target, + span_notice("You successfully repair [target]'s skull."), + span_notice("[user] successfully repairs [target]'s skull with [tool]."), + span_notice("[user] successfully repairs [target]'s skull.") + ) + + qdel(surgery.operated_wound) + + return ..() + +#undef IMPLEMENTS_THAT_FIX_BONES diff --git a/code/modules/surgery/organs/internal/_internal_organ.dm b/code/modules/surgery/organs/internal/_internal_organ.dm index 173c2f4c9f5..9f67fb3d899 100644 --- a/code/modules/surgery/organs/internal/_internal_organ.dm +++ b/code/modules/surgery/organs/internal/_internal_organ.dm @@ -34,13 +34,12 @@ if(owner) if(owner.bodytemperature > T0C) var/air_temperature_factor = min((owner.bodytemperature - T0C) / 20, 1) - return -apply_organ_damage(decay_factor * maxHealth * seconds_per_tick * air_temperature_factor) + apply_organ_damage(decay_factor * maxHealth * seconds_per_tick * air_temperature_factor) else var/datum/gas_mixture/exposed_air = return_air() if(exposed_air && exposed_air.temperature > T0C) var/air_temperature_factor = min((exposed_air.temperature - T0C) / 20, 1) - return -apply_organ_damage(decay_factor * maxHealth * seconds_per_tick * air_temperature_factor) - + apply_organ_damage(decay_factor * maxHealth * seconds_per_tick * air_temperature_factor) /// Called once every life tick on every organ in a carbon's body /// NOTE: THIS IS VERY HOT. Be careful what you put in here diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 463e34977ee..a2eeb4eac32 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -78,19 +78,32 @@ /obj/item/organ/internal/cyberimp/arm/on_mob_insert(mob/living/carbon/arm_owner) . = ..() - var/side = zone == BODY_ZONE_R_ARM? RIGHT_HANDS : LEFT_HANDS - hand = arm_owner.hand_bodyparts[side] - if(hand) - RegisterSignal(hand, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_item_attack_self)) //If the limb gets an attack-self, open the menu. Only happens when hand is empty - RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible. + RegisterSignal(arm_owner, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_limb_attached)) + RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible. + on_limb_attached(arm_owner, arm_owner.hand_bodyparts[zone == BODY_ZONE_R_ARM ? RIGHT_HANDS : LEFT_HANDS]) /obj/item/organ/internal/cyberimp/arm/on_mob_remove(mob/living/carbon/arm_owner) . = ..() Retract() + UnregisterSignal(arm_owner, list(COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_KB_MOB_DROPITEM_DOWN)) + on_limb_detached(hand) + +/obj/item/organ/internal/cyberimp/arm/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + if(!limb || QDELETED(limb) || limb.body_zone != zone) + return if(hand) - UnregisterSignal(hand, COMSIG_ITEM_ATTACK_SELF) - UnregisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN) - hand = null + on_limb_detached(hand) + RegisterSignal(limb, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_item_attack_self)) + RegisterSignal(limb, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_detached)) + hand = limb + +/obj/item/organ/internal/cyberimp/arm/proc/on_limb_detached(obj/item/bodypart/source) + SIGNAL_HANDLER + if(source != hand || QDELETED(hand)) + return + UnregisterSignal(hand, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_BODYPART_REMOVED)) + hand = null /obj/item/organ/internal/cyberimp/arm/proc/on_item_attack_self() SIGNAL_HANDLER diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index f21e67552a3..04dd9a32a39 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -310,7 +310,7 @@ /datum/action/cooldown/golem_ore_sight/Activate(atom/target) . = ..() - mineral_scan_pulse(get_turf(target)) + mineral_scan_pulse(get_turf(target), scanner = target) ///Robotic diff --git a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm index 50659115872..bd30318a722 100644 --- a/code/modules/surgery/organs/internal/heart/heart_ethereal.dm +++ b/code/modules/surgery/organs/internal/heart/heart_ethereal.dm @@ -88,12 +88,12 @@ crystalize_timer_id = addtimer(CALLBACK(src, PROC_REF(crystalize), victim), CRYSTALIZE_PRE_WAIT_TIME, TIMER_STOPPABLE) - RegisterSignal(victim, COMSIG_HUMAN_DISARM_HIT, PROC_REF(reset_crystalizing)) + RegisterSignal(victim, COMSIG_LIVING_DISARM_HIT, PROC_REF(reset_crystalizing)) RegisterSignal(victim, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine), override = TRUE) RegisterSignal(victim, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) ///Ran when disarmed, prevents the ethereal from reviving -/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone) +/obj/item/organ/internal/heart/ethereal/proc/reset_crystalizing(mob/living/defender, mob/living/attacker, zone, obj/item/weapon) SIGNAL_HANDLER defender.visible_message( span_notice("The crystals on [defender] are gently broken off."), @@ -120,7 +120,7 @@ ///Stop the crystalization process, unregistering any signals and resetting any variables. /obj/item/organ/internal/heart/ethereal/proc/stop_crystalization_process(mob/living/ethereal, succesful = FALSE) - UnregisterSignal(ethereal, COMSIG_HUMAN_DISARM_HIT) + UnregisterSignal(ethereal, COMSIG_LIVING_DISARM_HIT) UnregisterSignal(ethereal, COMSIG_ATOM_EXAMINE) UnregisterSignal(ethereal, COMSIG_MOB_APPLY_DAMAGE) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 6bcc61ca050..b7dc8353920 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -326,7 +326,7 @@ return // the statue ended up getting destroyed while in nullspace? var/mob/living/carbon/carbon_owner = owner - RegisterSignal(carbon_owner, COMSIG_MOVABLE_MOVED) + UnregisterSignal(carbon_owner, COMSIG_MOVABLE_MOVED) to_chat(carbon_owner, span_userdanger("Your existence as a living creature snaps as your statue form crumbles!")) carbon_owner.forceMove(get_turf(statue)) @@ -566,7 +566,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) taste_sensitivity = 25 // not as good as an organic tongue voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" -/obj/item/organ/internal/tongue/robot/can_speak_language(language) +/obj/item/organ/internal/tongue/robot/could_speak_language(datum/language/language_path) return TRUE // THE MAGIC OF ELECTRONICS /obj/item/organ/internal/tongue/robot/modify_speech(datum/source, list/speech_args) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 3f10087ab8f..88374192816 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -23,7 +23,9 @@ if(!tool) success = TRUE if(iscyborg(user)) - success = TRUE + var/mob/living/silicon/robot/borg = user + if(istype(borg.module_active, /obj/item/borg/cyborghug)) + success = TRUE if(accept_any_item) if(tool && tool_check(user, tool)) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 32df8493ff0..571e8c422d9 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -535,6 +535,8 @@ else limb_snip_candidate.dismember() user.visible_message(span_danger("[src] violently slams shut, amputating [patient]'s [candidate_name]."), span_notice("You amputate [patient]'s [candidate_name] with [src].")) + user.log_message("[user] has amputated [patient]'s [candidate_name] with [src]", LOG_GAME) + patient.log_message("[patient]'s [candidate_name] has been amputated by [user] with [src]", LOG_GAME) if(HAS_MIND_TRAIT(user, TRAIT_MORBID)) //Freak user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 83420d130a7..616263098fd 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.7.0" +"5.8.0" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 25d49b3e3bd..a5c064a8eaf 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -8,8 +8,12 @@ var/reboot_mode = TGS_REBOOT_MODE_NORMAL + /// List of chat messages list()s that attempted to be sent during a topic call. To be bundled in the result of the call var/list/intercepted_message_queue + /// List of chat messages list()s that attempted to be sent during a topic call. To be bundled in the result of the call + var/list/offline_message_queue + var/list/custom_commands var/list/test_merges @@ -194,17 +198,7 @@ var/datum/tgs_chat_channel/channel = I ids += channel.id - message2 = UpgradeDeprecatedChatMessage(message2) - - if (!length(channels)) - return - - var/list/data = message2._interop_serialize() - data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids - if(intercepted_message_queue) - intercepted_message_queue += list(data) - else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) + SendChatMessageRaw(message2, ids) /datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message2, admin_only) var/list/channels = list() @@ -213,26 +207,42 @@ if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id + SendChatMessageRaw(message2, channels) + +/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user) + SendChatMessageRaw(message2, list(user.channel.id)) + +/datum/tgs_api/v5/proc/SendChatMessageRaw(datum/tgs_message_content/message2, list/channel_ids) message2 = UpgradeDeprecatedChatMessage(message2) - if (!length(channels)) + if (!length(channel_ids)) return var/list/data = message2._interop_serialize() - data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channel_ids if(intercepted_message_queue) intercepted_message_queue += list(data) - else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) + return -/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user) - message2 = UpgradeDeprecatedChatMessage(message2) - var/list/data = message2._interop_serialize() - data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id) - if(intercepted_message_queue) - intercepted_message_queue += list(data) + if(offline_message_queue) + offline_message_queue += list(data) + return + + if(detached) + offline_message_queue = list(data) + + WaitForReattach(FALSE) + + data = offline_message_queue + offline_message_queue = null + + for(var/queued_message in data) + SendChatDataRaw(queued_message) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) + SendChatDataRaw(data) + +/datum/tgs_api/v5/proc/SendChatDataRaw(list/data) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index bcd97a91245..1168b6c619a 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -86,7 +86,7 @@ */ /datum/proc/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_UI_ACT, usr, action) + SEND_SIGNAL(src, COMSIG_UI_ACT, usr, action, params) // If UI is not interactive or usr calling Topic is not the UI user, bail. if(!ui || ui.status != UI_INTERACTIVE) return TRUE diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index 79348c4d2a6..f90b22c238c 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -128,6 +128,7 @@ /datum/transport_controller/linear/tram/Destroy() paired_cabinet = null set_status_code(SYSTEM_FAULT, TRUE) + SEND_SIGNAL(SStransport, COMSIG_TRANSPORT_ACTIVE, src, FALSE, controller_status, travel_direction, destination_platform) tram_registration.active = FALSE SSblackbox.record_feedback("amount", "tram_destroyed", 1) SSpersistence.save_tram_history(specific_transport_id) @@ -528,6 +529,7 @@ paired_cabinet = null log_transport("TC: [specific_transport_id] received QDEL from controller cabinet.") set_status_code(SYSTEM_FAULT, TRUE) + send_transport_active_signal() /** * Tram malfunction random event. Set comm error, increase tram lethality. @@ -686,8 +688,8 @@ integrity_failure = 0.25 layer = SIGN_LAYER req_access = list(ACCESS_TCOMMS) - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 4.8 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 4.8 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.25 + power_channel = AREA_USAGE_ENVIRON var/datum/transport_controller/linear/tram/controller_datum /// If the cover is open var/cover_open = FALSE @@ -697,7 +699,7 @@ /obj/machinery/transport/tram_controller/hilbert configured_transport_id = HILBERT_LINE_1 - obj_flags = /obj::obj_flags | NO_DECONSTRUCTION + obj_flags = parent_type::obj_flags | NO_DECONSTRUCTION /obj/machinery/transport/tram_controller/Initialize(mapload) . = ..() @@ -742,6 +744,9 @@ return CONTEXTUAL_SCREENTIP_SET +/obj/machinery/transport/tram_controller/update_current_power_usage() + return // We get power from area rectifiers + /obj/machinery/transport/tram_controller/examine(mob/user) . = ..() . += span_notice("The door appears to be [cover_locked ? "locked. Swipe an ID card to unlock" : "unlocked. Swipe an ID card to lock"].") diff --git a/code/modules/transport/tram/tram_controls.dm b/code/modules/transport/tram/tram_controls.dm index 2ecdad304bb..db8fe767155 100644 --- a/code/modules/transport/tram/tram_controls.dm +++ b/code/modules/transport/tram/tram_controls.dm @@ -9,6 +9,8 @@ density = FALSE max_integrity = 400 integrity_failure = 0.1 + power_channel = AREA_USAGE_ENVIRON + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.25 armor_type = /datum/armor/transport_machinery circuit = /obj/item/circuitboard/computer/tram_controls light_color = COLOR_BLUE_LIGHT @@ -64,6 +66,9 @@ if(tram) RegisterSignal(SStransport, COMSIG_TRANSPORT_ACTIVE, PROC_REF(update_display)) +/obj/machinery/computer/tram_controls/update_current_power_usage() + return // We get power from area rectifiers + /** * Finds the tram from the console * diff --git a/code/modules/transport/tram/tram_power.dm b/code/modules/transport/tram/tram_power.dm new file mode 100644 index 00000000000..ff0251e9090 --- /dev/null +++ b/code/modules/transport/tram/tram_power.dm @@ -0,0 +1,73 @@ +/obj/machinery/transport/power_rectifier + name = "tram power rectifier" + desc = "An electrical device that converts alternating current (AC) to direct current (DC) for powering the tram." + icon = 'icons/obj/tram/tram_controllers.dmi' + icon_state = "rectifier" + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 11.4 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 114 + power_channel = AREA_USAGE_ENVIRON + anchored = TRUE + density = FALSE + armor_type = /datum/armor/transport_module + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + max_integrity = 750 + pixel_y = 32 + /// The tram platform we're connected to and providing power + var/obj/effect/landmark/transport/nav_beacon/tram/platform/connected_platform + +/obj/machinery/transport/power_rectifier/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/transport/power_rectifier/LateInitialize(mapload) + . = ..() + RegisterSignal(SStransport, COMSIG_TRANSPORT_ACTIVE, PROC_REF(power_tram)) + find_platform() + +/** + * The mapper should have placed the rectifier in the area containing the station, the object will search for a landmark within + * its control area and set its idle position. + */ +/obj/machinery/transport/power_rectifier/proc/find_platform() + var/area/my_area = get_area(src) + for(var/obj/effect/landmark/transport/nav_beacon/tram/platform/candidate_platform in SStransport.nav_beacons[configured_transport_id]) + if(get_area(candidate_platform) == my_area) + connected_platform = candidate_platform + RegisterSignal(connected_platform, COMSIG_QDELETING, PROC_REF(on_landmark_qdel)) + log_transport("[id_tag]: Power rectifier linked to landmark [connected_platform.name]") + return + +/obj/machinery/transport/power_rectifier/proc/power_tram(datum/source, datum/transport_controller/linear/tram/controller, controller_active, controller_status, travel_direction, obj/effect/landmark/transport/nav_beacon/tram/platform/destination_platform) + SIGNAL_HANDLER + + if(controller_active && destination_platform == connected_platform) + update_use_power(ACTIVE_POWER_USE) + else + update_use_power(IDLE_POWER_USE) + + update_appearance() + +/** + * Update the lights based on the rectifier status. + */ +/obj/machinery/transport/power_rectifier/update_overlays() + . = ..() + + if(machine_stat & NOPOWER) + . += mutable_appearance(icon, "rec-power-0") + . += emissive_appearance(icon, "rec-power-0", src, alpha = src.alpha) + return + + . += mutable_appearance(icon, "rec-power-1") + . += emissive_appearance(icon, "rec-power-1", src, alpha = src.alpha) + + var/is_active = use_power == ACTIVE_POWER_USE + . += mutable_appearance(icon, "rec-active-[is_active]") + . += emissive_appearance(icon, "rec-active-[is_active]", src, alpha = src.alpha) + +/** + * Clear reference to the connected landmark if it gets destroyed. + */ +/obj/machinery/transport/power_rectifier/proc/on_landmark_qdel() + log_transport("[id_tag]: Power rectifier received QDEL from landmark [connected_platform.name]") + connected_platform = null diff --git a/code/modules/transport/tram/tram_signals.dm b/code/modules/transport/tram/tram_signals.dm index 9e297e8e829..904bb162c45 100644 --- a/code/modules/transport/tram/tram_signals.dm +++ b/code/modules/transport/tram/tram_signals.dm @@ -10,13 +10,13 @@ integrity_failure = 0.25 light_range = 2 light_power = 0.7 - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 2.4 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.48 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 3.6 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.72 anchored = TRUE density = FALSE circuit = /obj/item/circuitboard/machine/crossing_signal // pointless if it only takes 2 seconds to cross but updates every 2 seconds - subsystem_type = /datum/controller/subsystem/processing/transport + subsystem_type = /datum/controller/subsystem/processing/fastprocess light_color = LIGHT_COLOR_BABY_BLUE /// green, amber, or red for tram, blue if it's emag, tram missing, etc. var/signal_state = XING_STATE_MALF @@ -74,8 +74,7 @@ layer = TRAM_SIGNAL_LAYER max_integrity = 250 integrity_failure = 0.25 - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 2.4 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.74 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 3.6 anchored = TRUE density = FALSE light_range = 1.5 @@ -308,13 +307,14 @@ * Returns whether we are still processing. */ /obj/machinery/transport/crossing_signal/proc/update_operating() - use_power(idle_power_usage) update_appearance() // Immediately process for snappy feedback var/should_process = process() != PROCESS_KILL if(should_process) + update_use_power(ACTIVE_POWER_USE) begin_processing() return + update_use_power(IDLE_POWER_USE) end_processing() /obj/machinery/transport/crossing_signal/process() @@ -328,8 +328,6 @@ set_signal_state(XING_STATE_MALF, force = !is_operational) return PROCESS_KILL - use_power(active_power_usage) - var/obj/structure/transport/linear/tram_part = tram.return_closest_platform_to(src) if(QDELETED(tram_part)) @@ -499,7 +497,7 @@ icon_state = "sensor-base" desc = "Uses an infrared beam to detect passing trams. Works when paired with a sensor on the other side of the track." layer = TRAM_RAIL_LAYER - use_power = 0 + use_power = NO_POWER_USE circuit = /obj/item/circuitboard/machine/guideway_sensor /// Sensors work in a married pair var/datum/weakref/paired_sensor diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 7a7facea1b3..7a57529b8ff 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -931,8 +931,6 @@ addtimer(CALLBACK(src, PROC_REF(clear_turfs), turfs, iterations), 1) /obj/structure/transport/linear/tram/proc/estop_throw(throw_direction) - if(prob(50)) - do_sparks(2, FALSE, src) for(var/mob/living/passenger in transport_contents) to_chat(passenger, span_userdanger("The tram comes to a sudden, grinding stop!")) var/throw_target = get_edge_target_turf(src, throw_direction) diff --git a/code/modules/unit_tests/area_contents.dm b/code/modules/unit_tests/area_contents.dm index 8a48d644ee9..52394dd60ec 100644 --- a/code/modules/unit_tests/area_contents.dm +++ b/code/modules/unit_tests/area_contents.dm @@ -6,23 +6,28 @@ /datum/unit_test/area_contents/Run() // First, we check that there are no entries in more then one area // That or duplicate entries - for(var/area/space in GLOB.areas) - for(var/turf/position as anything in space.get_contained_turfs()) - if(!isturf(position)) - TEST_FAIL("Found a [position.type] in [space.type]'s turf listing") + for (var/area/area_to_test in GLOB.areas) + area_to_test.cannonize_contained_turfs() + for (var/i in 1 to area_to_test.turfs_by_zlevel.len) + if (!islist(area_to_test.turfs_by_zlevel[i])) + TEST_FAIL("zlevel index [i] in [area_to_test.type] is not a list.") - if(position.in_contents_of) - var/area/existing = position.in_contents_of - if(existing == space) - TEST_FAIL("Found a duplicate turf [position.type] inside [space.type]'s turf listing") - else - TEST_FAIL("Found a shared turf [position.type] between [space.type] and [existing.type]'s turf listings") + for (var/turf/turf_to_check as anything in area_to_test.turfs_by_zlevel[i]) + if (!isturf(turf_to_check)) + TEST_FAIL("Found a [turf_to_check.type] in [area_to_test.type]'s turf listing") - var/area/dream_spot = position.loc - if(dream_spot != space) - TEST_FAIL("Found a turf [position.type] which is IN [dream_spot.type], but is registered as being in [space.type]") + if (turf_to_check.in_contents_of) + var/area/existing = turf_to_check.in_contents_of + if (existing == turf_to_check) + TEST_FAIL("Found a duplicate turf [turf_to_check.type] inside [area_to_test.type]'s turf listing") + else + TEST_FAIL("Found a shared turf [turf_to_check.type] between [area_to_test.type] and [existing.type]'s turf listings") - position.in_contents_of = space + var/area/turfs_actual_area = turf_to_check.loc + if (turfs_actual_area != area_to_test) + TEST_FAIL("Found a turf [turf_to_check.type] which is IN [turfs_actual_area.type], but is registered as being in [area_to_test.type]") + + turf_to_check.in_contents_of = turf_to_check for(var/turf/position in ALL_TURFS()) if(!position.in_contents_of) diff --git a/code/modules/unit_tests/atmospherics_sanity.dm b/code/modules/unit_tests/atmospherics_sanity.dm index c4f024e9178..ff177ae4517 100644 --- a/code/modules/unit_tests/atmospherics_sanity.dm +++ b/code/modules/unit_tests/atmospherics_sanity.dm @@ -101,7 +101,7 @@ UNTIL(crawls == 0) for(var/area/missed as anything in remaining_areas) if(missed.has_contained_turfs()) - var/turf/first_turf = missed.get_contained_turfs()[1] + var/turf/first_turf = missed.get_zlevel_turf_lists()[1][1] TEST_FAIL("Disconnected Area '[missed]'([missed.type]) at ([first_turf.x], [first_turf.y], [first_turf.z])") else TEST_NOTICE(src, "Disconnected Area '[missed]'([missed.type]) with no turfs?") diff --git a/code/modules/unit_tests/find_reference_sanity.dm b/code/modules/unit_tests/find_reference_sanity.dm index 0dda1559819..4bc6445f024 100644 --- a/code/modules/unit_tests/find_reference_sanity.dm +++ b/code/modules/unit_tests/find_reference_sanity.dm @@ -15,6 +15,8 @@ return ..() /atom/movable/ref_test + // Gotta make sure we do a full check + references_to_clear = INFINITY var/atom/movable/ref_test/self_ref /atom/movable/ref_test/Destroy(force) @@ -29,9 +31,9 @@ //Sanity check var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 3, "Should be: test references: 0 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(testbed, "Sanity Check", search_time = 1) //We increment search time to get around an optimization + victim.DoSearchVar(testbed, "Sanity Check") //We increment search time to get around an optimization - TEST_ASSERT(!victim.found_refs.len, "The ref-tracking tool found a ref where none existed") + TEST_ASSERT(!LAZYLEN(victim.found_refs), "The ref-tracking tool found a ref where none existed") SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_baseline/Run() @@ -46,11 +48,11 @@ var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 6, "Should be: test references: 3 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(testbed, "First Run", search_time = 2) + victim.DoSearchVar(testbed, "First Run") - TEST_ASSERT(victim.found_refs["test"], "The ref-tracking tool failed to find a regular value") - TEST_ASSERT(victim.found_refs[testbed.test_list], "The ref-tracking tool failed to find a list entry") - TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list value") + TEST_ASSERT(LAZYACCESS(victim.found_refs, "test"), "The ref-tracking tool failed to find a regular value") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_list), "The ref-tracking tool failed to find a list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_assoc_list), "The ref-tracking tool failed to find an assoc list value") SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_exotic/Run() @@ -65,12 +67,12 @@ var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 6, "Should be: test references: 3 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(testbed, "Second Run", search_time = 3) + victim.DoSearchVar(testbed, "Second Run") //This is another sanity check - TEST_ASSERT(!victim.found_refs[testbed.overlays], "The ref-tracking tool found an overlays entry? That shouldn't be possible") - TEST_ASSERT(victim.found_refs[testbed.vis_contents], "The ref-tracking tool failed to find a vis_contents entry") - TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list key") + TEST_ASSERT(!LAZYACCESS(victim.found_refs, testbed.overlays), "The ref-tracking tool found an overlays entry? That shouldn't be possible") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.vis_contents), "The ref-tracking tool failed to find a vis_contents entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_assoc_list), "The ref-tracking tool failed to find an assoc list key") SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_esoteric/Run() @@ -87,12 +89,12 @@ var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 6, "Should be: test references: 3 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(victim, "Third Run Self", search_time = 4) - victim.DoSearchVar(testbed, "Third Run Testbed", search_time = 4) + victim.DoSearchVar(victim, "Third Run Self") + victim.DoSearchVar(testbed, "Third Run Testbed") - TEST_ASSERT(victim.found_refs["self_ref"], "The ref-tracking tool failed to find a self reference") - TEST_ASSERT(victim.found_refs[to_find], "The ref-tracking tool failed to find a nested list entry") - TEST_ASSERT(victim.found_refs[to_find_assoc], "The ref-tracking tool failed to find a nested assoc list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, "self_ref"), "The ref-tracking tool failed to find a self reference") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find), "The ref-tracking tool failed to find a nested list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find_assoc), "The ref-tracking tool failed to find a nested assoc list entry") SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_null_key_entry/Run() @@ -104,9 +106,9 @@ testbed.test_assoc_list = list(null = victim) var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 4, "Should be: test references: 1 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(testbed, "Fourth Run", search_time = 5) + victim.DoSearchVar(testbed, "Fourth Run") - TEST_ASSERT(testbed.test_assoc_list, "The ref-tracking tool failed to find a null key'd assoc list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_assoc_list), "The ref-tracking tool failed to find a null key'd assoc list entry") /datum/unit_test/find_reference_assoc_investigation/Run() var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) @@ -121,10 +123,10 @@ var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 5, "Should be: test references: 2 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(testbed, "Fifth Run", search_time = 6) + victim.DoSearchVar(testbed, "Fifth Run") - TEST_ASSERT(victim.found_refs[to_find_in_key], "The ref-tracking tool failed to find a nested assoc list key") - TEST_ASSERT(victim.found_refs[to_find_null_assoc_nested], "The ref-tracking tool failed to find a null key'd nested assoc list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find_in_key), "The ref-tracking tool failed to find a nested assoc list key") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find_null_assoc_nested), "The ref-tracking tool failed to find a null key'd nested assoc list entry") SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_static_investigation/Run() @@ -144,7 +146,7 @@ var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 5, "Should be: test references: 2 + baseline references: 3 (victim var,loc,allocated list)") - victim.DoSearchVar(global_vars, "Sixth Run", search_time = 7) + victim.DoSearchVar(global_vars, "Sixth Run") - TEST_ASSERT(victim.found_refs[global_vars], "The ref-tracking tool failed to find a natively global variable") + TEST_ASSERT(LAZYACCESS(victim.found_refs, global_vars), "The ref-tracking tool failed to find a natively global variable") SSgarbage.should_save_refs = FALSE diff --git a/code/modules/unit_tests/hallucination_icons.dm b/code/modules/unit_tests/hallucination_icons.dm index 6477e94714c..c9f9cf8237c 100644 --- a/code/modules/unit_tests/hallucination_icons.dm +++ b/code/modules/unit_tests/hallucination_icons.dm @@ -19,7 +19,7 @@ // Test preset delusion hallucinations for invalid image setups for(var/datum/hallucination/delusion/preset/hallucination as anything in subtypesof(/datum/hallucination/delusion/preset)) - if(initial(hallucination.dynamic_icon)) + if(initial(hallucination.dynamic_delusion)) continue var/icon = initial(hallucination.delusion_icon_file) var/icon_state = initial(hallucination.delusion_icon_state) diff --git a/code/modules/unit_tests/ling_decap.dm b/code/modules/unit_tests/ling_decap.dm index 5d6f01caf9a..4c8c7e4e031 100644 --- a/code/modules/unit_tests/ling_decap.dm +++ b/code/modules/unit_tests/ling_decap.dm @@ -9,11 +9,12 @@ var/obj/item/bodypart/head/noggin = ling.get_bodypart(BODY_ZONE_HEAD) noggin.dismember() TEST_ASSERT_NULL(ling.get_bodypart(BODY_ZONE_HEAD), "Changeling failed to be decapitated.") - TEST_ASSERT_NULL(noggin.brain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation, but it should have remained in their body.") + var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in noggin + TEST_ASSERT_NULL(brain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation, but it should have remained in their body.") - var/obj/item/organ/internal/brain/oldbrain = noggin.brain + var/obj/item/organ/internal/brain/oldbrain = locate(/obj/item/organ/internal/brain) in noggin noggin.drop_organs() - TEST_ASSERT_NULL(noggin.brain, "Changeling's head failed to drop its brain.") + TEST_ASSERT_NULL(locate(/obj/item/organ/internal/brain) in noggin, "Changeling's head failed to drop its brain.") TEST_ASSERT_NULL(oldbrain.brainmob.mind, "Changeling's mind was moved to their brain after decapitation and organ dropping, but it should have remained in their body.") TEST_ASSERT_EQUAL(ling.stat, CONSCIOUS, "Changeling was not conscious after losing their head.") @@ -33,9 +34,10 @@ var/obj/item/bodypart/head/noggin = normal_guy.get_bodypart(BODY_ZONE_HEAD) noggin.dismember() - TEST_ASSERT_EQUAL(noggin.brain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after decapitation.") + var/obj/item/organ/internal/brain/brain = locate(/obj/item/organ/internal/brain) in noggin + TEST_ASSERT_EQUAL(brain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after decapitation.") - var/obj/item/organ/internal/brain/oldbrain = noggin.brain + var/obj/item/organ/internal/brain/oldbrain = locate(/obj/item/organ/internal/brain) in noggin noggin.drop_organs() TEST_ASSERT_EQUAL(oldbrain.brainmob.mind, my_guys_mind, "Dummy's mind was not moved to their brain after being removed from their head.") diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index ec58dcedc88..6fde4de9dbc 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -160,7 +160,7 @@ speaker.forceMove(run_loc_floor_bottom_left) listener.forceMove(locate((run_loc_floor_bottom_left.x + distance), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) - var/pangram_quote = "The quick brown fox jumps over the lazy dog" + var/pangram_quote = "The quick brown fox jumps over the lazy dog." // SKYRAT EDIT CHANGE - account for autopunct in living_say.dm - ORIGINAL: var/pangram_quote = "The quick brown fox jumps over the lazy dog" // speaking speaker.say(pangram_quote) @@ -201,7 +201,7 @@ listener_radio.set_frequency(FREQ_CENTCOM) listener_radio.independent = TRUE - var/pangram_quote = "The quick brown fox jumps over the lazy dog" + var/pangram_quote = "The quick brown fox jumps over the lazy dog." // SKYRAT EDIT CHANGE - account for autopunct in living_say.dm - ORIGINAL: var/pangram_quote = "The quick brown fox jumps over the lazy dog" speaker.say(pangram_quote) TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired (radio test)") diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox_primalis.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox_primalis.png index 9f591d0cdba..cfbd40f8db7 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox_primalis.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox_primalis.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_husk_body.png b/code/modules/unit_tests/screenshots/screenshot_husk_body.png index 2911277fcd9..f7f1f8a7ac3 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_husk_body.png and b/code/modules/unit_tests/screenshots/screenshot_husk_body.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png b/code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png index 6c526af2ebb..aff3f07f97e 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png and b/code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png differ diff --git a/code/modules/unit_tests/spell_mindswap.dm b/code/modules/unit_tests/spell_mindswap.dm index 133f9662d91..f598bcc7263 100644 --- a/code/modules/unit_tests/spell_mindswap.dm +++ b/code/modules/unit_tests/spell_mindswap.dm @@ -11,6 +11,10 @@ var/mob/living/carbon/human/swapper = allocate(/mob/living/carbon/human/consistent) var/mob/living/carbon/human/to_swap = allocate(/mob/living/carbon/human/consistent) + swapper.real_name = "The Mindswapper" + swapper.name = swapper.real_name + to_swap.real_name = "The Guy Who Gets Mindswapped" + to_swap.name = to_swap.real_name swapper.forceMove(run_loc_floor_bottom_left) to_swap.forceMove(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm index dbd28a136c8..da7212ee8fc 100644 --- a/code/modules/uplink/uplink_items/badass.dm +++ b/code/modules/uplink/uplink_items/badass.dm @@ -24,7 +24,7 @@ notify_ghosts( "[user] has purchased a BADASS Syndicate Balloon!", - source = src, + source = ., header = "What are they THINKING?", ) diff --git a/code/modules/uplink/uplink_items/contractor.dm b/code/modules/uplink/uplink_items/contractor.dm index 1364f8b088b..b774d05e59d 100644 --- a/code/modules/uplink/uplink_items/contractor.dm +++ b/code/modules/uplink/uplink_items/contractor.dm @@ -82,28 +82,9 @@ cost = 1 /datum/uplink_item/contractor/partner - name = "Reinforcements" - desc = "Upon purchase we'll contact available units in the area. Should there be an agent free, \ - we'll send them down to assist you immediately. If no units are free, we give a full refund." - item = /obj/effect/gibspawner/generic + name = "Contractor Reinforcement" + desc = "A reinforecment operative will be sent to aid you in your goals, \ + they are paid separately, and will not take a cut from your profits." + item = /obj/item/antag_spawner/loadout/contractor limited_stock = 1 cost = 2 - -/datum/uplink_item/contractor/partner/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) - to_chat(user, span_notice("The uplink vibrates quietly, connecting to nearby agents...")) - var/list/candidates = SSpolling.poll_ghost_candidates( - question = "Do you want to play as the Contractor Support Unit for [user.real_name]?", - check_jobban = ROLE_TRAITOR, - role = ROLE_TRAITOR, - poll_time = 10 SECONDS, - ignore_category = POLL_IGNORE_CONTRACTOR_SUPPORT, - pic_source = /obj/item/modular_computer/pda/syndicate_contract_uplink, - role_name_text = "contractor support unit", - ) - if(!LAZYLEN(candidates)) - to_chat(user, span_notice("No available agents at this time, please try again later.")) - limited_stock++ - return //bobux no icon - var/mob/dead/observer/selected_player = pick(candidates) - uplink_handler.contractor_hub.contractor_teammate = spawn_contractor_partner(user, selected_player.key) - return source //for log icon diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index d971b82a856..dc7304a1388 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -54,7 +54,7 @@ /// Keeps track of the mech's servo motor var/obj/item/stock_parts/servo/servo ///Contains flags for the mecha - var/mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + var/mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE ///Spark effects are handled by this datum var/datum/effect_system/spark_spread/spark_system @@ -70,8 +70,6 @@ var/bumpsmash = FALSE ///////////ATMOS - ///Whether the pilot is hidden from the outside viewers and whether the cabin can be sealed to be airtight - var/enclosed = TRUE ///Whether the cabin exchanges gases with the environment var/cabin_sealed = FALSE ///Internal air mix datum @@ -397,7 +395,7 @@ /obj/vehicle/sealed/mecha/generate_actions() initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - if(enclosed) + if(mecha_flags & IS_ENCLOSED) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal, VEHICLE_CONTROL_SETTINGS) if(can_use_overclock) initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overclock) @@ -468,7 +466,7 @@ . += span_warning("It's missing a capacitor.") if(!scanmod) . += span_warning("It's missing a scanning module.") - if(enclosed) + if(mecha_flags & IS_ENCLOSED) return if(mecha_flags & SILICON_PILOT) . += span_notice("[src] appears to be piloting itself...") @@ -574,7 +572,7 @@ /obj/vehicle/sealed/mecha/proc/process_occupants(seconds_per_tick) for(var/mob/living/occupant as anything in occupants) - if(!enclosed && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated. + if(!(mecha_flags & IS_ENCLOSED) && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated. mob_exit(occupant, randomstep = TRUE) //bye bye continue if(cell && cell.maxcharge) @@ -725,12 +723,12 @@ ///////////////////////////////////// /obj/vehicle/sealed/mecha/remove_air(amount) - if(enclosed && cabin_sealed) + if((mecha_flags & IS_ENCLOSED) && cabin_sealed) return cabin_air.remove(amount) return ..() /obj/vehicle/sealed/mecha/return_air() - if(enclosed && cabin_sealed) + if((mecha_flags & IS_ENCLOSED) && cabin_sealed) return cabin_air return ..() @@ -749,7 +747,7 @@ ///makes cabin unsealed, dumping cabin air outside or airtight filling the cabin with external air mix /obj/vehicle/sealed/mecha/proc/set_cabin_seal(mob/user, cabin_sealed) - if(!enclosed) + if(!(mecha_flags & IS_ENCLOSED)) balloon_alert(user, "cabin can't be sealed!") log_message("Tried to seal cabin. This mech can't be airtight.", LOG_MECHA) return diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index 223ab66ca31..82fd77f2289 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -47,7 +47,7 @@ force = 30 accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/gygax/dark - mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( MECHA_L_ARM = 1, MECHA_R_ARM = 1, diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm index dddcb7e8225..a7c9f018d28 100644 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -13,7 +13,7 @@ exit_delay = 40 accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) wreckage = /obj/structure/mecha_wreckage/honker - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_HONK max_equip_by_category = list( MECHA_L_ARM = 1, @@ -47,7 +47,7 @@ max_temperature = 35000 accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/honker/dark - mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( MECHA_L_ARM = 1, MECHA_R_ARM = 1, diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index 2fe8da4bdc7..750223a85d7 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -12,7 +12,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF accesses = list(ACCESS_CENT_SPECOPS) wreckage = /obj/structure/mecha_wreckage/marauder - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_MARAUDER force = 45 max_equip_by_category = list( @@ -117,7 +117,7 @@ base_icon_state = "mauler" accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/mauler - mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = ID_LOCK_ON | CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( MECHA_L_ARM = 1, MECHA_R_ARM = 1, diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm index bff5ecbd97b..ea8c72cae23 100644 --- a/code/modules/vehicles/mecha/combat/reticence.dm +++ b/code/modules/vehicles/mecha/combat/reticence.dm @@ -12,7 +12,7 @@ exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/reticence accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE + mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_RETICENCE max_equip_by_category = list( MECHA_L_ARM = 1, diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index c784219e3c3..237a0d971b0 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -19,7 +19,7 @@ base_icon_state = "savannah_ivanov" icon_state = "savannah_ivanov_0_0" //does not include mmi compatibility - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS + mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS mech_type = EXOSUIT_MODULE_SAVANNAH movedelay = 3 max_integrity = 450 //really tanky, like damn diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index de96f3ad5f6..c7c082a20e8 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -29,6 +29,8 @@ butcher_sound = null, \ disabled = TRUE, \ ) + ADD_TRAIT(src, TRAIT_INSTANTLY_PROCESSES_BOULDERS, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_BOULDER_BREAKER, INNATE_TRAIT) /obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) // Check if we can even use the equipment to begin with. @@ -66,8 +68,12 @@ playsound(src,'sound/weapons/drill.ogg',40,TRUE) else if(isobj(target)) var/obj/O = target - O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) - playsound(src,'sound/weapons/drill.ogg',40,TRUE) + if(istype(O, /obj/item/boulder)) + var/obj/item/boulder/nu_boulder = O + nu_boulder.manual_process(src, source) + else + O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) + playsound(src,'sound/weapons/drill.ogg', 40, TRUE) // If we caused a qdel drilling the target, we can stop drilling them. // Prevents starting a do_after on a qdeleted target. @@ -154,10 +160,11 @@ name = "exosuit mining scanner" desc = "Equipment for working exosuits. It will automatically check surrounding rock for useful minerals." icon_state = "mecha_analyzer" - equip_cooldown = 15 + equip_cooldown = 1.5 SECONDS equipment_slot = MECHA_UTILITY mech_flags = EXOSUIT_MODULE_WORKING var/scanning_time = 0 + COOLDOWN_DECLARE(area_scan_cooldown) /obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize(mapload) . = ..() @@ -174,7 +181,25 @@ if(!LAZYLEN(chassis.occupants)) return scanning_time = world.time + equip_cooldown - mineral_scan_pulse(get_turf(src)) + mineral_scan_pulse(get_turf(src), scanner = src) + +/obj/item/mecha_parts/mecha_equipment/mining_scanner/get_snowflake_data() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_ORE_SCANNER, + "cooldown" = COOLDOWN_TIMELEFT(src, area_scan_cooldown), + ) + +/obj/item/mecha_parts/mecha_equipment/mining_scanner/handle_ui_act(action, list/params) + switch(action) + if("area_scan") + if(!COOLDOWN_FINISHED(src, area_scan_cooldown)) + return FALSE + COOLDOWN_START(src, area_scan_cooldown, 15 SECONDS) + for(var/mob/living/carbon/human/driver in chassis.return_drivers()) + for(var/obj/structure/ore_vent/vent as anything in range(5, chassis)) + if(istype(vent, /obj/structure/ore_vent)) + vent.scan_and_confirm(driver, TRUE) + return TRUE #undef DRILL_BASIC #undef DRILL_HARDENED diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 13041e11220..1960303baab 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -217,117 +217,88 @@ attempt_refill(usr) return TRUE -#define MODE_DECONSTRUCT 0 -#define MODE_WALL 1 -#define MODE_AIRLOCK 2 - /obj/item/mecha_parts/mecha_equipment/rcd name = "mounted RCD" desc = "An exosuit-mounted Rapid Construction Device." icon_state = "mecha_rcd" - equip_cooldown = 10 - energy_drain = 250 + equip_cooldown = 0 // internal RCD already handles it + energy_drain = 0 // internal RCD handles power consumption based on matter use range = MECHA_MELEE|MECHA_RANGED item_flags = NO_MAT_REDEMPTION - ///determines what we'll so when clicking on a turf - var/mode = MODE_DECONSTRUCT + ///Maximum range the RCD can construct at. + var/rcd_range = 3 + ///Whether or not to deconstruct instead. + var/deconstruct_active = FALSE + ///The type of internal RCD this equipment uses. + var/rcd_type = /obj/item/construction/rcd/exosuit + ///The internal RCD item used by this equipment. + var/obj/item/construction/rcd/internal_rcd /obj/item/mecha_parts/mecha_equipment/rcd/Initialize(mapload) . = ..() + internal_rcd = new rcd_type(src) GLOB.rcd_list += src /obj/item/mecha_parts/mecha_equipment/rcd/Destroy() GLOB.rcd_list -= src + qdel(internal_rcd) return ..() /obj/item/mecha_parts/mecha_equipment/rcd/get_snowflake_data() return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "mode" = get_mode_name(), - "mode_label" = "RCD control", + "snowflake_id" = MECHA_SNOWFLAKE_ID_RCD, + "scan_ready" = COOLDOWN_FINISHED(internal_rcd, destructive_scan_cooldown), + "deconstructing" = deconstruct_active, + "mode" = internal_rcd.design_title, ) -/// fetches the mode name to display in the UI -/obj/item/mecha_parts/mecha_equipment/rcd/proc/get_mode_name() - switch(mode) - if(MODE_DECONSTRUCT) - return "Deconstruct" - if(MODE_WALL) - return "Build wall" - if(MODE_AIRLOCK) - return "Build Airlock" - else - return "Someone didnt set this" - -/obj/item/mecha_parts/mecha_equipment/rcd/handle_ui_act(action, list/params) - if(action == "change_mode") - mode++ - if(mode > MODE_AIRLOCK) - mode = MODE_DECONSTRUCT - switch(mode) - if(MODE_DECONSTRUCT) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Switched RCD to Deconstruct.")]") - energy_drain = initial(energy_drain) - if(MODE_WALL) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Switched RCD to Construct Walls and Flooring.")]") - energy_drain = 2*initial(energy_drain) - if(MODE_AIRLOCK) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Switched RCD to Construct Airlock.")]") - energy_drain = 2*initial(energy_drain) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/rcd/action(mob/source, atom/target, list/modifiers) - if(!isturf(target) && !istype(target, /obj/machinery/door/airlock)) - target = get_turf(target) - if(!action_checks(target) || !(target in view(3, chassis)) || istype(target, /turf/open/space/transit)) - return - playsound(chassis, 'sound/machines/click.ogg', 50, TRUE) - - switch(mode) - if(MODE_DECONSTRUCT) - to_chat(source, "[icon2html(src, source)][span_notice("Deconstructing [target]...")]") - if(iswallturf(target)) - var/turf/closed/wall/wall_turf = target - if(!do_after_cooldown(wall_turf, source)) - return - wall_turf.ScrapeAway() - else if(isfloorturf(target)) - var/turf/open/floor/floor_turf = target - if(!do_after_cooldown(floor_turf, source)) - return - floor_turf.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - else if (istype(target, /obj/machinery/door/airlock)) - if(!do_after_cooldown(target, source)) - return - qdel(target) - if(MODE_WALL) - if(isfloorturf(target)) - var/turf/open/floor/floor_turf = target - to_chat(source, "[icon2html(src, source)][span_notice("Building Wall...")]") - if(!do_after_cooldown(floor_turf, source)) - return - floor_turf.place_on_top(/turf/closed/wall) - else if(isopenturf(target)) - var/turf/open/open_turf = target - to_chat(source, "[icon2html(src, source)][span_notice("Building Floor...")]") - if(!do_after_cooldown(open_turf, source)) - return - open_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - if(MODE_AIRLOCK) - if(isfloorturf(target)) - to_chat(source, "[icon2html(src, source)][span_notice("Building Airlock...")]") - if(!do_after_cooldown(target, source)) - return - var/obj/machinery/door/airlock/airlock_door = new /obj/machinery/door/airlock(target) - airlock_door.autoclose = TRUE - playsound(target, 'sound/effects/sparks2.ogg', 50, TRUE) - chassis.spark_system.start() - playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) +/// Set the RCD's owner when attaching and detaching it +/obj/item/mecha_parts/mecha_equipment/rcd/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right) + internal_rcd.owner = new_mecha return ..() -#undef MODE_DECONSTRUCT -#undef MODE_WALL -#undef MODE_AIRLOCK +/obj/item/mecha_parts/mecha_equipment/rcd/detach(atom/moveto) + internal_rcd.owner = null + return ..() + +/obj/item/mecha_parts/mecha_equipment/rcd/handle_ui_act(action, list/params) + switch(action) + if("rcd_scan") + if(!COOLDOWN_FINISHED(internal_rcd, destructive_scan_cooldown)) + return FALSE + rcd_scan(internal_rcd) + COOLDOWN_START(internal_rcd, destructive_scan_cooldown, RCD_DESTRUCTIVE_SCAN_COOLDOWN) + return TRUE + if("toggle_deconstruct") + deconstruct_active = !deconstruct_active + return TRUE + if("change_mode") + for(var/mob/driver as anything in chassis.return_drivers()) + internal_rcd.ui_interact(driver) + return TRUE + +/obj/item/mecha_parts/mecha_equipment/rcd/action(mob/source, atom/target, list/modifiers) + if(!action_checks(target)) + return + if(get_dist(chassis, target) > rcd_range) + balloon_alert(source, "out of range!") + return + if(!internal_rcd) // if it somehow went missing + internal_rcd = new rcd_type(src) + stack_trace("Exosuit-mounted RCD had no internal RCD!") + ..() // do this now because the do_after can take a while + var/construction_mode = internal_rcd.mode + if(deconstruct_active) // deconstruct isn't in the RCD menu so switch it to deconstruct mode and set it back when it's done + internal_rcd.mode = RCD_DECONSTRUCT + internal_rcd.rcd_create(target, source) + internal_rcd.mode = construction_mode + return TRUE + +/obj/item/mecha_parts/mecha_equipment/rcd/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/rcd_upgrade)) + internal_rcd.install_upgrade(attacking_item, user) + return + return ..() //Dunno where else to put this so shrug /obj/item/mecha_parts/mecha_equipment/ripleyupgrade @@ -388,7 +359,8 @@ equipment.detach(newmech) equipment.attach(newmech, righthandgun) newmech.dna_lock = markone.dna_lock - newmech.mecha_flags = markone.mecha_flags + newmech.mecha_flags |= markone.mecha_flags & ~initial(markone.mecha_flags) // transfer any non-inherent flags like PANEL_OPEN and LIGHTS_ON + newmech.set_light_on(newmech.mecha_flags & LIGHTS_ON) // in case the lights were on newmech.strafe = markone.strafe //Integ set to the same percentage integ as the old mecha, rounded to be whole number newmech.update_integrity(round((markone.get_integrity() / markone.max_integrity) * newmech.get_integrity())) diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index bd219802515..335e8bc5a3e 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -162,7 +162,7 @@ icon_state = "mecha_kineticgun" energy_drain = 30 projectile = /obj/projectile/kinetic/mech - fire_sound = 'sound/weapons/kenetic_accel.ogg' + fire_sound = 'sound/weapons/kinetic_accel.ogg' harmful = TRUE mech_flags = EXOSUIT_MODULE_COMBAT | EXOSUIT_MODULE_WORKING diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 43301c19605..2b410bd60c7 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -101,7 +101,7 @@ toggle_strafe() /obj/vehicle/sealed/mecha/proc/toggle_strafe() - if(!(mecha_flags & CANSTRAFE)) + if(!(mecha_flags & CAN_STRAFE)) to_chat(occupants, "this mecha doesn't support strafing!") return diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index 3dd69d4ba93..635ec9425b1 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -29,7 +29,7 @@ name = M.name, integrity = round((M.get_integrity() / M.max_integrity) * 100), charge = M.cell ? round(M.cell.percent()) : null, - airtank = M.enclosed ? M.return_pressure() : null, + airtank = (M.mecha_flags & IS_ENCLOSED) ? M.return_pressure() : null, pilot = M.return_drivers(), location = get_area_name(M, TRUE), emp_recharging = MT.recharging, @@ -97,7 +97,7 @@ var/answer = {"Name: [chassis.name]
Integrity: [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%
Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
- Cabin Pressure: [chassis.enclosed ? "[round(chassis.return_pressure(), 0.01)] kPa" : "Not Sealed"]
+ Cabin Pressure: [(chassis.mecha_flags & IS_ENCLOSED) ? "[round(chassis.return_pressure(), 0.01)] kPa" : "Not Sealed"]
Pilot: [english_list(chassis.return_drivers(), nothing_text = "None")]
Location: [get_area_name(chassis, TRUE) || "Unknown"]"} if(istype(chassis, /obj/vehicle/sealed/mecha/ripley)) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 746039e7552..c1207c2677f 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -115,18 +115,15 @@ return ..() /obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) //wrapper - . = ..() - if(. != BULLET_ACT_HIT) - return . - //allows bullets to hit the pilot of open-canopy mechs - if(!enclosed \ + if(!(mecha_flags & IS_ENCLOSED) \ && LAZYLEN(occupants) \ && !(mecha_flags & SILICON_PILOT) \ && (def_zone == BODY_ZONE_HEAD || def_zone == BODY_ZONE_CHEST)) - for(var/mob/living/hitmob as anything in occupants) - hitmob.bullet_act(hitting_projectile, def_zone, piercing_hit) //If the sides are open, the occupant can be hit - return BULLET_ACT_HIT + var/mob/living/hitmob = pick(occupants) + return hitmob.bullet_act(hitting_projectile, def_zone, piercing_hit) //If the sides are open, the occupant can be hit + + . = ..() 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 @@ -138,6 +135,7 @@ 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 ..() @@ -199,7 +197,7 @@ /obj/vehicle/sealed/mecha/fire_act() //Check if we should ignite the pilot of an open-canopy mech . = ..() - if(enclosed || mecha_flags & SILICON_PILOT) + if(mecha_flags & IS_ENCLOSED || mecha_flags & SILICON_PILOT) return for(var/mob/living/cookedalive as anything in occupants) if(cookedalive.fire_stacks < 5) @@ -227,6 +225,10 @@ ammo_resupply(weapon, user) return + if(istype(weapon, /obj/item/rcd_upgrade)) + upgrade_rcd(weapon, user) + return + if(weapon.GetID()) if(!allowed(user)) if(mecha_flags & ID_LOCK_ON) @@ -346,21 +348,9 @@ ..() . = TRUE - if(!(mecha_flags & PANEL_OPEN) && LAZYLEN(occupants)) - for(var/mob/occupant as anything in occupants) - occupant.show_message( - span_userdanger("[user] is trying to open the maintenance panel of [src]!"), MSG_VISUAL, - span_userdanger("You hear someone trying to open the maintenance panel of [src]!"), MSG_AUDIBLE, - ) - visible_message(span_danger("[user] is trying to open the maintenance panel of [src]!")) - if(!do_after(user, 5 SECONDS, src)) - return - for(var/mob/occupant as anything in occupants) - occupant.show_message( - span_userdanger("[user] has opened the maintenance panel of [src]!"), MSG_VISUAL, - span_userdanger("You hear someone opening the maintenance panel of [src]!"), MSG_AUDIBLE, - ) - visible_message(span_danger("[user] has opened the maintenance panel of [src]!")) + if(LAZYLEN(occupants)) + balloon_alert(user, "panel blocked") + return mecha_flags ^= PANEL_OPEN balloon_alert(user, (mecha_flags & PANEL_OPEN) ? "panel open" : "panel closed") @@ -524,3 +514,9 @@ else balloon_alert(user, "can't use this ammo!") return FALSE + +///Upgrades any attached RCD equipment. +/obj/vehicle/sealed/mecha/proc/upgrade_rcd(obj/item/rcd_upgrade/rcd_upgrade, mob/user) + for(var/obj/item/mecha_parts/mecha_equipment/rcd/rcd_equip in flat_equipment) + if(rcd_equip.internal_rcd.install_upgrade(rcd_upgrade, user)) + return diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index 0789216400c..e9d7f5a1e1f 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -35,13 +35,14 @@ return FALSE return ..() -///proc called when a new non-mmi/AI mob enters this mech +///proc called when a new non-mmi mob enters this mech /obj/vehicle/sealed/mecha/proc/moved_inside(mob/living/newoccupant) if(!(newoccupant?.client)) return FALSE if(ishuman(newoccupant) && !Adjacent(newoccupant)) return FALSE add_occupant(newoccupant) + mecha_flags &= ~PANEL_OPEN //Close panel if open newoccupant.forceMove(src) newoccupant.update_mouse_pointer() add_fingerprint(newoccupant) @@ -92,6 +93,7 @@ brain_obj.set_mecha(src) add_occupant(brain_mob)//Note this forcemoves the brain into the mech to allow relaymove + mecha_flags &= ~PANEL_OPEN //Close panel if open mecha_flags |= SILICON_PILOT brain_mob.reset_perspective(src) brain_mob.remote_control = src diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index 766826e8f5a..a77381fe97a 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -19,6 +19,11 @@ //we can reach it and it's in front of us? grab it! if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) ore.forceMove(ore_box) + for(var/obj/item/boulder/boulder in range(1, src)) + //As above, but for boulders + if(boulder.Adjacent(src) && ((get_dir(src, boulder) & dir) || boulder.loc == loc)) + boulder.forceMove(ore_box) + ///Plays the mech step sound effect. Split from movement procs so that other mechs (HONK) can override this one specific part. /obj/vehicle/sealed/mecha/proc/play_stepsound() diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 76d8b4613fa..826a746c849 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -97,7 +97,7 @@ data["capacitor_rating"] = capacitor?.rating data["weapons_safety"] = weapons_safety - data["enclosed"] = enclosed + data["enclosed"] = mecha_flags & IS_ENCLOSED data["cabin_sealed"] = cabin_sealed data["cabin_temp"] = round(cabin_air.temperature - T0C) data["cabin_pressure"] = round(cabin_air.return_pressure()) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 9bc6ea75751..711da429cca 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -17,11 +17,11 @@ MECHA_POWER = 1, MECHA_ARMOR = 1, ) + mecha_flags = CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE wreckage = /obj/structure/mecha_wreckage/ripley mech_type = EXOSUIT_MODULE_RIPLEY possible_int_damage = MECHA_INT_FIRE|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT accesses = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) - enclosed = FALSE //Normal ripley has an open cockpit design enter_delay = 10 //can enter in a quarter of the time of other mechs exit_delay = 10 /// Custom Ripley step and turning sounds (from TGMC) @@ -75,10 +75,10 @@ movedelay = 4 max_temperature = 30000 max_integrity = 250 + mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_CABIN_AIR_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT armor_type = /datum/armor/mecha_ripley_mk2 wreckage = /obj/structure/mecha_wreckage/ripley/mk2 - enclosed = TRUE enter_delay = 40 silicon_icon_state = null @@ -186,7 +186,7 @@ /obj/vehicle/sealed/mecha/ripley/paddy/preset accesses = list(ACCESS_SECURITY) - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | ID_LOCK_ON + mecha_flags = CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE | ID_LOCK_ON equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/paddy_claw, @@ -206,7 +206,7 @@ lights_power = 7 wreckage = /obj/structure/mecha_wreckage/ripley/deathripley step_energy_drain = 0 - enclosed = TRUE + mecha_flags = CAN_STRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE enter_delay = 40 silicon_icon_state = null equip_by_category = list( diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 39b78b99f62..7ef79cb89cf 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -14,6 +14,7 @@ /obj/vehicle/ridden/janicart/Initialize(mapload) . = ..() + register_context() update_appearance() AddElement(/datum/element/ridable, /datum/component/riding/vehicle/janicart) GLOB.janitor_devices += src @@ -85,6 +86,44 @@ if (!.) try_remove_bag(user) +/obj/vehicle/ridden/janicart/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(!held_item) + if(occupant_amount() > 0) + context[SCREENTIP_CONTEXT_LMB] = "Dismount" + context[SCREENTIP_CONTEXT_RMB] = "Dismount" + if(trash_bag) + context[SCREENTIP_CONTEXT_RMB] = "Remove trash bag" + if(is_key(inserted_key) && occupants.Find(user)) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove key" + return CONTEXTUAL_SCREENTIP_SET + else if(trash_bag) + context[SCREENTIP_CONTEXT_LMB] = "Remove trash bag" + context[SCREENTIP_CONTEXT_RMB] = "Remove trash bag" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/storage/bag/trash) && !trash_bag) + context[SCREENTIP_CONTEXT_LMB] = "Add trash bag" + context[SCREENTIP_CONTEXT_RMB] = "Add trash bag" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/janicart_upgrade) && !installed_upgrade) + context[SCREENTIP_CONTEXT_LMB] = "Install upgrade" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/screwdriver) && installed_upgrade) + context[SCREENTIP_CONTEXT_LMB] = "Remove upgrade" + return CONTEXTUAL_SCREENTIP_SET + + if(is_key(held_item) && !is_key(inserted_key)) + context[SCREENTIP_CONTEXT_LMB] = "Insert key" + context[SCREENTIP_CONTEXT_RMB] = "Insert key" + return CONTEXTUAL_SCREENTIP_SET + else if (trash_bag) + context[SCREENTIP_CONTEXT_LMB] = "Insert into trash bag" + context[SCREENTIP_CONTEXT_RMB] = "Insert into trash bag" + return CONTEXTUAL_SCREENTIP_SET /** * Called if the attached bag is being qdeleted, ensures appearance is maintained properly diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 4b3849bc2af..af6fd0a3617 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1590,7 +1590,7 @@ if(loaded_item.custom_price) return TRUE -/obj/machinery/vending/custom/ui_interact(mob/user) +/obj/machinery/vending/custom/ui_interact(mob/user, datum/tgui/ui) if(!linked_account) balloon_alert(user, "no registered owner!") return FALSE diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index dabf334c1f9..7c4a2c9578d 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -13,7 +13,7 @@ /obj/item/computer_disk/ordnance = 10, /obj/item/computer_disk/quartermaster = 10, /obj/item/computer_disk/command/captain = 3, - /obj/item/modular_computer/pda/heads = 10, + /obj/item/modular_computer/pda = 10, ) refill_canister = /obj/item/vending_refill/cart default_price = PAYCHECK_COMMAND diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index 1a2589fcdf1..d8229121490 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -44,11 +44,11 @@ if(isliving(user)) var/mob/living/living_user = user if(!(machine_stat & NOPOWER) && !istype(living_user.get_idcard(TRUE), /obj/item/card/id/advanced/prisoner)) - speak("No valid labor points account found. Vending is not permitted.") + speak("No valid prisoner account found. Vending is not permitted.") return return ..() -/obj/machinery/vending/sustenance/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) +/obj/machinery/vending/sustenance/labor_camp/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) if(!istype(paying_id_card, /obj/item/card/id/advanced/prisoner)) speak("I don't take bribes! Pay with labor points!") return FALSE @@ -66,7 +66,7 @@ paying_scum_id.points -= price_to_use return TRUE -/obj/machinery/vending/sustenance/fetch_balance_to_use(obj/item/card/id/passed_id) +/obj/machinery/vending/sustenance/labor_camp/fetch_balance_to_use(obj/item/card/id/passed_id) if(!istype(passed_id, /obj/item/card/id/advanced/prisoner)) return null //no points balance - no balance at all var/obj/item/card/id/advanced/prisoner/paying_scum_id = passed_id diff --git a/code/modules/wiremod/components/action/speech.dm b/code/modules/wiremod/components/action/speech.dm index 4bf735cf82b..0e2936bcfbf 100644 --- a/code/modules/wiremod/components/action/speech.dm +++ b/code/modules/wiremod/components/action/speech.dm @@ -31,5 +31,5 @@ if(message.value) var/atom/movable/shell = parent.shell - shell.say(message.value, forced = "circuit speech | [key_name(parent.get_creator())]") + shell.say(message.value, forced = "circuit speech | [parent.get_creator()]") TIMER_COOLDOWN_START(shell, COOLDOWN_CIRCUIT_SPEECH, speech_cooldown) diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index ebabd211f70..39f33809073 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -174,6 +174,7 @@ qdel(input_port) if(parent) SStgui.update_uis(parent) + return null //explicitly set the port to null if used like this: `port = remove_input_port(port)` /** * Adds an output port and returns it @@ -203,6 +204,7 @@ qdel(output_port) if(parent) SStgui.update_uis(parent) + return null //explicitly set the port to null if used like this: `port = remove_output_port(port)` /** @@ -340,6 +342,7 @@ if(length(input_ports)) . += create_ui_notice("Power Usage Per Input: [power_usage_per_input]", "orange", "bolt") + /** * Called when a special button is pressed on this component in the UI. * diff --git a/config/game_options.txt b/config/game_options.txt index 9facff0d0d9..cba1254d9c6 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -568,3 +568,32 @@ DISALLOW_TITLE_MUSIC ## This is primarily useful for developing tutorials. If you have a proper DB setup, you ## don't need (or want) this. #GIVE_TUTORIALS_WITHOUT_DB + +## Configuration for station traits of each type. +## The first value (key) is the budget, or the space available to use for station traits of that type. Some take more space than others. +## The second value (assoc) is the weight associated with said budget compared to the rest for that type. +POSITIVE_STATION_TRAITS 0 8 +POSITIVE_STATION_TRAITS 1 4 +POSITIVE_STATION_TRAITS 2 2 +POSITIVE_STATION_TRAITS 3 1 + +NEUTRAL_STATION_TRAITS 0 10 +NEUTRAL_STATION_TRAITS 1 10 +NEUTRAL_STATION_TRAITS 2 3 +NEUTRAL_STATION_TRAITS 2.5 1 + +NEGATIVE_STATION_TRAITS 0 8 +NEGATIVE_STATION_TRAITS 1 4 +NEGATIVE_STATION_TRAITS 2 2 +NEGATIVE_STATION_TRAITS 3 1 + +# Uncomment to disable Quirk point balancing for the server and clients. +# If enabled, players will be able to select positive quirks without first selecting negative quirks. +# If enabled, randomized Quirks will still use points internally, in order to maintain balance. +#DISABLE_QUIRK_POINTS + +# The maximum amount of positive quirks one character can have at roundstart. +# If set to -1, then players will be able to select any quantity of positive quirks. +# If set to 0, then players won't be able to select any positive quirks. +# If commented-out or undefined, the maximum default is 6. +MAX_POSITIVE_QUIRKS 6 diff --git a/config/maps.txt b/config/maps.txt index a0425d1a31b..2ceaf19b9ff 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -86,3 +86,8 @@ endmap map kilostation votable endmap + +map kilostation + maxplayers 75 + votable +endmap diff --git a/config/skyrat/skyrat_config.txt b/config/skyrat/skyrat_config.txt index 3e9132026da..e676b54d086 100644 --- a/config/skyrat/skyrat_config.txt +++ b/config/skyrat/skyrat_config.txt @@ -149,5 +149,19 @@ VETERAN_LEGACY_SYSTEM ## How much time arrivals shuttle should stay at station after its engines recharged before returning to interlink. In deciseconds. 150 - 15 seconds. 0 - disables autoreturn. ARRIVALS_WAIT 150 +## LOWPOP MEASURES + +## Enables or disables the lowpop system entirely. +# LOWPOP_MEASURES_ENABLED + +## The threshold for enabling/disabling the lowpop system LIVE. It's updated every so often(see below). +LOWPOP_THRESHOLD 10 + +## The lowpop subsystem fire rate. It does actions each time it fires.(default is 10 minutes) +LOWPOP_SUBSYSTEM_FIRE 6000 + ## Uncomment to make veteran quirks and jobs available to everybody #BYPASS_VETERAN_SYSTEM + +## Uncomment to enable the age prompt system; It asks players for their date of birth upon entry and denies players below a certain age. +#AGE_PROMPT_SYSTEM diff --git a/dependencies.sh b/dependencies.sh index 157afa16ef2..04e1fb62404 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -5,10 +5,10 @@ # byond version export BYOND_MAJOR=515 -export BYOND_MINOR=1620 +export BYOND_MINOR=1630 #rust_g git tag -export RUST_G_VERSION=3.0.0 +export RUST_G_VERSION=3.1.0 #node version export NODE_VERSION=14 diff --git a/html/changelogs/AutoChangeLog-pr-1007.yml b/html/changelogs/AutoChangeLog-pr-1007.yml deleted file mode 100644 index 81d6d95ace2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1007.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nevimer" -delete-after: True -changes: - - rscadd: "Shortcuts to internet relays are now on the top menu bar." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1015.yml b/html/changelogs/AutoChangeLog-pr-1015.yml deleted file mode 100644 index 01b5bc438a1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1015.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IgiariValkyr" -delete-after: True -changes: - - rscadd: "Centcom Administration has moved to the Interlink" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1018.yml b/html/changelogs/AutoChangeLog-pr-1018.yml deleted file mode 100644 index 8466358e07c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1018.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - code_imp: "Switches the emergancy shuttle to Centcom instead of the Interlink" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1019.yml b/html/changelogs/AutoChangeLog-pr-1019.yml deleted file mode 100644 index f2337cee3b7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1019.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Sylphet" -delete-after: True -changes: - - rscadd: "added vertical variants of the pride flags used in biodome" - - image: "resprited horizontal pride flags used in biodome" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1022.yml b/html/changelogs/AutoChangeLog-pr-1022.yml deleted file mode 100644 index d9fd37362ca..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1022.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - qol: "Crew monitor consoles receive a new firmware update to address recent complaints, removing the low health alarm on DNR and low sensor settings" - - code_imp: "Introduced get_dnr() proc" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1032.yml b/html/changelogs/AutoChangeLog-pr-1032.yml deleted file mode 100644 index acb99f19658..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1032.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender, SpaceManJim (sprites)" -delete-after: True -changes: - - rscadd: "Animated raptorborg sprites" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1035.yml b/html/changelogs/AutoChangeLog-pr-1035.yml deleted file mode 100644 index 8552f1e6d6a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1035.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Thlumyn, Arta/Maxi for the sprites" -delete-after: True -changes: - - rscadd: "Added peacock tails" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1036.yml b/html/changelogs/AutoChangeLog-pr-1036.yml deleted file mode 100644 index 9c04ec20259..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1036.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "xXPawnStarrXx" -delete-after: True -changes: - - rscadd: "Added new bounties for inmates." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1041.yml b/html/changelogs/AutoChangeLog-pr-1041.yml deleted file mode 100644 index a20ab2ff886..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1041.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "theselfish" -delete-after: True -changes: - - rscadd: "Donator item." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1043.yml b/html/changelogs/AutoChangeLog-pr-1043.yml deleted file mode 100644 index 78ead36cc04..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1043.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: " Removes the ability for Seedlings to have multiple harvests." - - balance: "Sets Evil Seedling TC cost to 2 (From 8)," \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1044.yml b/html/changelogs/AutoChangeLog-pr-1044.yml deleted file mode 100644 index 4fb4f164b45..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1044.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "theselfish" -delete-after: True -changes: - - rscadd: "Donator stamp." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1047.yml b/html/changelogs/AutoChangeLog-pr-1047.yml deleted file mode 100644 index dbe6f6e57d7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1047.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "YakumoChen" -delete-after: True -changes: - - rscdel: "After the introduction of the Multisec Vendor, stations are no longer shipped with an additional Redsec vendor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1054.yml b/html/changelogs/AutoChangeLog-pr-1054.yml deleted file mode 100644 index f90a48852b9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1054.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "pixelkitty286" -delete-after: True -changes: - - rscadd: "Door sounds from Citrp" - - qol: "Better door sounds" - - sound: "added door sound files in modular sounds folder" - - code_imp: "Disabled skyrat's door sound over rides in airlock.dm" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1055.yml b/html/changelogs/AutoChangeLog-pr-1055.yml deleted file mode 100644 index 3697fb2be26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1055.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "pixelkitty286" -delete-after: True -changes: - - rscadd: "F3-LINE" - - image: "added felibot_all.dmi" - - code_imp: "modular robot_model.dm" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1058.yml b/html/changelogs/AutoChangeLog-pr-1058.yml deleted file mode 100644 index c7211e34990..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1058.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ReturnToZender, Gax (Sprites)" -delete-after: True -changes: - - rscadd: "Vale clownborg sprites are now available!" - - bugfix: "Fancy raptors have had their hat bounce fixed, Syndicate raptors have their headlamp overlays properly implemented." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1060.yml b/html/changelogs/AutoChangeLog-pr-1060.yml deleted file mode 100644 index 9f8b7ca8fe3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1060.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Removes Slaughter Demons from the wizard spellbook." - - balance: "Laughter Demons cost 2 points (instead of 1), and are limited to 1 purchase per wizard." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1063.yml b/html/changelogs/AutoChangeLog-pr-1063.yml deleted file mode 100644 index e3ec153b359..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1063.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AtoriBirb" -delete-after: True -changes: - - image: "added white/black sprites for worn/in hand." - - code_imp: "added variant code to krav maga sec gloves" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1068.yml b/html/changelogs/AutoChangeLog-pr-1068.yml deleted file mode 100644 index 81f5b3f17b6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1068.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "TealSeer" -delete-after: True -changes: - - bugfix: "Dropdown options for quirks should now function properly" - - bugfix: "Randomize button in character prefs should look normal" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1070.yml b/html/changelogs/AutoChangeLog-pr-1070.yml deleted file mode 100644 index 27dc19b7a1f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1070.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - bugfix: "Fixes some Moonstation things (Fixes mining shuttle not having power, Honkbot in clown's room starts unconstructed, Fixes missing Bar lighting, Fixes missing emergency atmos in maint, Fixes missing robodrobe)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1071.yml b/html/changelogs/AutoChangeLog-pr-1071.yml deleted file mode 100644 index a76ca523865..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1071.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Replaces the Oh Hi Daniel shuttle with a similar shuttle." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1072.yml b/html/changelogs/AutoChangeLog-pr-1072.yml deleted file mode 100644 index c508b3b5f7d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1072.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kepteyn" -delete-after: True -changes: - - rscadd: "Added a xenomorph plushie." - - rscadd: "Added a xenomorph maid plushie.\n:cl:" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1076.yml b/html/changelogs/AutoChangeLog-pr-1076.yml deleted file mode 100644 index f79096be7ff..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1076.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "pixelkitty286" -delete-after: True -changes: - - sound: "Add synth_scary.ogg synth_error.ogg synth_startup.ogg synth_shutdown.ogg" - - code_imp: "modular synth_emotes.dm" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1083.yml b/html/changelogs/AutoChangeLog-pr-1083.yml deleted file mode 100644 index 86a162ecbb0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1083.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cyprex" -delete-after: True -changes: - - server: "We've added a new relay, located in the city of Singapore!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1085.yml b/html/changelogs/AutoChangeLog-pr-1085.yml deleted file mode 100644 index 180b2e428e5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1085.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - spellcheck: "The nobility dresscoat has been reflavored to not be nobility" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1091.yml b/html/changelogs/AutoChangeLog-pr-1091.yml deleted file mode 100644 index ffac0e96a02..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1091.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - image: "Sexy snoodle plushie inhand sprite" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1096.yml b/html/changelogs/AutoChangeLog-pr-1096.yml deleted file mode 100644 index 958ee2a856f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1096.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ReturnToZender" -delete-after: True -changes: - - server: "cleans up some relay names" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1099.yml b/html/changelogs/AutoChangeLog-pr-1099.yml deleted file mode 100644 index 9b442e9a8db..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1099.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "NithaIsTired" -delete-after: True -changes: - - rscadd: "Synths now scream in agony when they die." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1101.yml b/html/changelogs/AutoChangeLog-pr-1101.yml deleted file mode 100644 index 2b0bb3807c5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1101.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Swiftfeather" -delete-after: True -changes: - - rscdel: "Door sounds from Citrp" - - qol: "better door sounds" - - sound: "changed sound back to better original airlock sound" - - code_imp: "re enables skyrat's door sound override" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1104.yml b/html/changelogs/AutoChangeLog-pr-1104.yml deleted file mode 100644 index 7294f7b0bc2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1104.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AtoriBirb" -delete-after: True -changes: - - image: "Security Beanie" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1105.yml b/html/changelogs/AutoChangeLog-pr-1105.yml deleted file mode 100644 index e9dab78b046..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1105.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3 (code)" -delete-after: True -changes: - - server: "Makes relay text display properly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-734.yml b/html/changelogs/AutoChangeLog-pr-734.yml deleted file mode 100644 index 1a3b2d7d107..00000000000 --- a/html/changelogs/AutoChangeLog-pr-734.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "ReturnToZender" -delete-after: True -changes: - - rscadd: "role restriction to the tactical boots" - - rscadd: "two more goobers to the pinwheel list" - - rscdel: "restricted_roles on the mech suit, so anyone can wear it" - - bugfix: "/datum/armor/none added to the colorable arm wraps in loadout" - - rscdel: "redundant mech suit" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-851.yml b/html/changelogs/AutoChangeLog-pr-851.yml deleted file mode 100644 index af60067511d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-851.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "ReturnToZender, LT3, Waterpig" -delete-after: True -changes: - - rscadd: "NSFW flavor text (for players and silicons)" - - rscadd: "New examine panel with slightly bigger font, easier to read, also integrates most of the new preferences" - - rscadd: "Flavor text requirements now respect silicon flavor text, thanks to @lessthnthree" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-860.yml b/html/changelogs/AutoChangeLog-pr-860.yml deleted file mode 100644 index 617334362b9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-860.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Organs that rot now create miasma. Note that miasma emissions will stop once the organ is fully decayed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-863.yml b/html/changelogs/AutoChangeLog-pr-863.yml deleted file mode 100644 index f97d4e67aaa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-863.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "Add bloodsuckers, a new reason to fear maintenance and the dark. Don't go out there alone, or you might wake up pale and fainting." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-865.yml b/html/changelogs/AutoChangeLog-pr-865.yml deleted file mode 100644 index e99d23ad8bc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-865.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "The Crab17 uplink item cannot spawn in surplus crates, nor can it be discounted." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-875.yml b/html/changelogs/AutoChangeLog-pr-875.yml deleted file mode 100644 index 66bfd7b1507..00000000000 --- a/html/changelogs/AutoChangeLog-pr-875.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SarmentiCampbell" -delete-after: True -changes: - - balance: "removed abductor's wounds immunity and delimbs." - - balance: "Normal Zombies, not infectious types are no longer immune to pressure." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-881.yml b/html/changelogs/AutoChangeLog-pr-881.yml deleted file mode 100644 index 2e62bdd73eb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-881.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - qol: "Subtler sound can now be toggled in game prefs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-885.yml b/html/changelogs/AutoChangeLog-pr-885.yml deleted file mode 100644 index bdc9848c8b2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-885.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nevimer" -delete-after: True -changes: - - bugfix: "dnr behavior is consistent again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-887.yml b/html/changelogs/AutoChangeLog-pr-887.yml deleted file mode 100644 index 01b86acab12..00000000000 --- a/html/changelogs/AutoChangeLog-pr-887.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - qol: "Synth computers now show the current charge of the synth" - - qol: "Synth power cord now charges you more than before" - - balance: "Synth computer capacity is now back to 64, from Skyrat 32" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-895.yml b/html/changelogs/AutoChangeLog-pr-895.yml deleted file mode 100644 index 85263d2714b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-895.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "lilBlovy" -delete-after: True -changes: - - rscadd: "Taurs_Types.dms folder" - - rscadd: "NagaFat Sprites" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-910.yml b/html/changelogs/AutoChangeLog-pr-910.yml deleted file mode 100644 index 1f95cb03af6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-910.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "YakumoChen" -delete-after: True -changes: - - rscadd: "Security, HoS, Captain, Blueshield, and Centcom roles have had armour booster modules built into their modsuits. Most do not reduce the slowdown of your suit (except the HoS one)" - - balance: "Armour values in said modsuits have been halved across the board, with the lost values moved to the armour boosters." - - balance: "Effectively, armour in EVA combat is severely nerfed for everyone except the syndicate who already had armour boosters." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-918.yml b/html/changelogs/AutoChangeLog-pr-918.yml deleted file mode 100644 index 1248d45da06..00000000000 --- a/html/changelogs/AutoChangeLog-pr-918.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - rscadd: "Runechat message colour is now a character preference" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-920.yml b/html/changelogs/AutoChangeLog-pr-920.yml deleted file mode 100644 index 5c6aae515cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-920.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - image: "Colorable jean skirt is now adjustable" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-921.yml b/html/changelogs/AutoChangeLog-pr-921.yml deleted file mode 100644 index eb3a43c8558..00000000000 --- a/html/changelogs/AutoChangeLog-pr-921.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscadd: "Adds Moon Station" - - rscdel: "Removes Burgerstation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-927.yml b/html/changelogs/AutoChangeLog-pr-927.yml deleted file mode 100644 index 595d8b3cb50..00000000000 --- a/html/changelogs/AutoChangeLog-pr-927.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "MefAnneFeminene" -delete-after: True -changes: - - rscadd: "New Russian Flag sprite" - - code_imp: "description of Russian flag changed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-928.yml b/html/changelogs/AutoChangeLog-pr-928.yml deleted file mode 100644 index 44198b82f09..00000000000 --- a/html/changelogs/AutoChangeLog-pr-928.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Blob Fake Announcements are now followed by a clarification 60 to 180 seconds later." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-937.yml b/html/changelogs/AutoChangeLog-pr-937.yml deleted file mode 100644 index a65034432a8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-937.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Deek-Za" -delete-after: True -changes: - - rscadd: "Added redsec armor and belt reskin option" - - bugfix: "Adjusted redsec boots sprite to be more in-line with peacekeeper style" - - image: "Added new sprite for redsec gloves in peacekeeper style" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-942.yml b/html/changelogs/AutoChangeLog-pr-942.yml deleted file mode 100644 index 780ab5324c4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-942.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Sylphet" -delete-after: True -changes: - - bugfix: "added cmo turtleneck/skirtleneck to garment bag" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-947.yml b/html/changelogs/AutoChangeLog-pr-947.yml deleted file mode 100644 index 58cd80a24c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-947.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - rscdel: "Removes broken stealthmerge change" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-948.yml b/html/changelogs/AutoChangeLog-pr-948.yml deleted file mode 100644 index 5021cb88b49..00000000000 --- a/html/changelogs/AutoChangeLog-pr-948.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - bugfix: "Biodome now has the bitrunner vendor" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-952.yml b/html/changelogs/AutoChangeLog-pr-952.yml deleted file mode 100644 index d723266eeed..00000000000 --- a/html/changelogs/AutoChangeLog-pr-952.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - rscadd: "The syndicate access override on the Dauntless now includes the radio key" - - rscadd: "Windows on Dauntless robotics" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-953.yml b/html/changelogs/AutoChangeLog-pr-953.yml deleted file mode 100644 index b7ef91b92d6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-953.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "Observing works again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-958.yml b/html/changelogs/AutoChangeLog-pr-958.yml deleted file mode 100644 index d6f512e98cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-958.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - bugfix: "Morgue trays and freezing temperatures will no longer husk bodies" - - bugfix: "Organs outside bodies will properly receive cold damage" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-959.yml b/html/changelogs/AutoChangeLog-pr-959.yml deleted file mode 100644 index ad6046872cf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-959.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - bugfix: "You can no longer dodge nose boops if you have a sensitive snout" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-960.yml b/html/changelogs/AutoChangeLog-pr-960.yml deleted file mode 100644 index 1fc7f8feb00..00000000000 --- a/html/changelogs/AutoChangeLog-pr-960.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "theselfish" -delete-after: True -changes: - - rscadd: "ACTUALLY REALLY Lets Clown and Mime slots be opened again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-964.yml b/html/changelogs/AutoChangeLog-pr-964.yml deleted file mode 100644 index f98edad1c14..00000000000 --- a/html/changelogs/AutoChangeLog-pr-964.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "thegrb93" -delete-after: True -changes: - - rscadd: "Borg dominatrix module to lustwish that gives them some dominatrix toys" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-966.yml b/html/changelogs/AutoChangeLog-pr-966.yml deleted file mode 100644 index d49a36d3609..00000000000 --- a/html/changelogs/AutoChangeLog-pr-966.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - bugfix: "Character directory will show all fields without resizing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-969.yml b/html/changelogs/AutoChangeLog-pr-969.yml deleted file mode 100644 index 7bd0b0e726d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-969.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - balance: "gives medical borgs back their crew monitors" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-972.yml b/html/changelogs/AutoChangeLog-pr-972.yml deleted file mode 100644 index 102d78d8814..00000000000 --- a/html/changelogs/AutoChangeLog-pr-972.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - rscdel: "The mask FOV is gone" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-973.yml b/html/changelogs/AutoChangeLog-pr-973.yml deleted file mode 100644 index ada2e5a6a28..00000000000 --- a/html/changelogs/AutoChangeLog-pr-973.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "aKromatopzia" -delete-after: True -changes: - - rscadd: "digitigrade cybernetic legs, and the ability to select them in preferences" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-975.yml b/html/changelogs/AutoChangeLog-pr-975.yml deleted file mode 100644 index a9ccd98bd84..00000000000 --- a/html/changelogs/AutoChangeLog-pr-975.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - config: "Adjusted population thresholds for certain random events" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-982.yml b/html/changelogs/AutoChangeLog-pr-982.yml deleted file mode 100644 index 93e46fbf304..00000000000 --- a/html/changelogs/AutoChangeLog-pr-982.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Balances or outright removes some wizard spells." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-983.yml b/html/changelogs/AutoChangeLog-pr-983.yml deleted file mode 100644 index 0e2acd0ca7a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-983.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - balance: "Reworks or removes some wizard events so they're more roleplay friendly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-985.yml b/html/changelogs/AutoChangeLog-pr-985.yml deleted file mode 100644 index 512560be994..00000000000 --- a/html/changelogs/AutoChangeLog-pr-985.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BurgerBB" -delete-after: True -changes: - - rscdel: "Removes/rewords some Gimmick objectives, and adds some new ones." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-986.yml b/html/changelogs/AutoChangeLog-pr-986.yml deleted file mode 100644 index 11d4e5fd847..00000000000 --- a/html/changelogs/AutoChangeLog-pr-986.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Kyogon" -delete-after: True -changes: - - rscadd: "The new MultiSec vendor, containing all the Security clothing in one." - - rscadd: "A new custom sprite for the MultiSec vendor." - - rscdel: "Insertion file for Civil Protection suits, moving them into native vendor lists." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-988.yml b/html/changelogs/AutoChangeLog-pr-988.yml deleted file mode 100644 index beb9a3192fc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-988.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Majkl-J" -delete-after: True -changes: - - rscadd: "Secmed huds are now available for security medics" - - rscadd: "Secmed headset upgraded into a bowman" - - image: "Icons for secmed huds and secmed headset" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-989.yml b/html/changelogs/AutoChangeLog-pr-989.yml deleted file mode 100644 index d9759e5eb6d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-989.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Huskil & Orion" -delete-after: True -changes: - - rscadd: "Added cowprint bra and underwear" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-993.yml b/html/changelogs/AutoChangeLog-pr-993.yml deleted file mode 100644 index bae88e4fe46..00000000000 --- a/html/changelogs/AutoChangeLog-pr-993.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nevimer" -delete-after: True -changes: - - rscadd: "Malf AI Doomsday now makes a tidal wave of explosions from APC's." \ No newline at end of file diff --git a/html/changelogs/archive/2024-01.yml b/html/changelogs/archive/2024-01.yml index 3530b95d0ef..b98b0453365 100644 --- a/html/changelogs/archive/2024-01.yml +++ b/html/changelogs/archive/2024-01.yml @@ -1,54 +1,750 @@ -2024-01-05: +2024-01-01: + A.C.M.O.: + - bugfix: Fixed the Automatic Robotic Factory, making its cooldown timers visible + to ghosts. + - bugfix: Fixed the Automatic Robotic Factory to stop processing when it breaks + or loses power. + - balance: Balanced the Automatic Robotic Factory by adding a 60 second cooldown + for spawning cyborgs. GoldenAlpharex: - bugfix: Vending machines now display the proper color customization options and item quantities again! - Kraseo: - - rscadd: Gives Shadekin their own eyes. Functionally they are the same as human - eyes. - - image: Added Shadekin eye sprites. - LT3: - - bugfix: The missing cold drink vending machines have been found in storage - Majkl-J: - - rscdel: Removes Opposing force button from the screen, use the verb in the OOC - tab - - rscdel: Removes Hide/Show Mutant parts button from modsuits, use the verb in the - IC tab - MefAnneFeminene: - - rscadd: 1 new flag - - image: added 4 new sprites, modified 4 sprites - - code_imp: 2 flags changed (name and description) - - rscadd: Galactic Common language - - rscadd: Interslavic Language - - rscdel: Pan-Slavic Language - - rscdel: Sol Common language - - bugfix: Loadout name for Sol Flag + Melbert: + - refactor: Refactored the area transformation colossus crystal effect to use the + same system dimensional anomalies use. That means the colossus crystal now has + access to some dimensional themes (bamboo, plasma, glass) and the dimensional + anomaly now has access to some colossus themes (jungle, alien). + Nova Sector: + - qol: The names and descriptions of every paxilmaniac weapon have been improved + to be shorter (names) and mention at least what bullet the weapon fires (description) + - qol: Every weapon with an extended description has a hint in its normal examine + telling you that you can look further to get more info on the weapon + - code_imp: Two instances of now-deleted weapons paths (which i found out about + through someone getting one in a christmas tree) existing due to manufacturer + examines of all things have been cleaned up, players wont notice this one i + think + - rscadd: 'New quirk for those who hate their appendix: Appendicitis Survivor! A + positive (-2) quirk.' + - bugfix: fixed the confetti loaded shotgun shells + - rscadd: Re-Adds Cat Scream to the list of available screams to choose in character + creation + - bugfix: clockcult slab now lets you change tabs once again + - bugfix: colonial cloaks and imperial police cloaks can now carry suit storage + items when worn in the suit slot. + - image: modified many sprites for Vox Primalis, they will have a broader wardrobe + now + - rscadd: Chitter emote has a different sound effect, unless you're a moth + - rscadd: Nanotrasen's Fashion Department released some new masquerade masks, available + in single or split colors, with an optional feather! They can be found in every + AutoDrobe, and they were even approved to be brought from home! + - image: Said masquerade masks are available for all head shapes, whether it be + the standard, the snouted, the Teshari, the Vox and even the Vox Primalis! + - bugfix: NIFsoft settings panel now works once again SkyratBot: - - bugfix: fixes textarea input boxes not updating on prop change (such as changing - tabs) + - qol: added screentips to the janicart (pimpin' ride) + - bugfix: fixed fire extinguisher cabinets not appearing opened after removing the + fire extinguisher from them - bugfix: Dropdowns and pop-up menus have been rewritten. This should fix an issue where dropdown text was accidentally scrolling if hovered. Please report any issues on the repo + - bugfix: Cyborgs do not deathgasp twice when dying anymore - refactor: hygeinebots are now basic bots. please report all the bugs - bugfix: fixes hygenebots not being able to patrol - rscadd: hygeinebots can now be controlled by Players + - bugfix: The sustenance vendor in perma actually serves food now + - bugfix: fixes textarea input boxes not updating on prop change (such as changing + tabs) + - rscadd: Atmos Holofan projectors can be right-clicked inhand to make their holograms + more transparent + Useroth: + - rscadd: Added kilostation and its automapper templates. +2024-01-02: + Iamgoofball: + - bugfix: Re-enables the Detective's Replacement Revolver(ID-locked) Goodie Crate + being purchasable since all NT guns are being removed from imports and the Detective's + revolver is job gear that needs to be able to be replaced by Cargo + SkyratBot: + - image: resprited the Pirate/Sailor costumes, the pirate jacket, and the pirate + spacesuit + - bugfix: Protolathe input should feel more responsive. + - qol: The "Explosive Planted" alert for C4 actually shows the C4 + - bugfix: Fixed footstep sounds. + - bugfix: Having an inorganic chest/legs no longer makes you drop your ID, belt + or pocketed stuff upon losing your jumpsuit + - qol: Toggling an armour booster module on a MODsuit now gives a balloon alert + making the tradeoffs more clear. + - qol: Gas analyzer can scan adjacent turfs. No more roasting yourself just to scan + your burn mix. + - rscadd: Added new lizard variants of existing foods for equality of edibility. + - qol: made pickle jars reusable and vinegar craftable. + - bugfix: you can set the chemical reaction chamber temps to 0k again + - bugfix: used higher rounding value for reactions thus you get full volumes especially + for endothermic reactions(no more 99.99 but 100 units). + - bugfix: chem heater now applies heat per reaction step and sends updates to UI + more frequently + - bugfix: slamming through a glass table while previously on a table no longer gives + you a negative offset. + - rscadd: A new heretic path opens up! Gaze up at the great sky for the path of + the moon opens and the lie shall be slain in pursuit of ultimate truth! + - bugfix: Fixes the syndicate delusion not working +2024-01-03: + Lutowski: + - rscadd: Sunflower crown, poppy crown, lily crown and floral garland added to loadout. + - rscadd: Black Gas Mask added to loadout. + SkyratBot: + - bugfix: turbine now shuts itself off when the room apc loses power or if it gets + damaged. Also uses a small amount of power for operation of internal electronics, + the green light & other stuff + - bugfix: No more runtime in turbine computer when parts are not fully connected + - qol: adds screentips & examines for turbine + - code_imp: removed unused vars, auto doc procs and cleans up some code in turbine + - image: Improved sprites for sailor school uniform + - bugfix: Fixed integrated circuit speech logging + - refactor: attack_slime is completely gone + - refactor: slime lifestate changes now have less boilerplate code + - balance: baby slimes do a bit of a less damage on the low end, but all slime damage + is much more consistent + - balance: instead of taking half brute damage, cyborgs are now immune to slime's + melee attacks. Charged slimes attacking cyborgs now lose a bit of charge. They + still get massive damage from charged slimes, and every slime attack flashes + them. + - bugfix: slimes can now properly drain basic mobs and simple animals that they + can damage + - bugfix: slimes can drift in zero gravity + Vishenka0704: + - admin: The ability to export a part(or z-level) of the map has been added. + xXPawnStarrXx: + - balance: removed funny crystal from researcher, added low tier mining loot. + - image: new xenoarch tool sprites. +2024-01-05: + LT3: + - bugfix: Alternate carpet colors will no longer reskin to normal carpet + - bugfix: OOC announcements will now be in shown in OOC colors + Melbert: + - bugfix: Fixed Fugu Gland applying to mobs incorrectly + - bugfix: Some things which affect everything in an area are less laggy, the "all + lights are broken" station trait especially + - bugfix: Fixed runtime from blobbernauts attacking non-living things + SkyratBot: + - bugfix: the moon heretic ascension now produces lunatics again + - bugfix: 'TGUI: Sections should be scrollable on mouse hover' + - refactor: Introduced a simple budget system to station traits, so that smaller + things only count as half a trait, for example. + - balance: Increased the odds and maximum number of station traits that can be rolled + each shift. + - bugfix: 'Birdshot: Released gulag prisoners can now get off the gulag shuttle.' + - bugfix: 'Birdshot: The gulag shuttle airlocks will now cycle like other airlocks.' + - bugfix: Universal scanners are no longer invisible when set to the export or sales + tagger modes. + - bugfix: Fixed redundant "Integrity:" in air alarms + - bugfix: you no longer fall down cliffs if you dont have gravity + - bugfix: fixes some runtimes in pathfinding code, as well as one in the give direct + control admin verb + - admin: Amputation Shear amputation is now logged + - bugfix: fixed a runtime in datum/thrownthing + - bugfix: closets now have a working welder deconstruct screentip + - bugfix: Gibtonite ore on ice planet gulags no longer spawns as lavaland rock. + - bugfix: stationary medbots will no longer ignore u for a while if u move out of + their way while healing + - code_imp: progressbars no longer qdel their /image + - bugfix: food made with drying racks now counts as "chef-made" (ergo, can provide + a mild buff). + - bugfix: Guardian host's ability buttons now works while the host is sleeping/unconscious. + - bugfix: 'Icebox: Added a fire alarm to the upstairs fore primary hallway.' + - qol: Path of moon and lock now actually fit in the heretic tree + - balance: Certain path of moon rituals that needed brains now use easier to obtain + organs + - bugfix: fixed an /image hard del in ghost code StrangeWeirdKitten: - - balance: Nerfs Horror Form - YakumoChen: - - balance: You can no longer purchase armour booster modules for MODsuits from emagged - cargo console imports + - bugfix: Quick reflexes now properly dodge snout boops + jjpark-kb: + - bugfix: ashies will now egg respawn properly again +2024-01-06: + Melbert: + - bugfix: Strong arm implant users can shove more correctly. + SkyratBot: + - bugfix: you can use your hand to make minebots go into combat mode again + - bugfix: conveyor belts no longer maintain movement if whatever is on them suddenly + leaves their z level + - bugfix: Cyborgs no longer think they're hitting themselves when stunned with a + stun baton + - bugfix: Search bars for smaller lists should return to their former responsiveness. + - bugfix: fixes an /image harddel in station blueprints + - code_imp: cleaned up some more /image qdels + - qol: The hub entry shows the next map and shuttle time, and no longer shows the + alert + - image: resprited onmob cone icon. + - bugfix: fixes an image hard del + - code_imp: adds context to image hard dels to make them easier to track + - rscadd: Reworked Binoculars to function like a scope from long-range rifles. They + also can be used while moving, albeit that'll slow you down significantly. + - rscadd: Authentic mothic softcaps can be found in the "Mothic Pioneer" curator + kit, which googles can also used to look into the distance. The date on the + boxed kit has been updated to match "muh lore". + - qol: Using a scope (and now binocs or moth cap) won't hide your mouse pointer + away now, so that you won't slip out of the game screen and close the game tab + by accident. + - bugfix: the eZ-13 MK2 heavy pulse rifle does damage again + - spellcheck: Corrects every misspelled 'kenetic' in the codebase. + - spellcheck: Fixed punctuation in Luini Amaretto's description. + - image: Throwing things has now a sprite animation forward your target. + - sound: Throwing things also has a sound accompagnying it. + - spellcheck: Dwarves don't throw things hard like hulks. Instead their throws are + described as "flimsily". + - bugfix: Having a netpod destroyed will no longer grant you permanent healing. + - bugfix: After a raid on the local drug mafia in the sector by TerraGov, the Russian + Mobsters no longer have access to easy drugs and as a result are no longer 24/7 + running faster than the average spaceman. + - bugfix: Queen bee's made with cytology now work + SomeRandomOwl: + - bugfix: Build Mode Export's options menu now knows when you want to cancel and + not change the options +2024-01-07: + LT3: + - bugfix: Morgue trays and freezing temperatures will no longer husk bodies + - bugfix: Organs outside bodies will properly receive cold damage + SkyratBot: + - balance: Instead of too much damage to the head beheading someone, it will now + split their skull in half. While their skull is open, you can rip out their + eyes with your hands. and they will spill their brain out of their head if they + slip. + - balance: The Path of Blades ascension will accept either a beheaded person, or + someone with their skull split open. + - rscdel: Removed the beheading objectives from traitor. + - bugfix: Hub shuttle time works correctly + - bugfix: Papers no longer crash tgui + - bugfix: Biogenerator no longer crash tgui + - bugfix: Randomization button in prefs should look normal again. + - bugfix: Quirk customization shouldn't close immediately. + Stalkeros, Zergspower, Paxilmaniac, Vinylspiders, Nova: + - refactor: refactors all(?) modular items to a standard list format (zergspower) + - rscadd: Ancient Military Simulator got some of the previously implemented items + back, i.e. CIN weaponry and DeForest medkits + - balance: Ancient Military Simulator, generally speaking, became more 'rigid' and + straightforward + - balance: Ancient Military Simulator prize room has been moved deeper into SNPC + compound to prevent drakes from flying in early. + - bugfix: Ancient Military Simulator should no longer break down into space tiles + on wall explosions + - rscadd: The CO2 Cracker makes a return, a device that takes power and turns ambient + CO2 into ambient oxygen, handy! + - rscadd: The portable recycler has been added, a machine that lets you recycle + stuff autolathe-style, clang! + - rscadd: The hydroponics chemical synthesizer has been added, the sister to the + water synthesizer, makes all of the basic botany chemicals to work with reagent + pipes. + - rscadd: The sustenance dispenser makes a return, dispense yourself some powdered + coffee or nutraslop today! + - rscadd: The organic rations printer has been added, a little biogenerator-type + machine specializing in food specifically. An excellent kitchen buddy for the + supply-deprived cook. + - image: Sprites for all the listed new machines were made by me, Paxilmaniac. +2024-01-08: + SkyratBot: + - bugfix: The clown planet biodome and virtual domain can now be completed without + slipping directly into the exit. + - bugfix: adds missing navigation landmarks to tramstation + - refactor: some very large tgui lists (air alarms, all recipes techfab view, techweb + view) are loaded on-demand as you scroll, making them not lag so hard + - qol: It is now possible to craft more Security bio suits + - qol: Bio-emergency crate from Cargo now contains a box of latex gloves and sterile + masks + - bugfix: fixed coupon codes with expiration times. + - rscadd: Adds a geared assistant station trait! Spawn with a skateboard, toolbelt + or in your favorite bee suit! + - code_imp: Moves assistant code around + - bugfix: vents that are turned off dont replay their animation if you go out of + sight and back in + - bugfix: spasm_animation now correctly resets the transform, as it should + - bugfix: Fixed H.A.R.S. fucking up the brains a little. + - bugfix: Jumping to C4 via ghost notification works again + - bugfix: Comms console should now update as you type. + cherdaq: + - rscadd: added a hairstyle + - image: added an icon state to SR hair.dmi + - code_imp: added required code to hair.dm + fIoppie: + - qol: Cargo techs can now access the windoor in the delivery office on Delta. + jjpark-kb: + - rscadd: added cargo tele upgrade and forging upgrade to cargo borgs + - qol: you can click drag some items to the forge now (fuel, ores, imbuing) + theselfish: + - rscadd: Skyrat races now produce butcher results closer to their ancestors. Cannibals + rejoice. +2024-01-09: + Melbert: + - bugfix: '"The sister and He Who Wept" Heretic painting will no longer cause big + lag' + SkyratBot: + - bugfix: Spamming the weld on a robotic part no longer drains the fuel + - qol: Ghosts can now view Wanted Status and Sec Records by examining people +2024-01-10: + LT3: + - bugfix: Unencoded server admin announcements will now actually broadcast + Melbert: + - bugfix: Carps now migrate slightly better, probably. + - bugfix: And Poly now talks better, probably. + SkyratBot: + - bugfix: The HoP's cartridge vending machine now sells regular PDAs instead of + base command ones. + - bugfix: Dynamic midround rolls will properly consider roundstart players as part + of the living population again, allowing antagonists with a minimum population + value to spawn when they should be able to. + - bugfix: Players who observe before roundstart can be considered for midround ghost + roles again. + - bugfix: Some antagonists which had elements that scale with living station population + now function properly again. + - bugfix: Ripley MK-Is and Paddys now correctly make incoming projectiles hit the + pilot again. + - bugfix: Medical records console should be useable again + - bugfix: popup screen locs will work on clients >1614. Security cameras and Spyglass + will work + - admin: Fixed the bluescreen in the centcom pod launcher. + - bugfix: Eldritch reagent (the one that heals heretics) now heal heretic monsters + rather than kill them. +2024-01-11: + Melbert: + - bugfix: Lionhunter Rifle is now available at the same point as Mawed Crucible, + making it available to all paths again. + - bugfix: Lock knowledge now goes the correct order. Mark -> Ritual -> Unique item, + rather than backwards. + - balance: Blood cultists can now convert a Null Rod into a cult weapon on an offer + rune. The strength of the weapon it is converted into depends on how many cultists + the Chaplain crit / killed with it. At five or more, it will turn into a Bastard + Sword. Note, sacrificing someone holding a Null Rod will automatically convert + it after they are gibbed. + - balance: Heretics no longer produce a Bastard Sword upon cult conversion. They + are still immune to cult stun and cannot be converted by blood cultists. + SkyratBot: + - bugfix: Certain areas are now properly protected against grid check. Namely the + supermatter should consistently be protected. + - image: Resprited a majority of undershirts + - bugfix: Fixed the Codex Cicatrix always requiring a dead body, despite the description + saying leather or a hide would work too. + - bugfix: Pipeguns no longer have floating bayonets + - bugfix: The various borg apparatuses can no longer pick up other internal borg + tools. + - bugfix: ejecting cells from microwaves via ctrl click now requires player proximity. + - bugfix: Refried beans and Spanish rice now lets you take the bowl back after eating + it. +2024-01-13: + LT3: + - bugfix: Icebox kitchen has its light switch again + - bugfix: Icebox medbay hallway now has a fire alarm + Melbert: + - bugfix: Ghost alert for buying a badass balloon should have a proper icon + - bugfix: Blood Drunk Miner (Hunter version) should dash a bit more. + - admin: Several types are now more accessible via the "spawn" verb (and friends), + meaning you can type 'Spawn" Modsuit' or 'Spawn "Jumpsuit' in the command bar + and it'll just give you a list of modsuits or jumpsuits to pick from. + - bugfix: Fixes some cult spells being unable to heal constructs (blood rites particularly) + - bugfix: Fix Ringleader's Rise not causing as many hallucinations as expected + - bugfix: Chameleon Suits will now automatically set your helmet into a hood if + using a hooded suit again + - bugfix: Lunar Parade has the potential to break less. + Rhials: + - bugfix: Specialty drinks crafted in the crafting menu will now create the intended + reagents, instead of containing the reagents used to craft it. + SkyratBot: + - qol: ID cards now set their accounts with Alt-Right click. + - bugfix: ID cards now once again have contextual screen tips showing what buttons + do what actions. + - bugfix: if your voice changes (e.g. through a voice changer or changeling mimicry) + your runechat will now appear as the mob you are speaking in the voice of + - bugfix: when doing emotes with your face obscured, your runechat color will now + appear as either that of Unknown or the mob you are wearing the id of (if you + are wearing a mask with someone else's id) + - admin: Made logging for BSA targeting and firing easier to find for admins. + - bugfix: Healing simplemobs with sutures and other stacks works again + - spellcheck: Healing mobs with medical stacks like suture and mesh give better + user feedback messages + - code_imp: smart fridge content overlay now uses `base_icon_state` instead of a + separate var + - bugfix: The "required_container_accepts_subtypes" variable on chemical reactions + now actually works again + - code_imp: The check that prevents your stuff from dropping when you have robotic + parts is now more robust + - qol: If you can't heal a body part, you won't get a healing time delay. No more + spending 5 seconds healing a body part only to get a "can't heal that" message. + - bugfix: Fixed being able to download the contractor program on the syndie store. + - qol: The heat-proof catwalk made by heat-proof rods will go away when a tile is + placed on it, rather than sticking around and needing to be removed manually + - bugfix: The lighting will not irreparably break on tiles where plating was placed + on lava-proof catwalks + - code_imp: Some single letter variables and the structure of the code around placing + tiles on lava-proof catwalks has been improved + - admin: Added a new admin verb that ends all active weather within the weather + subsystem. + - bugfix: Fixed misfiring for firearms like tinkered detective revolvers. + - bugfix: Dropdowns should be more performant + - code_imp: removed a dupe trait entry in the traits_by_type list + - bugfix: The deployable component will now actually stop rotating things when the + variable to not do that is set + - balance: Nightmare's Light Eater can now stun targets under certain conditions. + - image: New liquid plasma sprites from SS14! aKromatopzia: - - rscadd: Added tesshvali cybernetics, under the company name Ceremi Cybernetics. - - image: added teshvali cybernetic sprites. quite WIP - - server: client prefs got changed. good luck that it doesnt break anything. which - it doesnt - - bugfix: ACTUALLY enables teshvali cybernetics - - rscadd: advanced raptoral cybernetics - - bugfix: some vars that were added in the downstream are now correctly implemented. - - code_imp: banned_species var, which is an inverse of restricted_species in purpose. - - code_imp: you can't join certain ghost roles with ashwalker or icedwellers anymore. - nevimer: - - bugfix: ntr gets locker access again - zeroisthebiggay: - - rscdel: random map vote chances - - rscdel: random transfer vote chances - - server: the map vote no longer has a modifier that makes it inconsistent + - rscadd: dept armband sprites for teshari + - rscadd: allergy dogtag sprites for teshari + thegrb93: + - rscadd: Borg dominatrix module to lustwish that gives them some dominatrix toys +2024-01-14: + LT3: + - bugfix: Tramstation east APC will no longer be destroyed when the tram crashes + - qol: Tramstation central power and disposals moved out of the wall + thegrb93: + - rscadd: Blood filter to medical borg + - rscadd: Added cherry jelly and vineger to service borg shakers + - rscdel: Remove redundant service borgshaker +2024-01-15: + Melbert: + - bugfix: Anomalies spawned by grand ritual runes sound act more like anomalies + SkyratBot: + - bugfix: Rat King's abilities no longer require the user to click twice in order + to activate them. + - admin: Confirming that you have read an admin message now uh, works. it's been + 2 years bros + - bugfix: Animals enlargened by the fugu gland are now visually aligned with the + turf they're standing on. + - qol: The combat mode toggle button is now present on the HUD for simple and basic + mobs. + - bugfix: chem heater with empty buffers can be refilled again + - bugfix: Changeling eggs laid by headslugs work again + - bugfix: Changeling egg incubation times should feel much more consistent, hatching + after 4 minutes + - bugfix: Borg tools that hold and use specific items now work correctly again. + - bugfix: Fixed round event controller pirate spawns. +2024-01-16: + Gandalf2k15: + - qol: For all the mappers out there, stationary batteries come with pre-charged + variants now for mapping use + - bugfix: SMES can now be deconstructed normally again + - code_imp: The flatpacked stationary batteries have much more readable power amounts + now + - qol: Much like their non-powertool counterpart, powered drivers on wirecutter + mode can now snip cablecuffs. + - bugfix: Deployable thermomachines now correctly put their pipe's visual direction + the right way + - bugfix: Silicon temp ftext overlay now works + - bugfix: Silicon temp ftext popout window now works + LT3: + - bugfix: Fixed missing power cable outside Tramstation medbay + Melbert: + - bugfix: Fixes some eldritch painting messages having no chat span + - bugfix: Fixes eldritch painting messages triggering before the examine, making + it hard to see + - bugfix: Fix beauty eldritch painting doing nothing to heretics who examine it + SkyratBot: + - bugfix: Poppers (like the prefs menu options) shouldn't be hidden beneath the + character preview anymore. + - bugfix: Sections will be more polite by not stealing focus from Input boxes in + TGUI +2024-01-17: + SkyratBot: + - qol: Using a Lawyer badge in your hand now shows a thought bubble with the badge, + rather than giving a lousy message in your chat. + - image: the plumbing chemical splitter no longer has a wrongly rotated direction + - bugfix: Signers no longer use the wrong verb when speaking directly into a radio + for the first message after toggling sign language. + - refactor: Moved the updating of verb variables into a new method which is called + earlier in living's say, which should avoid this happening for other things + which updated their verbs the same way. + jjpark-kb: + - rscadd: the bluespace miner will now produce more sheets depending on the matter + bins' tier + - rscadd: the bluespace miner is now also found through bepis-tech + - rscadd: the bluespace miner is now wrenchable, it won't work unanchored though +2024-01-18: + SkyratBot: + - refactor: Refactored Ore Silo Ui. + - bugfix: Immobile shells no longer work regardless of anchor state if you put the + circuit in while it's unanchored. + - bugfix: Immobile shells properly propagate their on/off state after wrenching + to inner modules. + - refactor: Implant pads now use TGUI + - bugfix: Radiation shelters (wherever they are) will protect against nebula storms + - image: Resprited several fishes, and the aquarium. + - refactor: Ice cream vats now use a radial menu instead of an HTML one. + - bugfix: fix bileworm ai going insane after eating someone + - bugfix: Lock heretics may once again access 'the relentless heartbeat' after purchasing + 'burglars fineness'. + - bugfix: Bystanders will no longer think they've pulled out a victim's eyes after + seeing someone else do it. + - qol: They will also be able to tell when someone starts pulling out a victim's + eyes. + - code_imp: slightly cleans up dance machine code + - bugfix: disco dances are less comparable to having a seizure + - qol: Players are now able to see in chat when they are being hit by obj/machinery, + got crushed into dense turf or get hit by thrown non carbon mob. + - admin: Scenarios like mob hits dense turf, obj/machinery hits mob, item without + "living thrower" hitting mob, mob gets hit by thrown non carbon mob now appear + in logs. + - rscadd: Most fishing rods come with a hook and line preinstalled. Fishing toolboxes + come with separate reel and lines as usual. + - balance: Fishing hooks are now required to fish. + - balance: Without a reel line, the range of fishing rods is reduced by two tiles. + Conversely, having one installed gives a mild buff to the minigame completion + speed. + - balance: The craftable sinewy reel line can now be used to fish on lava or liquid + plasma, but it's a bit harder to use. + - balance: The rare-to-find-in-maintenance master fishing rod now comes with a flexible + line and weighted hook preinstalled, and has better range than other rods. + - balance: Fishing reel lines are now small enough to fit pockets. + - rscadd: The rescue and jawed hook can now snag and reel in mobs, not only items. + The jawed hook also slows down when applied, a la beartrap. + - qol: Fish bounties now accept filled (stasis) fish cases. + - qol: Several balloon alerts for fishing rod interactions. + - bugfix: Reeling in items (and mobs) now respects movement resistance and anchorage. + - bugfix: Fixed the fishing rod equipment UI being too small to fit its components. + - sound: Reeling in something now plays a sound. +2024-01-19: + SkyratBot: + - code_imp: removed the timeout_mod arg from add_mood_event, which was only used + for one thing and causes more issues than it's worth + - bugfix: Moodlets with parameters/effects e.g. limb reattachment moodlets should + probably disappear more appropriately. + - code_imp: Hub status shows if server is restarting, starting, time to start. The + "Time" is more accurate and based on roundstart now + - bugfix: Autolathes no longer allow you to duplicate materials at higher levels + of stock parts + - qol: Autolathes now show name instead of typepath when selecting a custom material + - qol: Autolathe now print out items one by one instead of waiting for all of them + to print at once + YakumoChen: + - rscadd: New cannibal "chicken" sandwich made from vox and teshari + - bugfix: Gave birdman and aquatic meat proper food types + theselfish: + - rscadd: Paper ERPers rejoice. You can now stamp stuff in the Cafe. +2024-01-20: + SkyratBot: + - bugfix: fix a runtime when loading ghosts to a mulebot + - rscadd: Shields (and pillows) can be used to shove people around the same way + barehanded right-clicking does. Xenos and borgs can actually be moved this way. + - rscadd: Added a new MODsuit module, the bulwark module, which prevents knockdown + and staggering from shoving, and getting pushed away by thrown objects. Inbuilt + for the safeguard MODsuit, but one might also it in the black market. + - refactor: Disarming has been refactored. You can now shove simple critters onto + tables and into bins and closets + - balance: Shields now take their own armor values and the armor penetration of + the attack they blocked when damaged. This means shields are a bit sturdier + now. + - balance: Riot shields can tank a lot more damage against melee weapons, but less + against bullets. + - qol: strobe shields can now be used to bash people while combat mode is on. + - bugfix: Hub time should be correct again + - image: The "One Lean, Mean, Cleaning Machine" achievement now has its own icon. +2024-01-21: + Gandalf2k15: + - rscadd: A system for making lowpop less unbearable, namely an automatic recharging + system for SMES'. + Melbert: + - bugfix: Items and mobs no longer hide behind big runes (heretic, cult, wizard) + Momo8289, Pepsilawn, Sinsinins, JohnFulpWillard: + - bugfix: Clown ops now get a code set for their nuke. + Rhials: + - spellcheck: Modifies some existing Emergency Shuttle prerequisite messages, and + adds some missing ones. + SkyratBot: + - bugfix: Borgs now use the hug module to substitute for hands, allowing them to + finish previously unfinishable surgeries + - bugfix: The map saving tool will no longer lock up and prevent all further action + at random + - bugfix: Map saving now takes on the order of seconds, not minutes + - bugfix: Fixes an issue with lists that caused strongdmm to report saved maps as + broken + - bugfix: cyborg inducer respects cell changes + - bugfix: Monkeys don't get stuck on obstacles as often. + - bugfix: fixes whispering formatting + - bugfix: Filled trash bags show up properly when worn. + - bugfix: Icebox perma's cytology lab is now useable without outside repairs. + - image: The honkbot now looks up to date. + - bugfix: Prototype emitters now work. + - bugfix: Prototype emitters don't go invisible if screwdriver'd open. + - bugfix: Emitters no longer show up as their panel being closed when it is open. + - bugfix: Lunatics spawned from moon ascension now actually have an objective to + assist their ringleader + - bugfix: Lunatics now get a moonlight amulette on the ground if they have full + hands + - bugfix: fixes megafauna AI getting stuck attacking some corpses + - bugfix: Fixes how the aquarium looks. + YakumoChen: + - image: headshots now support lensdump as a host. + jjpark-kb: + - balance: xenoarch machines will now default take 10 seconds instead of 20 to do + their process + - rscadd: the xenoarch researcher can now create lavaland loot, anomalous crystals, + or bepis tech + - rscadd: the xenoarch machines will now be affected by both their stock parts + - bugfix: you can now wrench, screwdriver, and crowbar the xenoarch machines + xXPawnStarrXx: + - image: new GAGs variant for croptop sweater. +2024-01-22: + Lutowski: + - rscadd: Fluffier than ever before, moths can now have hair & facial hair. + SkyratBot: + - bugfix: Tool arm implant hotkeys will properly work even after you change your + arm/species now. + - bugfix: Nanotrasen is now stocking proper french Cognac instead of discount Irish + Cognac. It will now taste Smooth and French + - bugfix: fixed some visual artifacts from achievement icons. + - rscadd: Modular Computers now support integrated circuits. What can be done with + them depends on the programs installed and whether they're running (open or + background). + - rscadd: Modular Consoles (the machinery) now have a small backup cell they draw + power from if the power goes out. + - bugfix: Wagging tail spines now sync up properly with the tails they're attached + to. +2024-01-24: + SkyratBot: + - sound: APCs actually play the tool sound when exposing their wires. + - spellcheck: iron sheets's what? + - bugfix: Goldgrubs should no longer spit out things that aren't ore (e.g. stasised + mobs from the polymorph belt). +2024-01-26: + LT3: + - bugfix: You can no longer interact with medical beds while incapacitated + - bugfix: Fixed alignment of RPG titles + - bugfix: Server announcements again no longer escape HTML by default + Melbert: + - bugfix: Click CD applies to looking up and down correctly. + - bugfix: Replacing a limb fully claimed by an infested burn wound now properly + grants you control of the limb back + - bugfix: Losing control of a limb now sounds less weird in chat + - bugfix: Fixed AIs who shunt to APCs causing their laws to be deleted. + SkyratBot: + - bugfix: Contractor support units now don't have flavortext telling them they work + for someone else but their agent. + - bugfix: Contractor support units now comes in an antag spawner (like syndicate + monkey, nukie borgs/reinforcements). + - bugfix: Syndicate monkeys now get their monkey antag datum. + - bugfix: pAIs downloaded while in a PDA now gets the action button to control said + PDA. + - bugfix: pAI cards can now be ejected from a PDA when there is no pAI inhabiting + it. + - bugfix: Kidnapping traitor objective now properly returns the victim to the station + with their items + - bugfix: The smelter and refinery now properly hold mining points, only taking + a small amount out of net gained points. + - bugfix: fixes a spurious CI failure from do_charge() signal overrides + - bugfix: Moved the curator's treasure hunter fedora up by a single pixel. + - bugfix: Missing fire alarms added to several rooms on Birdshot + - qol: added more screen tips & examines for ore silo, made UI wider, attach location + name to each machine & grey out paused machines to make it more noticeable. + - code_imp: auto docs proc & vars for silo log entry. Fixed return values of all + tool acts + - bugfix: ore silo UI now functions correctly after removing an entry from the UI + - bugfix: no runtimes when connecting a machine to silo that was previously disconnected + via the ore silo UI + - bugfix: reactions that create multiple reagents now terminate without looping + endlessly. + - bugfix: oatmeal reactions now terminate & produce the right quantity of results + but without milk. + - refactor: Refactored Ore Processing Unit UI. + - bugfix: Ore Processing Unit UI no longer lags client. + - bugfix: fixes features not updating when changing character slots + - refactor: Stock market events are now their own objects, and are handled by the + stock market individually. + - bugfix: The library console's category search box now displays the category being + searched. + - bugfix: the blur effects for hallucinogenic withdrawal and psychic projection + are now properly centered on the screen + - bugfix: fixes runtime when mineral scanning, passes right argument for scanner + in golem eyes +2024-01-27: + JohnFulpWillard, Unit2E teaching me the TEG: + - bugfix: The TEG now works again (still unobtainable by regular means though). + - bugfix: the TEG and its circulators can now be rotated counterclockwise again. + - refactor: The TEG now uses a TGUI interface rather than the old HTML one. + Melbert: + - bugfix: You can no longer neck snap anyone with martial arts assuming you've got + someone in a tight grip. + SkyratBot: + - bugfix: items that contain recursive contents inside them (like foam dart boxes + from autolathes) now have their custom materials set to match with its design + cost rather than being nullified, meaning they are now recyclable. + - code_imp: all custom materials are now integer values. Improved code for how materials + are used in techfab & auto lathe for printing + - bugfix: Icebox will no longer spawn a fuck ton of plasma after gibonite blows. + YW besties + - refactor: airlock controllers now use tgui + - refactor: Newspapers now use TGUI. + - bugfix: Fixed the newscaster's wanted section showing a non-existent photo. + - bugfix: fixes a hard del with decals + - bugfix: Fixed the messenger circuit not sending messages. + - bugfix: Added several ports to modpc circuits that were missing or needing them. + - bugfix: Fixes ever-expanding ports whenever circuits are re-inserted in a modular + computer. +2024-01-28: + Useroth: + - rscadd: Jukeboxes added to automapper, to spawn in open areas in the bar + - rscadd: Ported BurgerLUA's jukebox overhaul from bubber (https://github.com/Bubberstation/Bubberstation/pull/552) + - rscadd: Added an age prompting system. + - server: Added a new SQL table for keeping some of the data declared by players + - rscadd: EZDB will now apply our modular sql schema when used during development +2024-01-29: + LT3: + - bugfix: Emergency shuttle console now only works while on the emergency shuttle + Melbert: + - bugfix: Rush Gland now triggers correctly on being grabbed by a Goliath + SkyratBot: + - bugfix: Removed kitten omniscience. (They stop pointing at you now.) + - refactor: Legions abilities have been changed into actions that can be added to + any mob. + - bugfix: Oppenheimer, the nukie medbot, has been reprogrammed to use Airplane Mode + as a factory default. The station AI is no longer immediately aware of his presence! + - spellcheck: shortened description for the PCM and capitalized some text for its + examines. + - code_imp: adds sanity checks and removed deprecated `content` tag from PCM UI. + Stops hologram items from being inserted. + - spellcheck: You no longer fail to find "a anything" when swabbing something for + cytology that doesn't have swabbing results. + - bugfix: Cats can be swabbed for feliform cells again. + - sound: Cats have had their mastery of silent walking revoked, and have their pitter-pattering + footsteps back again. + - refactor: 'Refactored Telecommunications Monitoring Console UI: added search bar, + made UI more compact.' + - image: Added an icon to the "My Watchlist Status is Not Important" achievement. +2024-01-30: + A.C.M.O.: + - config: Added two new config flags for quirks, DISABLE_QUIRK_POINTS and MAX_POSITIVE_QUIRKS. + LT3: + - bugfix: Tramstation external atmos ports are now properly connected + Melbert: + - bugfix: You can build on some niche tables again, such as the Wabbajack Altar. + - bugfix: Wizarditis Timestop now has the desired effect. + - admin: Admins can now VV Timestop to make the caster not immune to their own Timestop. + If they really wanted. + Rhials: + - bugfix: The encrypted bitrunner cache is now impervious to most conventional means + of destruction. + SkyratBot: + - image: Resprited the goldfish and lanternfish as well. + - bugfix: Rootbread soup now uses poached egg (egg reagents in soup pot) instead + of raw unpeeled egg (which would break into reagents upon coming into contact + with the soup pot) and is thus craftable again. + - bugfix: The hub time should be accurate for servers with different timezones + - bugfix: auto lathes don't hog local apc supply when printing items + - bugfix: Blobs sitting on APCs no longer break them when already broken, and so + no longer spam the power down noise. + - bugfix: The construction console drone becomes visible again while its in use + - spellcheck: typos fixed in the fireproof clothing religious rite + - bugfix: pesto pizza (cooked) is no longer raw, and cilbir is meat instead of fruit + - bugfix: sets minimum volume of reagent allowed to exist inside anything to 0.01 + therefore allowing plumbing iv drip small transfer rates to occur without reagents + disappearing. + - bugfix: Bone daggers and shivs are now longer electrically conductive + - bugfix: Ambient loops will now refresh when entering a mob. + - bugfix: Jerry Tramstation can get laid again! (Fixed cat breeding.) + - rscdel: The lathe tax on printing items has been removed from the game for both + humans and silicons. + - refactor: Husk icons are now dynamically generated. See if you can identify what + species it was! + - bugfix: ' The buttons for flashers on birdshot/tramstation now work' + - bugfix: fixes a runtime that sometimes happens in ai controllers + Zergspower: + - bugfix: fixes the missing ARC Mining setup in Kilo +2024-01-31: + Zenitheevee: + - bugfix: Port Tarkon's research server works correctly now. + - bugfix: Port Director now spawns with Port Director ID card + - bugfix: Port Tarkon Residents spawn with Crowbars to fix lack of them in map, + and it makes sense. diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml new file mode 100644 index 00000000000..d3aa560334a --- /dev/null +++ b/html/changelogs/archive/2024-02.yml @@ -0,0 +1,247 @@ +2024-02-01: + LT3: + - bugfix: ID card examine text shows how to set your linked bank account + - bugfix: ID card withdrawal from an unassigned account will ask if you want to + link an account + - bugfix: Tram power consumption will no longer will randomly drain APCs + - bugfix: Tram power moved to area based rectifiers + Melbert: + - bugfix: Fixed ore vent descriptions looking weird sometimes + - bugfix: Fixed being able to scan an ore vent multiple times at once + - bugfix: Fixed gaining scan points from scannning an ore vent without finishing + the scan + SkyratBot: + - bugfix: Cult pylons will no longer cover up "open space" (or water) with cult + floors + - bugfix: fixed ore vent's well being drawn over ash storm. + - bugfix: makes the experiment chamber in syndicate lavaland base no longer explode + when testing grenades + - code_imp: added the code that allows the image overlays to work for the circulator + (teg) + - image: changed circulator's (teg) fast/slow turbine sprite + - image: added an anchor, panel, and flow overlay for the circulator (teg) + - bugfix: Cultists can now vote for a Cult leader again. + - bugfix: the top and top righthand doors of northstars cargo mail sorting room + now use any supply general, mining, and bitden access, and the top righthand + door no longer says its mining decontamination and uses the proper mail sorting + room airlock instead. + - bugfix: All Within Theoretical Limits should properly unlock now when the crystal + comes back from the countdown. + - bugfix: Slimes using Feed while buckled now stops feeding. + - bugfix: Slimes are no longer prompted to feed off of dead people. + - bugfix: Slimes that can only feed onto one person now immediately feeds off of + them. + - balance: Pirate suits can now hold the laser musket and smoothbore disabler. + - rscadd: '[IceBox] Botany now has a service accessible bio generator' + - qol: '[IceBox] Kitchen and service hall rearranged' + - bugfix: Mk-II Ripley exosuits are spaceproof again. + - bugfix: Converted mechs now have their lights on if they did before the conversion. + Zenitheevee: + - balance: Xenos are now more resistant to temperatures, but die faster once past + resistances. + - balance: Simple_animal Xenos now have (correctly) pressure resistant exoskeletons + Zergspower: + - bugfix: Kilo's Mining area for ARC mining + jjpark-kb: + - rscadd: adds back the teg (you can research and print it) +2024-02-03: + Arturlang: + - rscadd: Add bloodsuckers, a new reason to fear maintenance and the dark. Don't + go out there alone, or you might wake up pale and fainting. + - bugfix: Observing works again. + AtoriBirb: + - image: added white/black sprites for worn/in hand. + - code_imp: added variant code to krav maga sec gloves + - image: Security Beanie + BurgerBB: + - rscdel: ' Removes the ability for Seedlings to have multiple harvests.' + - balance: Sets Evil Seedling TC cost to 2 (From 8), + - rscdel: Removes Slaughter Demons from the wizard spellbook. + - balance: Laughter Demons cost 2 points (instead of 1), and are limited to 1 purchase + per wizard. + - bugfix: Fixes some Moonstation things (Fixes mining shuttle not having power, + Honkbot in clown's room starts unconstructed, Fixes missing Bar lighting, Fixes + missing emergency atmos in maint, Fixes missing robodrobe) + - rscadd: Replaces the Oh Hi Daniel shuttle with a similar shuttle. + - rscadd: Organs that rot now create miasma. Note that miasma emissions will stop + once the organ is fully decayed. + - balance: The Crab17 uplink item cannot spawn in surplus crates, nor can it be + discounted. + - rscadd: Adds Moon Station + - rscdel: Removes Burgerstation + - balance: Blob Fake Announcements are now followed by a clarification 60 to 180 + seconds later. + - balance: Balances or outright removes some wizard spells. + - balance: Reworks or removes some wizard events so they're more roleplay friendly. + - rscdel: Removes/rewords some Gimmick objectives, and adds some new ones. + Cyprex: + - server: We've added a new relay, located in the city of Singapore! + Deek-Za: + - rscadd: Added redsec armor and belt reskin option + - bugfix: Adjusted redsec boots sprite to be more in-line with peacekeeper style + - image: Added new sprite for redsec gloves in peacekeeper style + Huskil & Orion: + - rscadd: Added cowprint bra and underwear + IgiariValkyr: + - rscadd: Centcom Administration has moved to the Interlink + Justavidya: + - image: modified the cherry cupcake and blue-cherry cupcake sprites + Kepteyn: + - rscadd: Added a xenomorph plushie. + - rscadd: 'Added a xenomorph maid plushie. + + :cl:' + Kyogon: + - rscadd: The new MultiSec vendor, containing all the Security clothing in one. + - rscadd: A new custom sprite for the MultiSec vendor. + - rscdel: Insertion file for Civil Protection suits, moving them into native vendor + lists. + LT3: + - rscadd: Runechat message colour is now a character preference + - image: Colorable jean skirt is now adjustable + - bugfix: Morgue trays and freezing temperatures will no longer husk bodies + - bugfix: Organs outside bodies will properly receive cold damage + - bugfix: Character directory will show all fields without resizing + - config: Adjusted population thresholds for certain random events + LT3 (code): + - server: Makes relay text display properly + Lutowski: + - rscadd: Mothic language returns with its own lore blurb. + - image: Added icon for Chitinclick. + Majkl-J: + - qol: Crew monitor consoles receive a new firmware update to address recent complaints, + removing the low health alarm on DNR and low sensor settings + - code_imp: Introduced get_dnr() proc + - image: Sexy snoodle plushie inhand sprite + - qol: Subtler sound can now be toggled in game prefs + - qol: Synth computers now show the current charge of the synth + - qol: Synth power cord now charges you more than before + - balance: Synth computer capacity is now back to 64, from Skyrat 32 + - rscdel: Removes broken stealthmerge change + - bugfix: Biodome now has the bitrunner vendor + - rscadd: The syndicate access override on the Dauntless now includes the radio + key + - rscadd: Windows on Dauntless robotics + - rscdel: The mask FOV is gone + - rscadd: Secmed huds are now available for security medics + - rscadd: Secmed headset upgraded into a bowman + - image: Icons for secmed huds and secmed headset + MefAnneFeminene: + - rscadd: New Russian Flag sprite + - code_imp: description of Russian flag changed + Melbert: + - bugfix: Robocontrol app maybe works better now. + - bugfix: Fixed examining modular PCs + - refactor: Big martial arts refactor, they should now overall act a ton more consistent. + Also technically any mob can do martial arts. Let me know if something is funky. + NithaIsTired: + - rscadd: Synths now scream in agony when they die. + ReturnToZender: + - server: cleans up some relay names + - rscadd: role restriction to the tactical boots + - rscadd: two more goobers to the pinwheel list + - rscdel: restricted_roles on the mech suit, so anyone can wear it + - bugfix: /datum/armor/none added to the colorable arm wraps in loadout + - rscdel: redundant mech suit + ReturnToZender, Gax (Sprites): + - rscadd: Vale clownborg sprites are now available! + - bugfix: Fancy raptors have had their hat bounce fixed, Syndicate raptors have + their headlamp overlays properly implemented. + ReturnToZender, LT3, Waterpig: + - rscadd: NSFW flavor text (for players and silicons) + - rscadd: New examine panel with slightly bigger font, easier to read, also integrates + most of the new preferences + - rscadd: Flavor text requirements now respect silicon flavor text, thanks to @lessthnthree + ReturnToZender, SpaceManJim (sprites): + - rscadd: Animated raptorborg sprites + Rhials: + - qol: Spider eggs will now close their spawn menu when you move away from them. + SarmentiCampbell: + - balance: removed abductor's wounds immunity and delimbs. + - balance: Normal Zombies, not infectious types are no longer immune to pressure. + SkyratBot: + - rscadd: Wearing certain gloves (such as black gloves and combat oriented gloves) + allow you to cuff people faster + - balance: base handcuffing time is now 4 seconds + - balance: latex gloves now hide your fingerprints + - rscadd: There's now a small chance to be a smartass when affected by Voice of + God + - bugfix: Robotic voicebox actually lets you speak any language again (as long as + you know it). + - refactor: refactored experimentor UI to TGUI. + - rscadd: Exosuit-mounted RCDs now have the same functionality as the handheld version. + - bugfix: lathes now respect always-powered areas + - balance: lathes now use power as they print instead of all at once + - bugfix: Teleportations will no longer exceed reservation bounds. + - refactor: chemical reaction tester in runtime station has been remastered from + ground up. + - balance: Mech wire panels are now blocked when the mech is occupied. I guess it + was moved to be behind the seat. + - bugfix: Ash drake's fire breath attack has proper cooldowns again + - code_imp: Removes /obj/item/onetankbomb, assembly bombs are now handled by the + tank itself. + StrangeWeirdKitten: + - code_imp: Switches the emergancy shuttle to Centcom instead of the Interlink + - bugfix: You can no longer dodge nose boops if you have a sensitive snout + - balance: gives medical borgs back their crew monitors + Swiftfeather: + - rscdel: Door sounds from Citrp + - qol: better door sounds + - sound: changed sound back to better original airlock sound + - code_imp: re enables skyrat's door sound override + Sylphet: + - rscadd: added vertical variants of the pride flags used in biodome + - image: resprited horizontal pride flags used in biodome + - bugfix: added cmo turtleneck/skirtleneck to garment bag + TealSeer: + - bugfix: Dropdown options for quirks should now function properly + - bugfix: Randomize button in character prefs should look normal + Thlumyn, Arta/Maxi for the sprites: + - rscadd: Added peacock tails + YakumoChen: + - rscdel: After the introduction of the Multisec Vendor, stations are no longer + shipped with an additional Redsec vendor. + - rscadd: Security, HoS, Captain, Blueshield, and Centcom roles have had armour + booster modules built into their modsuits. Most do not reduce the slowdown of + your suit (except the HoS one) + - balance: Armour values in said modsuits have been halved across the board, with + the lost values moved to the armour boosters. + - balance: Effectively, armour in EVA combat is severely nerfed for everyone except + the syndicate who already had armour boosters. + aKromatopzia: + - rscadd: digitigrade cybernetic legs, and the ability to select them in preferences + jjpark-kb: + - rscadd: added the powerator (purchase-able and BEPIS-tech), a machine to sell + power for cargo credit + - rscadd: added back the default turf mining + - rscadd: boulders are now affected by your mining skill + - balance: you get more mining xp from boulders + lilBlovy: + - rscadd: Taurs_Types.dms folder + - rscadd: NagaFat Sprites + nevimer: + - rscadd: Shortcuts to internet relays are now on the top menu bar. + - bugfix: dnr behavior is consistent again + - rscadd: Malf AI Doomsday now makes a tidal wave of explosions from APC's. + nikothedude: + - spellcheck: The nobility dresscoat has been reflavored to not be nobility + pixelkitty286: + - rscadd: Door sounds from Citrp + - qol: Better door sounds + - sound: added door sound files in modular sounds folder + - code_imp: Disabled skyrat's door sound over rides in airlock.dm + - rscadd: F3-LINE + - image: added felibot_all.dmi + - code_imp: modular robot_model.dm + - sound: Add synth_scary.ogg synth_error.ogg synth_startup.ogg synth_shutdown.ogg + - code_imp: modular synth_emotes.dm + projectkepler-ru: + - rscadd: DS-2 role now all starts with some form of armament + thegrb93: + - rscadd: Borg dominatrix module to lustwish that gives them some dominatrix toys + theselfish: + - rscadd: Donator item. + - rscadd: Donator stamp. + - rscadd: ACTUALLY REALLY Lets Clown and Mime slots be opened again. + xXPawnStarrXx: + - rscadd: Added new bounties for inmates. diff --git a/icons/area/areas_station.dmi b/icons/area/areas_station.dmi index c63c333fa4c..66098018f75 100644 Binary files a/icons/area/areas_station.dmi and b/icons/area/areas_station.dmi differ diff --git a/icons/effects/cranial_fissure.dmi b/icons/effects/cranial_fissure.dmi new file mode 100644 index 00000000000..9f8f5b46021 Binary files /dev/null and b/icons/effects/cranial_fissure.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 0dd945ff37e..072fbe02558 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/eldritch.dmi b/icons/effects/eldritch.dmi index 8b7738f3b46..91fa9ff4f53 100644 Binary files a/icons/effects/eldritch.dmi and b/icons/effects/eldritch.dmi differ diff --git a/icons/effects/mouse_pointers/moon_target.dmi b/icons/effects/mouse_pointers/moon_target.dmi new file mode 100644 index 00000000000..d89cab42aa1 Binary files /dev/null and b/icons/effects/mouse_pointers/moon_target.dmi differ diff --git a/icons/effects/mouse_pointers/scope_hide.dmi b/icons/effects/mouse_pointers/scope_hide.dmi deleted file mode 100644 index a6182e8fc5f..00000000000 Binary files a/icons/effects/mouse_pointers/scope_hide.dmi and /dev/null differ diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi index 5189711bc25..87c31c8c7df 100644 Binary files a/icons/effects/ore_visuals.dmi and b/icons/effects/ore_visuals.dmi differ diff --git a/icons/effects/vent_overlays.dmi b/icons/effects/vent_overlays.dmi new file mode 100644 index 00000000000..54ac3d7a819 Binary files /dev/null and b/icons/effects/vent_overlays.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 44ef2fb0787..289d02da46a 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_full.dmi b/icons/hud/screen_full.dmi index 54931085b74..ac33631e1a0 100644 Binary files a/icons/hud/screen_full.dmi and b/icons/hud/screen_full.dmi differ diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index dd794c02aaa..7d56918846b 100644 Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index 747b57949be..ac7575d279b 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index e789546f1e8..fbe6871c92e 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index 3477cb1820a..0fd0de8e425 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/utility.dmi b/icons/mob/clothing/head/utility.dmi index 97fb52052bc..51fd3191f1b 100644 Binary files a/icons/mob/clothing/head/utility.dmi and b/icons/mob/clothing/head/utility.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index aafab9558a3..fcfdb55f522 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suits/costume.dmi b/icons/mob/clothing/suits/costume.dmi index bf4bbe310d2..3cd5770fb9a 100644 Binary files a/icons/mob/clothing/suits/costume.dmi and b/icons/mob/clothing/suits/costume.dmi differ diff --git a/icons/mob/clothing/suits/spacesuit.dmi b/icons/mob/clothing/suits/spacesuit.dmi index 4bc2d8cd7f9..3c381ecd56f 100644 Binary files a/icons/mob/clothing/suits/spacesuit.dmi and b/icons/mob/clothing/suits/spacesuit.dmi differ diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi index c8fd87f5272..26e8eec9f20 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/clothing/underwear.dmi b/icons/mob/clothing/underwear.dmi index d231b955bab..cd5564fe211 100644 Binary files a/icons/mob/clothing/underwear.dmi and b/icons/mob/clothing/underwear.dmi differ diff --git a/icons/mob/human/bodyparts.dmi b/icons/mob/human/bodyparts.dmi index 2150b3c2c81..d6e4472973a 100644 Binary files a/icons/mob/human/bodyparts.dmi and b/icons/mob/human/bodyparts.dmi differ diff --git a/icons/mob/human/species/lizard/lizard_tails.dmi b/icons/mob/human/species/lizard/lizard_tails.dmi index 8af62b32cfe..f27c1dcb390 100644 Binary files a/icons/mob/human/species/lizard/lizard_tails.dmi and b/icons/mob/human/species/lizard/lizard_tails.dmi differ diff --git a/icons/mob/human/species/monkey/bodyparts.dmi b/icons/mob/human/species/monkey/bodyparts.dmi index 689ef5e63d7..59a3a10c26c 100644 Binary files a/icons/mob/human/species/monkey/bodyparts.dmi and b/icons/mob/human/species/monkey/bodyparts.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 8a6bab69776..5d4d7c9e768 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 251458590bd..6cd0f2acebc 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/nonhuman-player/eldritch_mobs.dmi b/icons/mob/nonhuman-player/eldritch_mobs.dmi index 4e640694b2a..18e50d727ae 100644 Binary files a/icons/mob/nonhuman-player/eldritch_mobs.dmi and b/icons/mob/nonhuman-player/eldritch_mobs.dmi differ diff --git a/icons/mob/silicon/aibots.dmi b/icons/mob/silicon/aibots.dmi index a3da5c9cf2b..8949caa0299 100644 Binary files a/icons/mob/silicon/aibots.dmi and b/icons/mob/silicon/aibots.dmi differ diff --git a/icons/obj/antags/eldritch.dmi b/icons/obj/antags/eldritch.dmi index d59bf3dbdeb..7f6af6bfe2e 100644 Binary files a/icons/obj/antags/eldritch.dmi and b/icons/obj/antags/eldritch.dmi differ diff --git a/icons/obj/aquarium.dmi b/icons/obj/aquarium.dmi index 19e2e68c4f8..aa37c035791 100644 Binary files a/icons/obj/aquarium.dmi and b/icons/obj/aquarium.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 0a2bd33c4e4..5ccdf2c186f 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index f1d19c29da1..eb4b0c536ce 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/clothing/suits/costume.dmi b/icons/obj/clothing/suits/costume.dmi index 0c08b97605d..ad68aea553f 100644 Binary files a/icons/obj/clothing/suits/costume.dmi and b/icons/obj/clothing/suits/costume.dmi differ diff --git a/icons/obj/clothing/suits/spacesuit.dmi b/icons/obj/clothing/suits/spacesuit.dmi index de9c1242767..84f84ac978e 100644 Binary files a/icons/obj/clothing/suits/spacesuit.dmi and b/icons/obj/clothing/suits/spacesuit.dmi differ diff --git a/icons/obj/clothing/under/costume.dmi b/icons/obj/clothing/under/costume.dmi index bf60bb0a445..b58f96b82d9 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/debris.dmi b/icons/obj/debris.dmi index d256d1ddd6e..10b73560cbb 100644 Binary files a/icons/obj/debris.dmi and b/icons/obj/debris.dmi differ diff --git a/icons/obj/devices/scanner.dmi b/icons/obj/devices/scanner.dmi index 843fd409be4..0b4a5ef4684 100644 Binary files a/icons/obj/devices/scanner.dmi and b/icons/obj/devices/scanner.dmi differ diff --git a/icons/obj/devices/tool.dmi b/icons/obj/devices/tool.dmi index cbbd05dc7fb..0d89f296761 100644 Binary files a/icons/obj/devices/tool.dmi and b/icons/obj/devices/tool.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index f7ab9fc1ad9..8e8be783fb7 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index e9468812b99..c4d93c23b0b 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/frozen_treats.dmi b/icons/obj/food/frozen_treats.dmi index b5b91520e8c..5c27454bd3f 100644 Binary files a/icons/obj/food/frozen_treats.dmi and b/icons/obj/food/frozen_treats.dmi differ diff --git a/icons/obj/food/lizard.dmi b/icons/obj/food/lizard.dmi index 7cc7bf0fcf9..15bed265e2f 100644 Binary files a/icons/obj/food/lizard.dmi and b/icons/obj/food/lizard.dmi differ diff --git a/icons/obj/food/meat.dmi b/icons/obj/food/meat.dmi index 07bc507b847..66761ee2029 100644 Binary files a/icons/obj/food/meat.dmi and b/icons/obj/food/meat.dmi differ diff --git a/icons/obj/machines/atmospherics/binary_devices.dmi b/icons/obj/machines/atmospherics/binary_devices.dmi index 407e9fc94f4..96528d420c2 100644 Binary files a/icons/obj/machines/atmospherics/binary_devices.dmi and b/icons/obj/machines/atmospherics/binary_devices.dmi differ diff --git a/icons/obj/machines/atmospherics/unary_devices.dmi b/icons/obj/machines/atmospherics/unary_devices.dmi index 6a929f211b8..47acf3c29c9 100644 Binary files a/icons/obj/machines/atmospherics/unary_devices.dmi and b/icons/obj/machines/atmospherics/unary_devices.dmi differ diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi index d6fc1afd716..91f7f434ad3 100644 Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ diff --git a/icons/obj/medical/cryogenics.dmi b/icons/obj/medical/cryogenics.dmi index bd82d4bbace..4dd33af8ce7 100644 Binary files a/icons/obj/medical/cryogenics.dmi and b/icons/obj/medical/cryogenics.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 54b19553b84..cdc886d85ac 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/mining_zones/terrain.dmi b/icons/obj/mining_zones/terrain.dmi index 4db51145eee..fd930fe709d 100644 Binary files a/icons/obj/mining_zones/terrain.dmi and b/icons/obj/mining_zones/terrain.dmi differ diff --git a/icons/obj/ore.dmi b/icons/obj/ore.dmi index 23fcb8c89ea..7cc3b882057 100644 Binary files a/icons/obj/ore.dmi and b/icons/obj/ore.dmi differ diff --git a/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi b/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi index 19775b6eff8..555b6c6328b 100644 Binary files a/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi and b/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index 9ece919c213..78cc96fabbc 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi index 6cae3e75dff..8e34ac8f8de 100644 Binary files a/icons/obj/storage/box.dmi and b/icons/obj/storage/box.dmi differ diff --git a/icons/obj/toys/dice.dmi b/icons/obj/toys/dice.dmi index 26cf08af5b9..d41e503242d 100644 Binary files a/icons/obj/toys/dice.dmi and b/icons/obj/toys/dice.dmi differ diff --git a/icons/obj/tram/tram_controllers.dmi b/icons/obj/tram/tram_controllers.dmi index 93462e0b41e..aea1f691af2 100644 Binary files a/icons/obj/tram/tram_controllers.dmi and b/icons/obj/tram/tram_controllers.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 168f9fb716c..a4c321a0543 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/obj/weapons/khopesh.dmi b/icons/obj/weapons/khopesh.dmi index ab7a0c252cb..ba9ef545f14 100644 Binary files a/icons/obj/weapons/khopesh.dmi and b/icons/obj/weapons/khopesh.dmi differ diff --git a/icons/obj/weapons/turrets.dmi b/icons/obj/weapons/turrets.dmi index 9a9d387ef96..6582671eac0 100644 Binary files a/icons/obj/weapons/turrets.dmi and b/icons/obj/weapons/turrets.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 9dca06d4153..6fc1178a6b4 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index 337793431e8..ff62bd7e374 100644 Binary files a/icons/ui_icons/achievements/achievements.dmi and b/icons/ui_icons/achievements/achievements.dmi differ diff --git a/modular_skyrat/master_files/code/_globalvars/regexes.dm b/modular_skyrat/master_files/code/_globalvars/regexes.dm new file mode 100644 index 00000000000..5d8db27c6b7 --- /dev/null +++ b/modular_skyrat/master_files/code/_globalvars/regexes.dm @@ -0,0 +1,5 @@ +//Any EOL char that isn't appropriate punctuation +GLOBAL_DATUM_INIT(has_no_eol_punctuation, /regex, regex(@"\w$")) + +//All non-capitalized 'i' surrounded with whitespace (aka, 'hello >i< am a cat') +GLOBAL_DATUM_INIT(noncapital_i, /regex, regex(@"\b[i]\b", "g")) diff --git a/modular_skyrat/master_files/code/_globalvars/text.dm b/modular_skyrat/master_files/code/_globalvars/text.dm new file mode 100644 index 00000000000..a7c8efec5f4 --- /dev/null +++ b/modular_skyrat/master_files/code/_globalvars/text.dm @@ -0,0 +1,8 @@ +/// Ensures sentences end in appropriate punctuation (a period if none exist) +/// and that all whitespace-bounded 'i' characters are capitalized. +/proc/autopunct_bare(input_text) + if (findtext(input_text, GLOB.has_no_eol_punctuation)) + input_text += "." + + input_text = replacetext(input_text, GLOB.noncapital_i, "I") + return input_text diff --git a/modular_skyrat/master_files/code/datums/traits/good.dm b/modular_skyrat/master_files/code/datums/traits/good.dm index 1a5a6d9d26e..aa71af7edeb 100644 --- a/modular_skyrat/master_files/code/datums/traits/good.dm +++ b/modular_skyrat/master_files/code/datums/traits/good.dm @@ -128,3 +128,42 @@ lose_text = span_danger("Somehow, you've completely cleaned yourself of glitter..") medical_record_text = "Patient seems to be looking fabulous." icon = FA_ICON_HAND_SPARKLES + +/datum/quirk/no_appendix + name = "Appendicitis Survivor" + desc = "You had a run in with appendicitis in the past and no longer have an appendix." + icon = FA_ICON_NOTES_MEDICAL + value = 2 + gain_text = span_notice("You no longer have an appendix.") + lose_text = span_danger("Your appendix has magically.. regrown?") + medical_record_text = "Patient had appendicitis in the past and has had their appendix surgically removed." + /// The mob's original appendix + var/obj/item/organ/internal/appendix/old_appendix + +/datum/quirk/no_appendix/post_add() + var/mob/living/carbon/carbon_quirk_holder = quirk_holder + old_appendix = carbon_quirk_holder.get_organ_slot(ORGAN_SLOT_APPENDIX) + + if(isnull(old_appendix)) + return + + old_appendix.Remove(carbon_quirk_holder, special = TRUE) + old_appendix.moveToNullspace() + + STOP_PROCESSING(SSobj, old_appendix) + +/datum/quirk/no_appendix/remove() + var/mob/living/carbon/carbon_quirk_holder = quirk_holder + + if(isnull(old_appendix)) + return + + var/obj/item/organ/internal/appendix/current_appendix = carbon_quirk_holder.get_organ_slot(ORGAN_SLOT_APPENDIX) + + // if we have not gained an appendix already, put the old one back + if(isnull(current_appendix)) + old_appendix.Insert(carbon_quirk_holder, special = TRUE) + else + qdel(old_appendix) + + old_appendix = null diff --git a/modular_skyrat/master_files/code/datums/votes/map_vote.dm b/modular_skyrat/master_files/code/datums/votes/map_vote.dm new file mode 100644 index 00000000000..10dea54b2fd --- /dev/null +++ b/modular_skyrat/master_files/code/datums/votes/map_vote.dm @@ -0,0 +1,3 @@ +//Map votes shouldn't be using weighted random +/datum/vote/map_vote + winner_method = VOTE_WINNER_METHOD_SIMPLE diff --git a/modular_skyrat/master_files/code/game/objects/items/tools/weldingtool.dm b/modular_skyrat/master_files/code/game/objects/items/tools/weldingtool.dm index fecef3acdaf..1379f6adf0a 100644 --- a/modular_skyrat/master_files/code/game/objects/items/tools/weldingtool.dm +++ b/modular_skyrat/master_files/code/game/objects/items/tools/weldingtool.dm @@ -1,6 +1,4 @@ /obj/item/weldingtool - /// How long it takes to weld someone else's robotic limbs. - var/self_delay = 5 SECONDS /// How long it takes to weld your own robotic limbs. var/other_delay = 1 SECONDS diff --git a/modular_skyrat/master_files/code/modules/cargo/goodies.dm b/modular_skyrat/master_files/code/modules/cargo/goodies.dm index ecc2cfa4852..10274669929 100644 --- a/modular_skyrat/master_files/code/modules/cargo/goodies.dm +++ b/modular_skyrat/master_files/code/modules/cargo/goodies.dm @@ -7,9 +7,6 @@ /datum/supply_pack/goody/rubber special = TRUE -/datum/supply_pack/goody/mars_single - special = TRUE - /datum/supply_pack/goody/Survivalknives_single special = TRUE diff --git a/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm b/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm index 58992869073..b63da97b7ee 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm @@ -7,7 +7,7 @@ maximum_value_length = MAX_MESSAGE_LEN /// Assoc list of ckeys and their link, used to cut down on chat spam var/list/stored_link = list() - var/static/link_regex = regex("i.gyazo.com|media.discordapp.net|cdn.discordapp.com") + var/static/link_regex = regex("i.gyazo.com|media.discordapp.net|cdn.discordapp.com|a.l3n.co|b.l3n.co|c.l3n.co") //gyazo, discord, lensdump var/static/list/valid_extensions = list("jpg", "png", "jpeg") // Regex works fine, if you know how it works /datum/preference/text/headshot/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/mime.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/mime.dm index 197cc86aaa8..5aae789607c 100644 --- a/modular_skyrat/master_files/code/modules/jobs/job_types/mime.dm +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/mime.dm @@ -1,2 +1,3 @@ /datum/job/mime vox_outfit = /datum/outfit/vox/mime + job_flags = STATION_JOB_FLAGS | JOB_CANNOT_OPEN_SLOTS diff --git a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/alien.dm b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/alien.dm new file mode 100644 index 00000000000..1c2c42ed739 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -0,0 +1,4 @@ +/mob/living/simple_animal/hostile/alien + maxbodytemp = 950 //If you dont want to fight them, Burn them. If you want the rewards from tarkon? Dont burn them. + unsuitable_heat_damage = 50 //Hot Acid Blood. + pressure_resistance = 200 //Exoskeleton. The likeliness of them being in high-pressure places naturally are 0% anyways. diff --git a/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm b/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm index 9c65cf4502a..9a3dd0e95a3 100644 --- a/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm +++ b/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm @@ -18,16 +18,25 @@ name = "Snail Tongue" id = "snailtongue" build_path = /obj/item/organ/internal/tongue/snail - category = list(SPECIES_SNAIL, RND_CATEGORY_INITIAL) + category = list( + SPECIES_SNAIL, + RND_CATEGORY_INITIAL, + ) /datum/design/liver/snail name = "Snail Liver" id = "snailliver" build_path = /obj/item/organ/internal/liver/snail - category = list(SPECIES_SNAIL, RND_CATEGORY_INITIAL) + category = list( + SPECIES_SNAIL, + RND_CATEGORY_INITIAL, + ) /datum/design/heart/snail name = "Snail Heart" id = "snailheart" build_path = /obj/item/organ/internal/heart/snail - category = list(SPECIES_SNAIL, RND_CATEGORY_INITIAL) + category = list( + SPECIES_SNAIL, + RND_CATEGORY_INITIAL, + ) diff --git a/modular_skyrat/master_files/code/modules/research/designs/medical_designs.dm b/modular_skyrat/master_files/code/modules/research/designs/medical_designs.dm index 29bfcc4d02e..c2beb545386 100644 --- a/modular_skyrat/master_files/code/modules/research/designs/medical_designs.dm +++ b/modular_skyrat/master_files/code/modules/research/designs/medical_designs.dm @@ -4,10 +4,14 @@ id = "cybernetic_tongue" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB construction_time = 4 SECONDS - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/organ/internal/tongue/cybernetic category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1 + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/modular_skyrat/master_files/code/modules/research/designs/misc_designs.dm b/modular_skyrat/master_files/code/modules/research/designs/misc_designs.dm index 9a253d53e7d..c8315b4190b 100644 --- a/modular_skyrat/master_files/code/modules/research/designs/misc_designs.dm +++ b/modular_skyrat/master_files/code/modules/research/designs/misc_designs.dm @@ -3,10 +3,14 @@ desc = "A fragile, circuitry embedded helmet for boosting the intelligence of a monkey to a higher level." id = "monkey_helmet" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/clothing/head/helmet/monkey_sentience category = list( - RND_CATEGORY_TOOLS + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -15,10 +19,14 @@ desc = "A type of plumbing constructor designed to manipulate fluid." id = "plumbing_eng" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 40, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 40, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/construction/plumbing/engineering category = list( - RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING @@ -27,10 +35,14 @@ desc = "An adjusted version of the medical syringe gun that only allows SmartDarts to be chambered." id = "smartdartgun" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/gun/syringe/smartdart category = list( - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -39,10 +51,14 @@ desc = "All-in-one kit containing the parts to create a portable anesthetic stand, tank not included." id = "anesthetic_machine" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/anesthetic_machine_kit category = list( - RND_CATEGORY_TOOLS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -51,18 +67,25 @@ desc = "A frame for a time clock console, contains all of the parts needed to build a new time clock" id = "time_clock_frame" build_type = PROTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/wallframe/time_clock - category = list(RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS) + category = list( + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, + ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SERVICE /datum/design/vox_gas_filter name = "Vox Gas Filter" id = "vox_gas_filter" build_type = PROTOLATHE | AUTOLATHE | COLONY_FABRICATOR - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT, + ) build_path = /obj/item/gas_filter/vox category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_GAS_TANKS_EQUIPMENT + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_GAS_TANKS_EQUIPMENT, ) departmental_flags = ALL diff --git a/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm b/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm index d1698bfd2c5..de2f1d92b40 100644 --- a/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm +++ b/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm @@ -230,6 +230,8 @@ /datum/techweb_node/cyborg_upg_util/New() design_ids += list( "borg_upgrade_clamp", + "borg_upgrade_cargo_tele", + "borg_upgrade_forging", "borg_upgrade_brush", ) return ..() diff --git a/modular_skyrat/master_files/icons/misc/language.dmi b/modular_skyrat/master_files/icons/misc/language.dmi index 94a32635b48..8b3bff440ab 100644 Binary files a/modular_skyrat/master_files/icons/misc/language.dmi and b/modular_skyrat/master_files/icons/misc/language.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi index ee271841810..815eda0d268 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi and b/modular_skyrat/master_files/icons/mob/clothing/species/teshari/accessories.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/vox/belt.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/vox/belt.dmi index b8ef83345d2..96e88beb2a8 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/species/vox/belt.dmi and b/modular_skyrat/master_files/icons/mob/clothing/species/vox/belt.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suit.dmi b/modular_skyrat/master_files/icons/mob/clothing/suit.dmi index dd76a562f7b..095fe3dbe02 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/suit.dmi and b/modular_skyrat/master_files/icons/mob/clothing/suit.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/mod.dmi b/modular_skyrat/master_files/icons/mob/mod.dmi index 7c100fd2e1e..c9579e8b11d 100644 Binary files a/modular_skyrat/master_files/icons/mob/mod.dmi and b/modular_skyrat/master_files/icons/mob/mod.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/hair.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/hair.dmi index a05c9ceebef..edfa676e46f 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/hair.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/hair.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/suits.dmi b/modular_skyrat/master_files/icons/obj/clothing/suits.dmi index bd5fb3aebba..79f62422efc 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/suits.dmi and b/modular_skyrat/master_files/icons/obj/clothing/suits.dmi differ diff --git a/modular_skyrat/modules/GAGS/greyscale_configs.dm b/modular_skyrat/modules/GAGS/greyscale_configs.dm index 62a8744a7dc..14a7dc30f78 100644 --- a/modular_skyrat/modules/GAGS/greyscale_configs.dm +++ b/modular_skyrat/modules/GAGS/greyscale_configs.dm @@ -295,6 +295,32 @@ name = "Colourable Sterile Mask (Worn) (Teshari)" icon_file = 'modular_skyrat/modules/GAGS/icons/masks_teshari.dmi' +// MASQUERADE MASKS +/datum/greyscale_config/masquerade_mask + name = "Masquerade Mask" + icon_file = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask.dmi' + json_config = 'modular_skyrat/modules/GAGS/json_configs/masquerade_mask/masquerade_mask.json' + +/datum/greyscale_config/masquerade_mask/worn + name = "Masquerade Mask (Worn)" + icon_file = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn.dmi' + +/datum/greyscale_config/masquerade_mask/worn/snouted + name = "Masquerade Mask (Worn) (Snouted)" + icon_file = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_snouted.dmi' + +/datum/greyscale_config/masquerade_mask/worn/teshari + name = "Masquerade Mask (Worn) (Teshari)" + icon_file = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_teshari.dmi' + +/datum/greyscale_config/masquerade_mask/worn/better_vox + name = "Masquerade Mask (Worn) (Vox Primalis)" + icon_file = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_better_vox.dmi' + +/datum/greyscale_config/masquerade_mask/worn/vox + name = "Masquerade Mask (Worn) (Vox)" + icon_file = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_vox.dmi' + /* * NECK */ @@ -770,6 +796,17 @@ name = "Varsity Jacket (Worn)" json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/varsity/varsity_worn.json' +//CROPTOP SWEATER + +/datum/greyscale_config/croptop + name = "Croptop Sweater" + icon_file = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi' + json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop.json' + +/datum/greyscale_config/croptop/worn + name = "Croptop Sweater (Worn)" + json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop_worn.json' + // TAILORED JACKET /datum/greyscale_config/tailored_jacket diff --git a/modular_skyrat/modules/GAGS/icons/jumpsuit_better_vox.dmi b/modular_skyrat/modules/GAGS/icons/jumpsuit_better_vox.dmi index 219995affaf..d8ebca6325a 100644 Binary files a/modular_skyrat/modules/GAGS/icons/jumpsuit_better_vox.dmi and b/modular_skyrat/modules/GAGS/icons/jumpsuit_better_vox.dmi differ diff --git a/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask.dmi b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask.dmi new file mode 100644 index 00000000000..6d80601a2be Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask.dmi differ diff --git a/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn.dmi b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn.dmi new file mode 100644 index 00000000000..a080bb7d2e7 Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn.dmi differ diff --git a/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_better_vox.dmi b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_better_vox.dmi new file mode 100644 index 00000000000..58532e78ec8 Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_better_vox.dmi differ diff --git a/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_snouted.dmi b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_snouted.dmi new file mode 100644 index 00000000000..39076d1e30d Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_snouted.dmi differ diff --git a/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_teshari.dmi b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_teshari.dmi new file mode 100644 index 00000000000..694f600739b Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_teshari.dmi differ diff --git a/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_vox.dmi b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_vox.dmi new file mode 100644 index 00000000000..720e1b04b68 Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn_vox.dmi differ diff --git a/modular_skyrat/modules/GAGS/json_configs/masquerade_mask/masquerade_mask.json b/modular_skyrat/modules/GAGS/json_configs/masquerade_mask/masquerade_mask.json new file mode 100644 index 00000000000..0bbac3ac832 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/masquerade_mask/masquerade_mask.json @@ -0,0 +1,58 @@ +{ + "maskerade": [ + { + "type": "icon_state", + "icon_state": "mask", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "maskerade_two_colors": [ + { + "type": "icon_state", + "icon_state": "mask_left", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "mask_right", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "maskerade_feather": [ + { + "type": "icon_state", + "icon_state": "mask", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "mask_feather", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ], + "maskerade_two_colors_feather": [ + { + "type": "icon_state", + "icon_state": "mask_left", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "mask_right", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "mask_feather", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop.json b/modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop.json new file mode 100644 index 00000000000..2fd05c399e1 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop.json @@ -0,0 +1,10 @@ +{ + "croptop": [ + { + "type": "icon_state", + "icon_state": "croptop", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop_worn.json b/modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop_worn.json new file mode 100644 index 00000000000..2fd05c399e1 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/suits/croptop/croptop_worn.json @@ -0,0 +1,10 @@ +{ + "croptop": [ + { + "type": "icon_state", + "icon_state": "croptop", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/SiliconQoL/code/countdown.dm b/modular_skyrat/modules/SiliconQoL/code/countdown.dm new file mode 100644 index 00000000000..ef6eb92ce5e --- /dev/null +++ b/modular_skyrat/modules/SiliconQoL/code/countdown.dm @@ -0,0 +1,14 @@ +/obj/effect/countdown/transformer_rp + name = "transformer countdown" + color = "#4C5866" + +/obj/effect/countdown/transformer_rp/get_value() + var/obj/machinery/transformer_rp/transformer = attached_to + if(!istype(transformer)) + return + if(!transformer.is_operational) + return + if(transformer.cooldown && (transformer.stored_cyborgs > 0)) + return "[round(max(0, transformer.cooldown_timer / 10))]" + if(transformer.stored_cyborgs < 1) + return "[round(max(0, transformer.stored_timer / 10))]" diff --git a/modular_skyrat/modules/SiliconQoL/code/robotic_factory.dm b/modular_skyrat/modules/SiliconQoL/code/robotic_factory.dm index f31913684de..fa8c07a1ea2 100644 --- a/modular_skyrat/modules/SiliconQoL/code/robotic_factory.dm +++ b/modular_skyrat/modules/SiliconQoL/code/robotic_factory.dm @@ -4,18 +4,25 @@ the side reads, 'Mass robot production facility'" icon = 'icons/obj/machines/recycling.dmi' icon_state = "separator-AO1" + base_icon_state = "separator-AO0" layer = ABOVE_ALL_MOB_LAYER // Overhead density = TRUE /// How many cyborgs are we storing var/stored_cyborgs = 1 /// How many cyborgs can we store? var/max_stored_cyborgs = 4 - /// How much between the construction of a cyborg? - var/cooldown_duration = 5 MINUTES - /// Handles the timer , shouldn't touch. - var/cooldown_timer + // How much time between the spawning of new cyborgs? + var/cooldown_duration = 1 MINUTES + /// Handles the Cyborg spawner timer. + var/cooldown_timer = 0 + /// Whether we're on spawn cooldown + var/cooldown = FALSE + /// How much time between the storing of cyborgs? + var/stored_duration = 5 MINUTES + /// Handles the stored Cyborg timer. + var/stored_timer /// The countdown itself - var/obj/effect/countdown/transformer/countdown + var/obj/effect/countdown/transformer_rp/countdown /// The master AI , assigned when placed down with the ability. var/mob/living/silicon/ai/master_ai @@ -23,13 +30,28 @@ // On us . = ..() new /obj/machinery/conveyor/auto(loc, WEST) + stored_timer = stored_duration countdown = new(src) countdown.start() +/obj/machinery/transformer_rp/on_set_is_operational(old_value) + if(old_value) + end_processing() + else + begin_processing() + /obj/machinery/transformer_rp/examine(mob/user) . = ..() if(issilicon(user) || isobserver(user)) - . += "It will create a new cyborg in [DisplayTimeText(cooldown_timer - world.time)]." + . += "
It has [stored_cyborgs] cyborgs stored." + if(!is_operational) + . += span_warning("It has no power!") + return + if(cooldown && cooldown_timer) + . += "
It will be ready to deploy a stored cyborg in [DisplayTimeText(max(0, cooldown_timer))]." + if(stored_cyborgs >= max_stored_cyborgs) + return + . += "
It will store a new cyborg in [DisplayTimeText(max(0, stored_timer))]." /obj/machinery/transformer_rp/Destroy() QDEL_NULL(countdown) @@ -37,39 +59,54 @@ /obj/machinery/transformer_rp/update_icon_state() . = ..() - if(machine_stat & (BROKEN|NOPOWER)) - icon_state = "separator-AO0" + if(is_operational) + icon_state = "separator-AO1" else - icon_state = initial(icon_state) + icon_state = base_icon_state /obj/machinery/transformer_rp/attack_ghost(mob/dead/observer/target_ghost) . = ..() create_a_cyborg(target_ghost) -/obj/machinery/transformer_rp/process() - if(cooldown_timer <= world.time) - cooldown_timer = world.time + cooldown_duration - update_icon() - if(stored_cyborgs > max_stored_cyborgs) - return - stored_cyborgs++ - notify_ghosts("A new cyborg shell has been created at the [src]", - source = src, - notify_flags = NOTIFY_CATEGORY_NOFLASH, - header = "New malfunctioning cyborg created!", - ) +/obj/machinery/transformer_rp/process(seconds_per_tick) + cooldown_timer = max(0, cooldown_timer - (seconds_per_tick * 10)) + if(cooldown_timer == 0) + cooldown = FALSE + + stored_timer = max(0, stored_timer - (seconds_per_tick * 10)) + if(stored_timer > 0) + return + + stored_timer = stored_duration + + if(stored_cyborgs >= max_stored_cyborgs) + return + + stored_cyborgs++ + notify_ghosts("A new cyborg shell has been created at the [src]", + source = src, + notify_flags = NOTIFY_CATEGORY_NOFLASH, + header = "New malfunctioning cyborg created!", + ) /obj/machinery/transformer_rp/proc/create_a_cyborg(mob/dead/observer/target_ghost) - if(machine_stat & (BROKEN|NOPOWER)) + if(!is_operational) return - if(stored_cyborgs<1) + if(stored_cyborgs < 1) return + if(cooldown) + return + var/cyborg_ask = tgui_alert(target_ghost, "Become a cyborg?", "Are you a terminator?", list("Yes", "No")) if(cyborg_ask == "No" || !src || QDELETED(src)) return FALSE + var/mob/living/silicon/robot/cyborg = new /mob/living/silicon/robot(loc) cyborg.key = target_ghost.key cyborg.set_connected_ai(master_ai) cyborg.lawsync() cyborg.lawupdate = TRUE stored_cyborgs-- + + cooldown = TRUE + cooldown_timer = cooldown_duration diff --git a/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm b/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm index df38f143995..8218fc93be9 100644 --- a/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm +++ b/modular_skyrat/modules/advanced_engineering/code/adv_engineering.dm @@ -31,7 +31,10 @@ name = "industrial RCD matter cartridge" desc = "A cartridge with one complete refill for an industrial RCD." w_class = WEIGHT_CLASS_SMALL - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 60, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 40) + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 60, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 40, + ) ammoamt = 440 /obj/item/storage/box/rcd_ammo @@ -40,7 +43,9 @@ desc = "A durable box with refill cartridges for an industrial RCD." icon_state = "engibox" illustration = "rcd" - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) /obj/item/storage/box/rcd_ammo/PopulateContents() for(var/i in 1 to 4) diff --git a/modular_skyrat/modules/ammo_workbench/code/design_disks.dm b/modular_skyrat/modules/ammo_workbench/code/design_disks.dm index 26e6302c6da..1b3f831c001 100644 --- a/modular_skyrat/modules/ammo_workbench/code/design_disks.dm +++ b/modular_skyrat/modules/ammo_workbench/code/design_disks.dm @@ -20,7 +20,11 @@ name = "Ammo Workbench Advanced Munitions Datadisk" id = "ammoworkbench_disk_lethal" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT + ) build_path = /obj/item/disk/ammo_workbench/advanced - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SECURITY) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SECURITY, + ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/ash_tendril.dm b/modular_skyrat/modules/ashwalkers/code/buildings/ash_tendril.dm index 18d3baa3b51..01056fa6c20 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/ash_tendril.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/ash_tendril.dm @@ -90,18 +90,16 @@ if(!viewable_living.stat) continue - for(var/obj/item/sacrifice_posession in viewable_living) - if(!viewable_living.dropItemToGround(sacrifice_posession)) - qdel(sacrifice_posession) + viewable_living.unequip_everything() if(issilicon(viewable_living)) //no advantage to sacrificing borgs... viewable_living.investigate_log("has been gibbed via ashwalker sacrifice as a borg.", INVESTIGATE_DEATHS) viewable_living.gib() - continue + return if(viewable_living.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (viewable_living.ckey || viewable_living.get_ghost(FALSE, TRUE))) //special interactions for dead lava lizards with ghosts attached revive_ashwalker(viewable_living) - continue + return if(ismegafauna(viewable_living)) meat_counter += MEGAFAUNA_MEAT_AMOUNT diff --git a/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm b/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm index 84b7b9b9170..0d2b66232c6 100644 --- a/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm +++ b/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm @@ -15,6 +15,22 @@ bomb = 20 bio = 10 +/datum/armor/ash_plates + melee = 15 + bullet = 25 + laser = 15 + energy = 15 + bomb = 20 + bio = 10 + +/datum/armor/bone_greaves + melee = 15 + bullet = 25 + laser = 15 + energy = 15 + bomb = 20 + bio = 50 + /obj/item/clothing/head/ash_headdress name = "ash headdress" desc = "A headdress that shows the dominance of the walkers of ash." @@ -102,3 +118,22 @@ name = "Decorated Ash Combat Plates" result = /obj/item/clothing/under/costume/gladiator/ash_walker/ash_plates/decorated category = CAT_CLOTHING + +/obj/item/clothing/shoes/bone_greaves + name = "bone greaves" + desc = "For when you're expecting to step on spiky things. Offers modest protection to your feet." + icon = 'modular_skyrat/modules/ashwalkers/icons/shoes.dmi' + worn_icon = 'modular_skyrat/modules/ashwalkers/icons/feet.dmi' + worn_icon_digi = 'modular_skyrat/modules/ashwalkers/icons/feet_digi.dmi' + icon_state = "bone_greaves" + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION + armor_type = /datum/armor/bone_greaves + +/datum/crafting_recipe/ash_recipe/bone_greaves + name = "Bone Greaves" + result = /obj/item/clothing/shoes/bone_greaves + reqs = list( + /obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1, + ) + category = CAT_CLOTHING diff --git a/modular_skyrat/modules/ashwalkers/icons/feet.dmi b/modular_skyrat/modules/ashwalkers/icons/feet.dmi index b4ba22e6b55..d743be0a0fc 100644 Binary files a/modular_skyrat/modules/ashwalkers/icons/feet.dmi and b/modular_skyrat/modules/ashwalkers/icons/feet.dmi differ diff --git a/modular_skyrat/modules/ashwalkers/icons/feet_digi.dmi b/modular_skyrat/modules/ashwalkers/icons/feet_digi.dmi index 89e772d083c..39f6aae9cff 100644 Binary files a/modular_skyrat/modules/ashwalkers/icons/feet_digi.dmi and b/modular_skyrat/modules/ashwalkers/icons/feet_digi.dmi differ diff --git a/modular_skyrat/modules/ashwalkers/icons/shoes.dmi b/modular_skyrat/modules/ashwalkers/icons/shoes.dmi index 8125bc37ff3..e69db1f1b30 100644 Binary files a/modular_skyrat/modules/ashwalkers/icons/shoes.dmi and b/modular_skyrat/modules/ashwalkers/icons/shoes.dmi differ diff --git a/modular_skyrat/modules/assault_operatives/code/interrogator.dm b/modular_skyrat/modules/assault_operatives/code/interrogator.dm index 993e6ce7623..94811938186 100644 --- a/modular_skyrat/modules/assault_operatives/code/interrogator.dm +++ b/modular_skyrat/modules/assault_operatives/code/interrogator.dm @@ -207,11 +207,12 @@ var/obj/structure/test_structure = new() // This is apparently the most intuative way to check if a turf is able to support entering. for(var/area/station/maintenance/maint_area in GLOB.areas) - for(var/turf/floor as anything in maint_area.get_contained_turfs()) - if(!is_station_level(floor.z)) - continue - if(floor.Enter(test_structure)) - possible_turfs += floor + for(var/list/zlevel_turfs as anything in maint_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + if(!is_station_level(area_turf.z)) + continue + if(area_turf.Enter(test_structure)) + possible_turfs += area_turf qdel(test_structure) //Pick a turf to spawn at if we can diff --git a/modular_skyrat/modules/automapper/code/area_spawn_entries.dm b/modular_skyrat/modules/automapper/code/area_spawn_entries.dm index 1b0d57d2e4c..8531fd369fd 100644 --- a/modular_skyrat/modules/automapper/code/area_spawn_entries.dm +++ b/modular_skyrat/modules/automapper/code/area_spawn_entries.dm @@ -46,10 +46,15 @@ mode = AREA_SPAWN_MODE_HUG_WALL /datum/area_spawn/gbp_machine - target_areas = list(/area/station/cargo/lobby, /area/station/cargo/boutique, /area/station/construction/storage_wing, /area/station/hallway/primary/port /*bubberstation edit for kilo*/) // lmao imagine map standardization + target_areas = list(/area/station/cargo/lobby, /area/station/cargo/boutique, /area/station/construction/storage_wing, /area/station/hallway/primary/port /* for kilo */) // lmao imagine map standardization desired_atom = /obj/machinery/gbp_redemption mode = AREA_SPAWN_MODE_HUG_WALL +/datum/area_spawn/bar_jukebox + target_areas = list(/area/station/commons/lounge, /area/station/service/bar/atrium, /area/station/service/bar) + desired_atom = /obj/machinery/jukebox/public + mode = AREA_SPAWN_MODE_OPEN + // Wall mounts. Use sparingly as walls are prime real estate /datum/area_spawn/posialert_robotics target_areas = list(/area/station/science/robotics, /area/station/science/robotics/lab) @@ -101,11 +106,6 @@ desired_atom = /obj/effect/landmark/start/customs_agent target_areas = list(/area/station/security/checkpoint/supply, /area/station/cargo/storage) -/datum/area_spawn_over/prison_curtains - desired_atom = /obj/structure/curtain/cloth/prison - over_atoms = list(/obj/structure/window/reinforced/fulltile, /obj/machinery/door/airlock/security/glass, /obj/machinery/door/airlock/public/glass) - target_areas = list(/area/station/security/prison/safe) - /datum/area_spawn/corrections_officer_landmark desired_atom = /obj/effect/landmark/start/corrections_officer target_areas = list(/area/station/security/brig, /area/station/security/prison/) diff --git a/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm b/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm index 8e03d68a773..f0e8af0cdba 100644 --- a/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm +++ b/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm @@ -91,11 +91,12 @@ SUBSYSTEM_DEF(area_spawn) turf_list = area_turf_info["[mode]"] = list() // Get highest priority items - for(var/turf/iterating_turf as anything in area.get_contained_turfs()) - // Only retain turfs of the highest priority - var/priority = process_turf(iterating_turf, mode) - if(priority > 0) - LAZYADDASSOC(turf_list, "[priority]", list(iterating_turf)) + for(var/list/zlevel_turfs as anything in area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + // Only retain turfs of the highest priority + var/priority = process_turf(area_turf, mode) + if(priority > 0) + LAZYADDASSOC(turf_list, "[priority]", list(area_turf)) // Sort the priorities descending return sortTim(turf_list, GLOBAL_PROC_REF(cmp_num_string_asc)) @@ -333,17 +334,18 @@ SUBSYSTEM_DEF(area_spawn) if(!found_area) continue - for(var/turf/candidate_turf as anything in found_area.get_contained_turfs()) - // Don't spawn if there's already a desired_atom here. - if(is_type_on_turf(candidate_turf, desired_atom)) - continue + for (var/list/zlevel_turfs as anything in found_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + // Don't spawn if there's already a desired_atom here. + if(is_type_on_turf(area_turf, desired_atom)) + continue - for(var/over_atom_type in over_atoms) - // Spawn on the first one we find in the turf and stop. - if(is_type_on_turf(candidate_turf, over_atom_type)) - new desired_atom(candidate_turf) - // Break the over_atom_type loop. - break + for(var/over_atom_type in over_atoms) + // Spawn on the first one we find in the turf and stop. + if(is_type_on_turf(area_turf, over_atom_type)) + new desired_atom(area_turf) + // Break the over_atom_type loop. + break /obj/effect/turf_test name = "PASS" diff --git a/modular_skyrat/modules/better_vox/code/vox_species.dm b/modular_skyrat/modules/better_vox/code/vox_species.dm index a8c2d4c0e2e..0a48e4881ba 100644 --- a/modular_skyrat/modules/better_vox/code/vox_species.dm +++ b/modular_skyrat/modules/better_vox/code/vox_species.dm @@ -16,6 +16,7 @@ mutantbrain = /obj/item/organ/internal/brain/vox breathid = "n2" mutant_bodyparts = list() + meat = /obj/item/food/meat/slab/chicken/human //item file in teshari module mutanttongue = /obj/item/organ/internal/tongue/vox payday_modifier = 1.0 outfit_important_for_life = /datum/outfit/vox diff --git a/modular_skyrat/modules/better_vox/icons/clothing/back.dmi b/modular_skyrat/modules/better_vox/icons/clothing/back.dmi index 58b25444b2d..42342b96804 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/back.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/back.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/eyes.dmi b/modular_skyrat/modules/better_vox/icons/clothing/eyes.dmi index 6892b304eed..26b37734495 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/eyes.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/eyes.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/hands.dmi b/modular_skyrat/modules/better_vox/icons/clothing/hands.dmi index 6422ead97f5..469c38786d8 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/hands.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/hands.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/head.dmi b/modular_skyrat/modules/better_vox/icons/clothing/head.dmi index 6f1f5fb4618..80359e0b64a 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/head.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/head.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/helmet.dmi b/modular_skyrat/modules/better_vox/icons/clothing/helmet.dmi index f4d7beca591..91bf16af315 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/helmet.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/helmet.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/mask.dmi b/modular_skyrat/modules/better_vox/icons/clothing/mask.dmi index cc76f904848..dbabde45004 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/mask.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/mask.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/mod.dmi b/modular_skyrat/modules/better_vox/icons/clothing/mod.dmi index b1c272b0ccd..cac11dd1d3e 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/mod.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/mod.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/neck.dmi b/modular_skyrat/modules/better_vox/icons/clothing/neck.dmi new file mode 100644 index 00000000000..33762ac78ef Binary files /dev/null and b/modular_skyrat/modules/better_vox/icons/clothing/neck.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi b/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi index adfd1c200c5..31d22fbbe83 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi differ diff --git a/modular_skyrat/modules/better_vox/icons/clothing/uniform.dmi b/modular_skyrat/modules/better_vox/icons/clothing/uniform.dmi index 7b7ae9a2af5..a126c64ad0e 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/uniform.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/uniform.dmi differ diff --git a/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/area.dm b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/area.dm new file mode 100644 index 00000000000..cbdd79dc25d --- /dev/null +++ b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/area.dm @@ -0,0 +1,72 @@ +/area/virtual_domain/ancient_milsim + name = "intro_2" // see fluff.dm, line 18; shouldn't really be used + icon = 'icons/area/areas_away_missions.dmi' + icon_state = "unknown" + +/area/virtual_domain/ancient_milsim/entrance + name = "'Time Of Valor 2' Entrance Area" // The most generic FPS title I could think of. + icon_state = "awaycontent1" + +/area/virtual_domain/ancient_milsim/janitor + name = "'Time Of Valor 2' Janitor's Closet" + icon_state = "awaycontent2" + +/area/virtual_domain/ancient_milsim/medbay + name = "'Time Of Valor 2' Medbay" + icon_state = "awaycontent3" + +/area/virtual_domain/ancient_milsim/atrium + name = "'Time Of Valor 2' Atrium" + icon_state = "awaycontent4" + +/area/virtual_domain/ancient_milsim/hallway + name = "'Time Of Valor 2' Hallway" + icon_state = "awaycontent5" + +/area/virtual_domain/ancient_milsim/maintenance + name = "'Time Of Valor 2' Maintenance Tunnel" + icon_state = "awaycontent7" + +/area/virtual_domain/ancient_milsim/loot_camp + name = "'Time Of Valor 2' CIN Encampment" + icon_state = "awaycontent7" + +/area/virtual_domain/ancient_milsim/snpc_ground + name = "'Time Of Valor 2' SNPC Fighting Ground" + icon_state = "awaycontent8" + +/area/virtual_domain/ancient_milsim/carrier + name = "'Time Of Valor 2' Ruined APC" + icon_state = "awaycontent9" + +/area/virtual_domain/ancient_milsim/snpc_hallway + name = "'Time Of Valor 2' SNPC Base Hallway" + icon_state = "awaycontent10" + +/area/virtual_domain/ancient_milsim/snpc_bar + name = "'Time Of Valor 2' SNPC Base Bar" + icon_state = "awaycontent11" + +/area/virtual_domain/ancient_milsim/snpc_garage + name = "'Time Of Valor 2' SNPC Base Garage" + icon_state = "awaycontent12" + +/area/virtual_domain/ancient_milsim/snpc_cafe + name = "'Time Of Valor 2' SNPC Base Cafeteria" + icon_state = "awaycontent13" + +/area/virtual_domain/ancient_milsim/snpc_toilet + name = "'Time Of Valor 2' SNPC Base Restroom" + icon_state = "awaycontent14" + +/area/virtual_domain/ancient_milsim/snpc_cave + name = "'Time Of Valor 2' SNPC Base Maintenance Cave" + icon_state = "awaycontent15" + +/area/virtual_domain/ancient_milsim/snpc_reward + name = "'Time Of Valor 2' SNPC Base Reward Room" + icon_state = "awaycontent16" + +/area/virtual_domain/ancient_milsim/snpc_exit + name = "'Time Of Valor 2' SNPC Base Exit Tunnel" + icon_state = "awaycontent17" diff --git a/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/mapping_helpers.dm b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/mapping_helpers.dm new file mode 100644 index 00000000000..ac62cef3a12 --- /dev/null +++ b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/mapping_helpers.dm @@ -0,0 +1,10 @@ +/obj/effect/baseturf_helper/virtual_domain/ancient_milsim + name = "virtual domain baseturf editor" + baseturf_to_replace = list(/turf/open/space, + /turf/baseturf_bottom, + /turf/open/misc/ashplanet/wateryrock, + /turf/open/floor/plating, + /turf/open/misc/dirt/planet, + /turf/open/misc/sandy_dirt/planet, + /turf/open/chasm/lavaland, + ) diff --git a/modular_skyrat/modules/black_mesa/code/weapons.dm b/modular_skyrat/modules/black_mesa/code/weapons.dm index ef5873daa9b..ff2fcdbaaf7 100644 --- a/modular_skyrat/modules/black_mesa/code/weapons.dm +++ b/modular_skyrat/modules/black_mesa/code/weapons.dm @@ -44,10 +44,6 @@ repairable_by = /obj/item/stack/sheet/iron //what to repair the shield with -/obj/item/shield/riot/pointman/hecu/shatter(mob/living/carbon/human/owner) - playsound(owner, 'sound/effects/glassbr3.ogg', 100) - new /obj/item/ballistic_broken((get_turf(src))) - /obj/item/ballistic_broken name = "broken ballistic shield" desc = "An unsalvageable, unrecoverable mess of armor steel and kevlar. Should've maintained it, huh?" diff --git a/modular_skyrat/modules/bluespace_miner/code/bluespace_miner.dm b/modular_skyrat/modules/bluespace_miner/code/bluespace_miner.dm index be3f8323ec5..87cf9bec2a3 100644 --- a/modular_skyrat/modules/bluespace_miner/code/bluespace_miner.dm +++ b/modular_skyrat/modules/bluespace_miner/code/bluespace_miner.dm @@ -36,13 +36,14 @@ /obj/machinery/bluespace_miner/RefreshParts() . = ..() - gas_temp = 100 //starts at 100, should go down to 80 at most. + gas_temp = 100 //starts at 90 temp, should go down to 60 for(var/datum/stock_part/micro_laser/laser_part in component_parts) gas_temp -= (laser_part.tier * 5) - processing_speed = 6 SECONDS //starts at 6 seconds, should go down to 4 seconds at most. + processing_speed = 6 SECONDS //starts at 5 seconds, should go down to 2 for(var/datum/stock_part/servo/servo_part in component_parts) processing_speed -= (servo_part.tier * (0.5 SECONDS)) + processing_speed = CEILING(processing_speed, 1) /obj/machinery/bluespace_miner/update_overlays() . = ..() @@ -156,6 +157,11 @@ if(default_deconstruction_crowbar(tool)) return TRUE +/obj/machinery/bluespace_miner/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + /obj/machinery/bluespace_miner/screwdriver_act(mob/living/user, obj/item/tool) . = TRUE if(..()) @@ -196,34 +202,27 @@ crate_name = "Bluespace Miner Circuitboard Crate" crate_type = /obj/structure/closet/crate -/* if we were going to go research based /datum/design/board/bluespace_miner name = "Machine Design (Bluespace Miner)" desc = "Allows for the construction of circuit boards used to build a bluespace miner." id = "bluespace_miner" build_path = /obj/item/circuitboard/machine/bluespace_miner - category = list(RND_CATEGORY_MISC_MACHINERY) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING - -/datum/experiment/scanning/points/bluespace_miner - name = "Bluespace Miner" - description = "We can learn from the past technology and create a better future-- with bluespace miners." - required_points = 5 - required_atoms = list( - /obj/item/xenoarch/broken_item/tech = 1, + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING /datum/techweb_node/bluespace_miner id = "bluespace_miner" display_name = "Bluespace Miner" description = "The future is here, where we can mine ores from the great bluespace sea." - prereq_ids = list("anomaly_research", "bluespace_power") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + hidden = TRUE + experimental = TRUE + prereq_ids = list("base") design_ids = list( "bluespace_miner", ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) - discount_experiments = list(/datum/experiment/scanning/points/bluespace_miner = 5000) -*/ #undef BLUESPACE_MINER_TOO_HOT #undef BLUESPACE_MINER_LOW_PRESSURE diff --git a/modular_skyrat/modules/bodyparts/code/ghoul_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/ghoul_bodyparts.dm index 098e4ad1064..d58e6cd0c83 100644 --- a/modular_skyrat/modules/bodyparts/code/ghoul_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/ghoul_bodyparts.dm @@ -96,7 +96,7 @@ // LIMBS -/obj/item/bodypart/arm/right/mutant/ghoul/drop_limb(special) +/obj/item/bodypart/arm/right/mutant/ghoul/drop_limb(special, dismembered, move_to_floor = TRUE) ..() // Create Meat, Remove Limb var/percentHealth = 1 - (brute_dam + burn_dam) / max_damage if (percentHealth > 0) @@ -107,7 +107,7 @@ qdel(src) -/obj/item/bodypart/arm/left/mutant/ghoul/drop_limb(special) +/obj/item/bodypart/arm/left/mutant/ghoul/drop_limb(special, dismembered, move_to_floor = TRUE) ..() // Create Meat, Remove Limb var/percentHealth = 1 - (brute_dam + burn_dam) / max_damage if (percentHealth > 0) @@ -118,7 +118,7 @@ qdel(src) -/obj/item/bodypart/leg/right/mutant/ghoul/drop_limb(special) +/obj/item/bodypart/leg/right/mutant/ghoul/drop_limb(special, dismembered, move_to_floor = TRUE) ..() // Create Meat, Remove Limb var/percentHealth = 1 - (brute_dam + burn_dam) / max_damage if (percentHealth > 0) @@ -129,7 +129,7 @@ qdel(src) -/obj/item/bodypart/leg/left/mutant/ghoul/drop_limb(special) +/obj/item/bodypart/leg/left/mutant/ghoul/drop_limb(special, dismembered, move_to_floor = TRUE) ..() // Create Meat, Remove Limb var/percentHealth = 1 - (brute_dam + burn_dam) / max_damage if (percentHealth > 0) diff --git a/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm index 3f55ec93393..aab60d23281 100644 --- a/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/moth_bodyparts.dm @@ -4,7 +4,7 @@ icon_state = "moth_head_m" limb_id = SPECIES_MOTH is_dimorphic = TRUE - head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips? + head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips? /obj/item/bodypart/chest/moth icon = BODYPART_ICON_MOTH diff --git a/modular_skyrat/modules/borg_buffs/code/robot.dm b/modular_skyrat/modules/borg_buffs/code/robot.dm index e0f7c9a433d..38afcf2eadd 100644 --- a/modular_skyrat/modules/borg_buffs/code/robot.dm +++ b/modular_skyrat/modules/borg_buffs/code/robot.dm @@ -217,9 +217,13 @@ id = "borg_upgrade_brush" build_type = MECHFAB build_path = /obj/item/borg/upgrade/wirebrush - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2 + ) construction_time = 40 - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_JANITOR, + ) /obj/item/borg/upgrade/wirebrush name = "janitor cyborg wire-brush" diff --git a/modular_skyrat/modules/borg_buffs/code/snack_dispensor.dm b/modular_skyrat/modules/borg_buffs/code/snack_dispensor.dm index 48db5b6cdd0..fe34135c88d 100644 --- a/modular_skyrat/modules/borg_buffs/code/snack_dispensor.dm +++ b/modular_skyrat/modules/borg_buffs/code/snack_dispensor.dm @@ -3,9 +3,14 @@ id = "borg_upgrade_snacks" build_type = MECHFAB build_path = /obj/item/borg/upgrade/snack_dispenser - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 1 SECONDS - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL, + ) /obj/item/borg/upgrade/snack_dispenser name = "Snack Dispenser Module" diff --git a/modular_skyrat/modules/borgs/code/mechafabricator_designs.dm b/modular_skyrat/modules/borgs/code/mechafabricator_designs.dm index a8d8c0046ff..6c42e1c4d9e 100644 --- a/modular_skyrat/modules/borgs/code/mechafabricator_designs.dm +++ b/modular_skyrat/modules/borgs/code/mechafabricator_designs.dm @@ -3,27 +3,47 @@ id = "borg_upgrade_shrink" build_type = MECHFAB build_path = /obj/item/borg/upgrade/shrink - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 10, /datum/material/glass=SHEET_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4, + ) construction_time = 120 - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL, + ) /datum/design/borg_upgrade_surgicaltools name = "Advanced Surgical Tools Module" id = "borg_upgrade_surgicaltools" build_type = MECHFAB build_path = /obj/item/borg/upgrade/surgerytools - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 3, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SMALL_MATERIAL_AMOUNT, /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/plasma = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = SMALL_MATERIAL_AMOUNT, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT, + ) construction_time = 80 - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL, + ) /datum/design/affection_module name = "Affection Module" id = "affection_module" build_type = MECHFAB build_path = /obj/item/borg/upgrade/affectionmodule - materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass=HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 40 - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL, + ) /datum/design/advanced_materials name = "Advanced Materials Module" @@ -37,7 +57,9 @@ /datum/material/glass=SHEET_MATERIAL_AMOUNT * 5, /datum/material/plasma=SHEET_MATERIAL_AMOUNT * 3, ) - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING, + ) /datum/design/inducer_upgrade name = "Inducer Module" @@ -50,16 +72,24 @@ /datum/material/gold=SHEET_MATERIAL_AMOUNT * 2, /datum/material/plasma=SHEET_MATERIAL_AMOUNT, ) - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ENGINEERING, + ) /datum/design/borg_shapeshifter_module name = "Shapeshifting Module" id = "borg_shapeshifter_module" build_type = MECHFAB build_path = /obj/item/borg/upgrade/borg_shapeshifter - materials = list(/datum/material/silver = SHEET_MATERIAL_AMOUNT * 5, /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 5, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2, + ) construction_time = 120 - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL, + ) /datum/design/borg_upgrade_welding name = "Welding Module" @@ -71,7 +101,9 @@ /datum/material/iron=SHEET_MATERIAL_AMOUNT * 5, /datum/material/plasma=SHEET_MATERIAL_AMOUNT * 1, ) - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING) + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING, + ) //Cyborg Skyrat overrides /datum/design/borg_suit @@ -79,10 +111,12 @@ id = "borg_suit" build_type = MECHFAB build_path = /obj/item/robot_suit - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) /datum/design/borg_chest @@ -90,10 +124,12 @@ id = "borg_chest" build_type = MECHFAB build_path = /obj/item/bodypart/chest/robot - materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 8) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 8, + ) construction_time = 12 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) /datum/design/borg_head @@ -101,10 +137,12 @@ id = "borg_head" build_type = MECHFAB build_path = /obj/item/bodypart/head/robot - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) construction_time = 4 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) /datum/design/borg_l_arm @@ -112,10 +150,12 @@ id = "borg_l_arm" build_type = MECHFAB build_path = /obj/item/bodypart/arm/left/robot - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) /datum/design/borg_r_arm @@ -123,10 +163,12 @@ id = "borg_r_arm" build_type = MECHFAB build_path = /obj/item/bodypart/arm/right/robot - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) /datum/design/borg_l_leg @@ -134,10 +176,12 @@ id = "borg_l_leg" build_type = MECHFAB build_path = /obj/item/bodypart/leg/left/robot - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) /datum/design/borg_r_leg @@ -145,8 +189,10 @@ id = "borg_r_leg" build_type = MECHFAB build_path = /obj/item/bodypart/leg/right/robot - materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS, ) diff --git a/modular_skyrat/modules/borgs/code/robot_items.dm b/modular_skyrat/modules/borgs/code/robot_items.dm index 46b1532f9ee..3a928492293 100644 --- a/modular_skyrat/modules/borgs/code/robot_items.dm +++ b/modular_skyrat/modules/borgs/code/robot_items.dm @@ -753,3 +753,124 @@ if(active) to_chat(user, span_danger("Your chameleon field deactivates.")) deactivate(user) + +// Quadruped tongue - lick lick +/obj/item/quadborg_tongue + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi' + icon_state = "synthtongue" + hitsound = 'sound/effects/attackblob.ogg' + desc = "For giving affectionate kisses." + item_flags = NOBLUDGEON + +/obj/item/quadborg_tongue/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity || !isliving(target)) + return + var/mob/living/silicon/robot/borg = user + var/mob/living/mob = target + + if(!HAS_TRAIT(target, TRAIT_AFFECTION_AVERSION)) // Checks for Affection Aversion trait + if(check_zone(borg.zone_selected) == "head") + borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]'s face!"), span_notice("You affectionally lick \the [mob]'s face!")) + playsound(borg, 'sound/effects/attackblob.ogg', 50, 1) + else + borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]!"), span_notice("You affectionally lick \the [mob]!")) + playsound(borg, 'sound/effects/attackblob.ogg', 50, 1) + else + to_chat(user, span_warning("ERROR: [target] is on the Do Not Lick registry!")) + +// Quadruped nose - Boop +/obj/item/quadborg_nose + name = "boop module" + desc = "The BOOP module" + icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi' + icon_state = "nose" + obj_flags = CONDUCTS_ELECTRICITY + item_flags = NOBLUDGEON + force = 0 + +/obj/item/quadborg_nose/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity) + return + + if(!HAS_TRAIT(target, TRAIT_AFFECTION_AVERSION)) // Checks for Affection Aversion trait + do_attack_animation(target, null, src) + user.visible_message(span_notice("[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!")) + else + to_chat(user, span_warning("ERROR: [target] is on the No Nosing registry!")) + +/// Better Clamp +/obj/item/borg/hydraulic_clamp/better + name = "improved integrated hydraulic clamp" + desc = "A neat way to lift and move around crates for quick and painless deliveries!" + storage_capacity = 4 + whitelisted_item_types = list(/obj/structure/closet/crate, /obj/item/delivery/big, /obj/item/delivery, /obj/item/bounty_cube) // If they want to carry a small package or a bounty cube instead, so be it, honestly. + whitelisted_item_description = "wrapped packages" + item_weight_limit = NONE + clamp_sound_volume = 50 + +/obj/item/borg/hydraulic_clamp/better/examine(mob/user) + . = ..() + var/crate_count = contents.len + . += "There is currently [crate_count > 0 ? crate_count : "no"] crate[crate_count > 1 ? "s" : ""] stored in the clamp's internal storage." + +/obj/item/borg/hydraulic_clamp/mail + name = "integrated rapid mail delivery device" + desc = "Allows you to carry around a lot of mail, to distribute it around the station like the good little mailbot you are!" + icon = 'icons/obj/service/library.dmi' + icon_state = "bookbag" + storage_capacity = 100 + loading_time = 0.25 SECONDS + unloading_time = 0.25 SECONDS + cooldown_duration = 0.25 SECONDS + whitelisted_item_types = list(/obj/item/mail) + whitelisted_item_description = "envelopes" + item_weight_limit = WEIGHT_CLASS_NORMAL + clamp_sound_volume = 25 + clamp_sound = 'sound/items/pshoom.ogg' + +/obj/item/borg/forging_setup + name = "integrated forging dispenser" + desc = "Allows cyborgs to dispense the necessary structures for forging in return for power." + icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi' + icon_state = "forge_dispense" + /// how much charge the item will use per use + var/charge_cost = 1000 + +/obj/item/borg/forging_setup/attack_self(mob/user, modifiers) + var/mob/living/silicon/robot/robot_user = user + if(!istype(robot_user)) //you have to be a borg to use this item + to_chat(user, span_warning("Must be a cyborg to use [src]!")) + return + + if(robot_user.cell.charge < charge_cost) + to_chat(user, span_warning("Not enough charge!")) + return + + var/turf/src_turf = get_turf(src) + if(!isopenturf(src_turf) || isspaceturf(src_turf)) + to_chat(user, span_warning("Must be built on a solid surface!")) + return + + for(var/obj/structure/locate_structure in src_turf) + if(locate_structure.density) + to_chat(user, span_warning("Must be built on an empty surface!")) + return + + robot_user.cell.use(charge_cost) + + var/choice = tgui_input_list(user, "Which structure would you like to produce?", "Structure Choice", list("Forge", "Anvil", "Water Basin", "Crafting Bench")) + if(isnull(choice)) + return + switch(choice) + if("Forge") + new /obj/structure/reagent_forge(src_turf) + if("Anvil") + new /obj/structure/reagent_anvil(src_turf) + if("Water Basin") + new /obj/structure/reagent_water_basin(src_turf) + if("Crafting Bench") + new /obj/structure/reagent_crafting_bench(src_turf) diff --git a/modular_skyrat/modules/borgs/code/robot_upgrade.dm b/modular_skyrat/modules/borgs/code/robot_upgrade.dm index 8de30e312c8..e7ce9d5f611 100644 --- a/modular_skyrat/modules/borgs/code/robot_upgrade.dm +++ b/modular_skyrat/modules/borgs/code/robot_upgrade.dm @@ -207,46 +207,19 @@ /* * ADVANCED CARGO CYBORG UPGRADES */ - -/// Better Clamp -/obj/item/borg/hydraulic_clamp/better - name = "improved integrated hydraulic clamp" - desc = "A neat way to lift and move around crates for quick and painless deliveries!" - storage_capacity = 4 - whitelisted_item_types = list(/obj/structure/closet/crate, /obj/item/delivery/big, /obj/item/delivery, /obj/item/bounty_cube) // If they want to carry a small package or a bounty cube instead, so be it, honestly. - whitelisted_item_description = "wrapped packages" - item_weight_limit = NONE - clamp_sound_volume = 50 - -/obj/item/borg/hydraulic_clamp/better/examine(mob/user) - . = ..() - var/crate_count = contents.len - . += "There is currently [crate_count > 0 ? crate_count : "no"] crate[crate_count > 1 ? "s" : ""] stored in the clamp's internal storage." - -/obj/item/borg/hydraulic_clamp/mail - name = "integrated rapid mail delivery device" - desc = "Allows you to carry around a lot of mail, to distribute it around the station like the good little mailbot you are!" - icon = 'icons/obj/service/library.dmi' - icon_state = "bookbag" - storage_capacity = 100 - loading_time = 0.25 SECONDS - unloading_time = 0.25 SECONDS - cooldown_duration = 0.25 SECONDS - whitelisted_item_types = list(/obj/item/mail) - whitelisted_item_description = "envelopes" - item_weight_limit = WEIGHT_CLASS_NORMAL - clamp_sound_volume = 25 - clamp_sound = 'sound/items/pshoom.ogg' - /datum/design/borg_upgrade_clamp name = "improved Integrated Hydraulic Clamp Module" id = "borg_upgrade_clamp" build_type = MECHFAB build_path = /obj/item/borg/upgrade/better_clamp - materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 12 SECONDS - category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_CARGO) - + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_CARGO, + ) /obj/item/borg/upgrade/better_clamp name = "improved integrated hydraulic clamp" @@ -256,7 +229,6 @@ model_type = list(/obj/item/robot_model/cargo) model_flags = BORG_MODEL_CARGO - /obj/item/borg/upgrade/better_clamp/action(mob/living/silicon/robot/cyborg, user = usr) . = ..() if(!.) @@ -279,6 +251,111 @@ if(big_clamp) cyborg.model.remove_module(big_clamp, TRUE) +/datum/design/borg_upgrade_cargo_tele + name = "cargo teleporter module" + id = "borg_upgrade_cargo_tele" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/cargo_tele + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 5) + construction_time = 12 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_CARGO + ) + +/obj/item/borg/upgrade/cargo_tele + name = "borg cargo teleporter module" + desc = "Allows you to upgrade a cargo cyborg with the cargo teleporter" + icon_state = "cyborg_upgrade3" + require_model = TRUE + model_type = list(/obj/item/robot_model/cargo) + model_flags = BORG_MODEL_CARGO + +/obj/item/borg/upgrade/cargo_tele/action(mob/living/silicon/robot/cyborg, user = usr) + . = ..() + if(!.) + return + + var/obj/item/cargo_teleporter/locate_tele = locate() in cyborg.model.modules + if(locate_tele) + to_chat(user, span_warning("This cyborg is already equipped with a cargo teleporter!")) + return FALSE + + locate_tele = new(cyborg.model) + cyborg.model.basic_modules += locate_tele + cyborg.model.add_module(locate_tele, FALSE, TRUE) + +/obj/item/borg/upgrade/cargo_tele/deactivate(mob/living/silicon/robot/cyborg, user) + . = ..() + if(!.) + return + + var/obj/item/cargo_teleporter/locate_tele = locate() in cyborg.model.modules + if(locate_tele) + cyborg.model.remove_module(locate_tele, TRUE) + +/datum/design/borg_upgrade_forging + name = "borg forging module" + id = "borg_upgrade_forging" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/forging + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 5) + construction_time = 12 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_CARGO + ) + +/obj/item/borg/upgrade/forging + name = "borg forging module" + desc = "Allows you to upgrade a cargo cyborg with forging gear" + icon_state = "cyborg_upgrade3" + require_model = TRUE + model_type = list(/obj/item/robot_model/cargo) + model_flags = BORG_MODEL_CARGO + +/obj/item/borg/upgrade/forging/action(mob/living/silicon/robot/cyborg, user = usr) + . = ..() + if(!.) + return + + var/obj/item/forging/hammer/locate_hammer = locate() in cyborg.model.modules + var/obj/item/forging/billow/locate_billow = locate() in cyborg.model.modules + var/obj/item/forging/tongs/locate_tongs = locate() in cyborg.model.modules + var/obj/item/borg/forging_setup/locate_forge = locate() in cyborg.model.modules + if(locate_hammer || locate_billow || locate_tongs || locate_forge) + to_chat(user, span_warning("This cyborg is already equipped with a forging set!")) + return FALSE + + locate_hammer = new(cyborg.model) + locate_billow = new(cyborg.model) + locate_tongs = new(cyborg.model) + locate_forge = new(cyborg.model) + cyborg.model.basic_modules += locate_hammer + cyborg.model.basic_modules += locate_billow + cyborg.model.basic_modules += locate_tongs + cyborg.model.basic_modules += locate_forge + cyborg.model.add_module(locate_hammer, FALSE, TRUE) + cyborg.model.add_module(locate_billow, FALSE, TRUE) + cyborg.model.add_module(locate_tongs, FALSE, TRUE) + cyborg.model.add_module(locate_forge, FALSE, TRUE) + +/obj/item/borg/upgrade/forging/deactivate(mob/living/silicon/robot/cyborg, user) + . = ..() + if(!.) + return + + var/obj/item/forging/hammer/locate_hammer = locate() in cyborg.model.modules + if(locate_hammer) + cyborg.model.remove_module(locate_hammer, TRUE) + var/obj/item/forging/billow/locate_billow = locate() in cyborg.model.modules + if(locate_billow) + cyborg.model.remove_module(locate_billow, TRUE) + var/obj/item/forging/tongs/locate_tongs = locate() in cyborg.model.modules + if(locate_tongs) + cyborg.model.remove_module(locate_tongs, TRUE) + var/obj/item/borg/forging_setup/locate_forge = locate() in cyborg.model.modules + if(locate_forge) + cyborg.model.remove_module(locate_forge, TRUE) + /* * UNIVERSAL CYBORG UPGRADES */ @@ -337,54 +414,6 @@ for(var/obj/item/quadborg_nose/quadnose in borg.model.modules) borg.model.remove_module(quadnose, TRUE) -// Quadruped tongue - lick lick -/obj/item/quadborg_tongue - name = "synthetic tongue" - desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." - icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi' - icon_state = "synthtongue" - hitsound = 'sound/effects/attackblob.ogg' - desc = "For giving affectionate kisses." - item_flags = NOBLUDGEON - -/obj/item/quadborg_tongue/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || !isliving(target)) - return - var/mob/living/silicon/robot/borg = user - var/mob/living/mob = target - - if(!HAS_TRAIT(target, TRAIT_AFFECTION_AVERSION)) // Checks for Affection Aversion trait - if(check_zone(borg.zone_selected) == "head") - borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]'s face!"), span_notice("You affectionally lick \the [mob]'s face!")) - playsound(borg, 'sound/effects/attackblob.ogg', 50, 1) - else - borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]!"), span_notice("You affectionally lick \the [mob]!")) - playsound(borg, 'sound/effects/attackblob.ogg', 50, 1) - else - to_chat(user, span_warning("ERROR: [target] is on the Do Not Lick registry!")) - -// Quadruped nose - Boop -/obj/item/quadborg_nose - name = "boop module" - desc = "The BOOP module" - icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi' - icon_state = "nose" - obj_flags = CONDUCTS_ELECTRICITY - item_flags = NOBLUDGEON - force = 0 - -/obj/item/quadborg_nose/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - return - - if(!HAS_TRAIT(target, TRAIT_AFFECTION_AVERSION)) // Checks for Affection Aversion trait - do_attack_animation(target, null, src) - user.visible_message(span_notice("[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!")) - else - to_chat(user, span_warning("ERROR: [target] is on the No Nosing registry!")) - /// The Shrinkening /mob/living/silicon/robot var/hasShrunk = FALSE diff --git a/modular_skyrat/modules/borgs/code/update_icons.dm b/modular_skyrat/modules/borgs/code/update_icons.dm index dc982cbdabe..22f7779d999 100644 --- a/modular_skyrat/modules/borgs/code/update_icons.dm +++ b/modular_skyrat/modules/borgs/code/update_icons.dm @@ -11,6 +11,12 @@ add_overlay("[model.cyborg_base_icon]_cl") update_altborg_icons() + if(combat_indicator) + add_overlay(GLOB.combat_indicator_overlay) + + if(temporary_flavor_text) + add_overlay(GLOB.temporary_flavor_text_indicator) + /mob/living/silicon/robot/proc/update_altborg_icons() var/extra_overlay for(var/i in held_items) diff --git a/modular_skyrat/modules/borgs/icons/robot_items.dmi b/modular_skyrat/modules/borgs/icons/robot_items.dmi index dfac00b0d1c..2293dae78b3 100644 Binary files a/modular_skyrat/modules/borgs/icons/robot_items.dmi and b/modular_skyrat/modules/borgs/icons/robot_items.dmi differ diff --git a/modular_skyrat/modules/cargo_teleporter/code/cargo_teleporter.dm b/modular_skyrat/modules/cargo_teleporter/code/cargo_teleporter.dm index 4c0c96f0491..c5e0916f5e9 100644 --- a/modular_skyrat/modules/cargo_teleporter/code/cargo_teleporter.dm +++ b/modular_skyrat/modules/cargo_teleporter/code/cargo_teleporter.dm @@ -74,8 +74,14 @@ GLOBAL_LIST_EMPTY(cargo_marks) id = "cargotele" build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/cargo_teleporter - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 5) - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_CARGO) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_CARGO, + ) departmental_flags = DEPARTMENT_BITFLAG_CARGO /datum/techweb_node/cargo_teleporter diff --git a/modular_skyrat/modules/cellguns/code/medigun_research.dm b/modular_skyrat/modules/cellguns/code/medigun_research.dm index 3971455e44e..f7e6030cbbd 100644 --- a/modular_skyrat/modules/cellguns/code/medigun_research.dm +++ b/modular_skyrat/modules/cellguns/code/medigun_research.dm @@ -8,8 +8,15 @@ id = "medigun_speed" build_type = PROTOLATHE | AWAY_LATHE departmental_flags = DEPARTMENT_BITFLAG_MEDICAL - category = list(RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL) - materials = list(/datum/material/uranium = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/plasma = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, + ) build_path = /obj/item/device/custom_kit/medigun_fastcharge /datum/design/medicell @@ -17,7 +24,9 @@ desc = "Hey, you shouldn't see this. Like... at all." build_type = PROTOLATHE | AWAY_LATHE departmental_flags = DEPARTMENT_BITFLAG_MEDICAL - category = list(RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_MEDICALAMMO) + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_MEDICALAMMO, + ) //Tier 2 Medicells// @@ -25,28 +34,52 @@ name = "Brute II Medicell" desc = "Gives cell-loaded mediguns improved brute damage healing functionality." id = "brute2medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/brute/tier_2 /datum/design/medicell/burn2 name = "Burn II Medicell" desc = "Gives cell-loaded mediguns improved burn damage healing functionality." id = "burn2medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/burn/tier_2 /datum/design/medicell/toxin2 name = "Toxin II Medicell" desc = "Gives cell-loaded mediguns improved toxin damage healing functionality." id = "toxin2medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/toxin/tier_2 /datum/design/medicell/oxy2 name = "Oxygen II Medicell" desc = "Gives cell-loaded mediguns improved oxygen deprivation healing functionality." id = "oxy2medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/oxygen/tier_2 //Tier 3 Medicells// @@ -55,81 +88,157 @@ name = "Brute III Medicell" desc = "Gives cell-loaded mediguns advanced brute damage healing functionality." id = "brute3medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/brute/tier_3 /datum/design/medicell/burn3 name = "Burn III Medicell" desc = "Gives cell-loaded mediguns advanced burn damage healing functionality." id = "burn3medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/burn/tier_3 /datum/design/medicell/toxin3 name = "Toxin III Medicell" desc = "Gives cell-loaded mediguns advanced toxin damage healing functionality." id = "toxin3medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/toxin/tier_3 /datum/design/medicell/oxy3 name = "Oxygen III Medicell" desc = "Gives cell-loaded mediguns advanced oxygen deprivation healing functionality." id = "oxy3medicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/oxygen/tier_3 //Utility Medicells /datum/design/medicell/utility name = "Utility Medicell" - category = list(RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_MEDICALAMMO + RND_MEDICALAMMO_UTILITY) + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_MEDICALAMMO + RND_MEDICALAMMO_UTILITY, + ) /datum/design/medicell/utility/clot name = "Clotting Medicell" desc = "Gives cell-loaded mediguns projectile-based coagulation functionality." id = "clotmedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/weaponcell/medical/utility/clotting /datum/design/medicell/utility/temp name = "Temperature Adjustment Medicell" desc = "Gives cell loaded-mediguns projectile-based body temperature regulation functionality." id = "tempmedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/weaponcell/medical/utility/temperature /datum/design/medicell/utility/gown name = "Hardlight Gown Medicell" desc = "Gives cell-loaded mediguns projectile-based hardlight gown deployment functionality." id = "gownmedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/weaponcell/medical/utility/hardlight_gown /datum/design/medicell/utility/bed name = "Hardlight Roller Bed Medicell" desc = "Gives cell-loaded mediguns projectile-based hardlight roller bed deployment functionality. Best used on already-horizontal patients." id = "bedmedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/weaponcell/medical/utility/bed /datum/design/medicell/utility/salve name = "Empty Salve Medicell" desc = "An incomplete medicell that requires a leaf of aloe to fully realize its potential to provide projectile-embedding-based healing-over-time functionality." id = "salvemedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/device/custom_kit/empty_cell /datum/design/medicell/utility/body name = "Empty Body Teleporter Medicell" desc = "An incomplete medicell that requires a bluespace slime extract in order to provide projectile-based corpse retrieval functionality." id = "bodymedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/device/custom_kit/empty_cell/body_teleporter /datum/design/medicell/utility/relocation name = "Oppressive Force Relocation Medicell" desc = "Gives cell-loaded mediguns projectile-based rubbernecker relocation functionality, by dumping them into the Medbay lobby via eigenstate manipulation. Only works in Medbay when fired by authorized users." id = "relocatemedicell" - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/device/custom_kit/empty_cell/relocator diff --git a/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm b/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm index 8f8f51379ea..30561068759 100644 --- a/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm +++ b/modular_skyrat/modules/clock_cult/code/items/clockwork_slab.dm @@ -81,10 +81,10 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) . = ..() //Clear quickbinds for(var/datum/action/innate/clockcult/quick_bind/script as anything in quick_bound_scriptures) - script.Remove(user) + script?.Remove(user) if(active_scripture) - active_scripture.end_invocation() + active_scripture?.end_invocation() if(buffer) buffer = null @@ -97,7 +97,7 @@ GLOBAL_LIST_INIT(clockwork_slabs, list()) //Grant quickbound spells for(var/datum/action/innate/clockcult/quick_bind/script as anything in quick_bound_scriptures) - script.Grant(user) + script?.Grant(user) user.update_action_buttons() diff --git a/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm b/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm index 1324fd7630d..3f6c7fe92c4 100644 --- a/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm +++ b/modular_skyrat/modules/clock_cult/code/structures/technologists_lectern.dm @@ -428,10 +428,11 @@ apc_loop: for(var/obj/machinery/power/apc/controller as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc)) var/area/apc_area = get_area(controller) // make sure that no "critical" APCs lose their power (SM, namely) - for(var/turf/turf as anything in apc_area.contained_turfs) - for(var/obj/machinery/depowered_machinery in turf) - if(depowered_machinery.critical_machine) - continue apc_loop + for(var/list/zlevel_turfs as anything in apc_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + for(var/obj/machinery/depowered_machinery in area_turf) + if(depowered_machinery.critical_machine) + continue apc_loop controller.cell?.charge = 0 diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm index 988e335fff7..e9decad80a3 100644 --- a/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm @@ -27,3 +27,105 @@ w_class = WEIGHT_CLASS_NORMAL type_to_deploy = /obj/machinery/plumbing/synthesizer/water_synth deploy_time = 2 SECONDS + +// Machine that makes botany nutrients for hydroponics farming + +/obj/machinery/plumbing/synthesizer/colony_hydroponics + name = "hydroponics chemical synthesizer" + desc = "An infinitely useful device for those finding themselves in a frontier without a stable source of nutrients for crops. \ + Using a simplified version of the chemistry dispenser's synthesizer process, it can create hydroponics nutrients out of nothing \ + but good old electricity." + icon = 'modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi' + icon_state = "hydro_synth" + anchored = FALSE + /// Reagents that this can dispense, overrides the default list on init + var/static/list/synthesizable_reagents = list( + /datum/reagent/plantnutriment/eznutriment, + /datum/reagent/plantnutriment/left4zednutriment, + /datum/reagent/plantnutriment/robustharvestnutriment, + /datum/reagent/plantnutriment/endurogrow, + /datum/reagent/plantnutriment/liquidearthquake, + /datum/reagent/toxin/plantbgone/weedkiller, + /datum/reagent/toxin/pestkiller, + ) + +/obj/machinery/plumbing/synthesizer/colony_hydroponics/Initialize(mapload, bolt, layer) + . = ..() + dispensable_reagents = synthesizable_reagents + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +// Deployable item for cargo for the hydro synth + +/obj/item/flatpacked_machine/hydro_synth + name = "hydroponics chemical synthesizer parts kit" + icon = 'modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi' + icon_state = "hydro_synth_parts" + w_class = WEIGHT_CLASS_NORMAL + type_to_deploy = /obj/machinery/plumbing/synthesizer/colony_hydroponics + deploy_time = 2 SECONDS + +// Chem dispenser with a limited range of thematic reagents to dispense + +/obj/machinery/chem_dispenser/frontier_appliance + name = "sustenance dispenser" + desc = "Creates and dispenses a small pre-defined set of chemicals and other liquids for the convenience of those typically on the frontier. \ + While the machine is loved by many, it also has a reputation for making some of the worst coffees this side of the galaxy. Use at your own risk." + icon = 'modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi' + icon_state = "dispenser" + base_icon_state = "dispenser" + pass_flags = PASSTABLE + anchored_tabletop_offset = 4 + anchored = FALSE + circuit = null + powerefficiency = 0.5 + recharge_amount = 50 + show_ph = FALSE + base_reagent_purity = 0.5 + // God's strongest coffee machine + dispensable_reagents = list( + /datum/reagent/water, + /datum/reagent/consumable/powdered_milk, + /datum/reagent/consumable/sugar, + /datum/reagent/consumable/powdered_lemonade, + /datum/reagent/consumable/powdered_coco, + /datum/reagent/consumable/powdered_coffee, + /datum/reagent/consumable/powdered_tea, + /datum/reagent/consumable/vanilla, + /datum/reagent/consumable/caramel, + /datum/reagent/consumable/korta_nectar, + /datum/reagent/consumable/korta_milk, + /datum/reagent/consumable/astrotame, + /datum/reagent/consumable/salt, + /datum/reagent/consumable/blackpepper, + /datum/reagent/consumable/nutraslop, + /datum/reagent/consumable/enzyme, + ) + /// Since we don't have a board to take from, we use this to give the dispenser a cell on spawning + var/cell_we_spawn_with = /obj/item/stock_parts/cell/crap/empty + +/obj/machinery/chem_dispenser/frontier_appliance/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + cell = new cell_we_spawn_with(src) + +/obj/machinery/chem_dispenser/frontier_appliance/display_beaker() + var/mutable_appearance/overlayed_beaker = beaker_overlay || mutable_appearance(icon, "disp_beaker") + return overlayed_beaker + +/obj/machinery/chem_dispenser/frontier_appliance/RefreshParts() + . = ..() + powerefficiency = 0.5 + recharge_amount = 50 + +/obj/machinery/chem_dispenser/frontier_appliance/default_deconstruction_crowbar() + return + +// Deployable item for cargo for the sustenance machine + +/obj/item/flatpacked_machine/sustenance_machine + name = "sustenance dispenser parts kit" + icon = 'modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi' + icon_state = "dispenser_parts" + w_class = WEIGHT_CLASS_NORMAL + type_to_deploy = /obj/machinery/chem_dispenser/frontier_appliance + deploy_time = 2 SECONDS diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/co2_cracker.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/co2_cracker.dm new file mode 100644 index 00000000000..5835e65318b --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/co2_cracker.dm @@ -0,0 +1,118 @@ +// We can't just use electrolyzer reactions, because that'd let electrolyzers do co2 cracking + +GLOBAL_LIST_INIT(cracker_reactions, cracker_reactions_list()) + +/// Global proc to build up the list of co2 cracker reactions +/proc/cracker_reactions_list() + var/list/built_reaction_list = list() + for(var/reaction_path in subtypesof(/datum/cracker_reaction)) + var/datum/cracker_reaction/reaction = new reaction_path() + + built_reaction_list[reaction.id] = reaction + + return built_reaction_list + +/datum/cracker_reaction + var/list/requirements + var/name = "reaction" + var/id = "r" + var/desc = "" + var/list/factor + +/// Called when the co2 cracker reaction is run, should be where the code for actually changing gasses around is run +/datum/cracker_reaction/proc/react(turf/location, datum/gas_mixture/air_mixture, working_power) + return + +/// Checks if this reaction can actually be run +/datum/cracker_reaction/proc/reaction_check(datum/gas_mixture/air_mixture) + var/temp = air_mixture.temperature + var/list/cached_gases = air_mixture.gases + if((requirements["MIN_TEMP"] && temp < requirements["MIN_TEMP"]) || (requirements["MAX_TEMP"] && temp > requirements["MAX_TEMP"])) + return FALSE + for(var/id in requirements) + if(id == "MIN_TEMP" || id == "MAX_TEMP") + continue + if(!cached_gases[id] || cached_gases[id][MOLES] < requirements[id]) + return FALSE + return TRUE + +/datum/cracker_reaction/co2_cracking + name = "CO2 Cracking" + id = "co2_cracking" + desc = "Conversion of CO2 into equal amounts of O2" + requirements = list( + /datum/gas/carbon_dioxide = MINIMUM_MOLE_COUNT, + ) + factor = list( + /datum/gas/carbon_dioxide = "1 mole of CO2 gets consumed", + /datum/gas/oxygen = "1 mole of O2 gets produced", + "Location" = "Can only happen on turfs with an active CO2 cracker.", + ) + +/datum/cracker_reaction/co2_cracking/react(turf/location, datum/gas_mixture/air_mixture, working_power) + var/old_heat_capacity = air_mixture.heat_capacity() + air_mixture.assert_gases(/datum/gas/water_vapor, /datum/gas/oxygen) + var/proportion = min(air_mixture.gases[/datum/gas/carbon_dioxide][MOLES] * INVERSE(2), (2.5 * (working_power ** 2))) + air_mixture.gases[/datum/gas/carbon_dioxide][MOLES] -= proportion + air_mixture.gases[/datum/gas/oxygen][MOLES] += proportion + var/new_heat_capacity = air_mixture.heat_capacity() + if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) + air_mixture.temperature = max(air_mixture.temperature * old_heat_capacity / new_heat_capacity, TCMB) + +// CO2 cracker machine itself + +/obj/machinery/electrolyzer/co2_cracker + name = "portable CO2 cracker" + desc = "A portable device that is the savior of many a colony on the frontier. Performing similarly to an electrolyzer, \ + it takes in nearby gasses and breaks them into different gasses. The big draw of this one? It can crack carbon dioxide \ + into breathable oxygen. Handy for places where CO2 is all too common, and oxygen is all too hard to find." + icon = 'modular_skyrat/modules/colony_fabricator/icons/portable_machines.dmi' + circuit = null + working_power = 1 + /// Soundloop for while the thermomachine is turned on + var/datum/looping_sound/conditioner_running/soundloop + +/obj/machinery/electrolyzer/co2_cracker/Initialize(mapload) + . = ..() + soundloop = new(src, FALSE) + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +/obj/machinery/electrolyzer/co2_cracker/process_atmos() + if(on && !soundloop.loop_started) + soundloop.start() + else if(soundloop.loop_started) + soundloop.stop() + return ..() + +/obj/machinery/electrolyzer/co2_cracker/call_reactions(datum/gas_mixture/env) + for(var/reaction in GLOB.cracker_reactions) + var/datum/cracker_reaction/current_reaction = GLOB.cracker_reactions[reaction] + + if(!current_reaction.reaction_check(env)) + continue + + current_reaction.react(loc, env, working_power) + + env.garbage_collect() + +/obj/machinery/electrolyzer/co2_cracker/RefreshParts() + . = ..() + working_power = 2 + efficiency = 1 + +/obj/machinery/electrolyzer/co2_cracker/crowbar_act(mob/living/user, obj/item/tool) + return + +// "parts kit" for buying these from cargo + +/obj/item/flatpacked_machine/co2_cracker + name = "CO2 cracker parts kit" + icon = 'modular_skyrat/modules/colony_fabricator/icons/parts_kits.dmi' + icon_state = "co2_cracker" + type_to_deploy = /obj/machinery/electrolyzer/co2_cracker + deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, // We're gonna pretend plasma is the catalyst for co2 cracking + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/foodricator.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/foodricator.dm new file mode 100644 index 00000000000..780979a60ce --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/foodricator.dm @@ -0,0 +1,46 @@ +/obj/machinery/biogenerator/foodricator + name = "organic rations printer" + desc = "An advanced machine seen in frontier outposts and colonies capable of turning organic plant matter into \ + various foods or ingredients. The best friend of a chef where deliveries are inconsistent or simply don't exist. \ + Some of those that consume the food from this complain that the foods it makes have poor taste, though they must \ + not appreciate being able to eat steak and eggs for breakfast with a lack of any livestock at all in the colony." + icon = 'modular_skyrat/modules/colony_fabricator/icons/foodricator.dmi' + circuit = null + anchored = FALSE + pass_flags = PASSTABLE + efficiency = 1 + productivity = 2.5 + anchored_tabletop_offset = 8 + show_categories = list( + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/obj/machinery/biogenerator/foodricator/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +/obj/machinery/biogenerator/foodricator/RefreshParts() + . = ..() + efficiency = 1 + productivity = 3 + +/obj/machinery/biogenerator/foodricator/default_deconstruction_crowbar() + return + +// Deployable item for cargo for the rations printer + +/obj/item/flatpacked_machine/organics_ration_printer + name = "organic rations printer parts kit" + icon = 'modular_skyrat/modules/colony_fabricator/icons/foodricator.dmi' + icon_state = "biogenerator_parts" + type_to_deploy = /obj/machinery/biogenerator/foodricator + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm new file mode 100644 index 00000000000..1dca7c330c6 --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/recycler.dm @@ -0,0 +1,81 @@ +/obj/machinery/colony_recycler + name = "materials recycler" + desc = "A large crushing machine used to recycle small items inefficiently. Items are inserted by hand, rather than by belt. \ + Mind your fingers." + icon = 'modular_skyrat/modules/colony_fabricator/icons/portable_machines.dmi' + icon_state = "recycler" + anchored = FALSE + density = TRUE + circuit = null + /// The percentage of materials returned + var/amount_produced = 80 + /// The sound made when an item is eaten + var/item_recycle_sound = 'modular_skyrat/modules/reagent_forging/sound/forge.ogg' + /// The recycler's internal materials storage, for when items recycled don't produce enough to make a full sheet of that material + var/datum/component/material_container/materials + /// The list of all the materials we can recycle + var/static/list/allowed_materials = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/plasma, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plastic, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + ) + /// The item we turn into when repacked + var/repacked_type = /obj/item/flatpacked_machine/recycler + +/obj/machinery/colony_recycler/Initialize(mapload) + . = ..() + AddElement(/datum/element/repackable, repacked_type, 5 SECONDS) + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + materials = AddComponent( \ + /datum/component/material_container, \ + allowed_materials, \ + INFINITY, \ + MATCONTAINER_EXAMINE, \ + container_signals = list(COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/colony_recycler, has_eaten_materials)), \ + ) + +/obj/machinery/colony_recycler/Destroy() + materials = null + return ..() + +/obj/machinery/colony_recycler/examine(mob/user) + . = ..() + . += span_notice("Reclaiming [amount_produced]% of materials salvaged.") + . += span_notice("Can be secured with a wrench using Right-Click.") + +/obj/machinery/colony_recycler/wrench_act_secondary(mob/living/user, obj/item/tool) + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + +/// Proc called when the recycler eats new materials, checks if we should spit out new material sheets +/obj/machinery/colony_recycler/proc/has_eaten_materials(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER + + flick("recycler_grind", src) + playsound(src, item_recycle_sound, 50, TRUE) + use_power(min(active_power_usage * 0.25, amount_inserted / 100)) + + if(amount_inserted) + materials.retrieve_all(drop_location()) + +// "parts kit" for buying these from cargo + +/obj/item/flatpacked_machine/recycler + name = "recycler parts kit" + icon = 'modular_skyrat/modules/colony_fabricator/icons/parts_kits.dmi' + icon_state = "recycler" + type_to_deploy = /obj/machinery/colony_recycler + deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, // Titan for the crushing element + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/wind_turbine.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/wind_turbine.dm new file mode 100644 index 00000000000..29cf41d4299 --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/wind_turbine.dm @@ -0,0 +1,87 @@ +/obj/machinery/power/colony_wind_turbine + name = "miniature wind turbine" + desc = "A post with two special-designed vertical turbine blades attached to its sides. \ + When placed outdoors in a planet with an atmosphere, will produce a small trickle of power \ + for free. If there is a storm in the area the turbine is placed, the power production will \ + multiply significantly." + icon = 'modular_skyrat/modules/colony_fabricator/icons/wind_turbine.dmi' + icon_state = "turbine" + density = TRUE + max_integrity = 100 + idle_power_usage = 0 + anchored = TRUE + can_change_cable_layer = FALSE + circuit = null + layer = ABOVE_MOB_LAYER + can_change_cable_layer = TRUE + /// How much power the turbine makes without a storm + var/regular_power_production = 2500 + /// How much power the turbine makes during a storm + var/storm_power_production = 10000 + /// Is our pressure too low to function? + var/pressure_too_low = FALSE + /// Minimum external pressure needed to work + var/minimum_pressure = 5 + /// What we undeploy into + var/undeploy_type = /obj/item/flatpacked_machine/wind_turbine + +/obj/machinery/power/colony_wind_turbine/Initialize(mapload) + . = ..() + AddElement(/datum/element/repackable, undeploy_type, 2 SECONDS) + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + connect_to_network() + +/obj/machinery/power/colony_wind_turbine/examine(mob/user) + . = ..() + var/area/turbine_area = get_area(src) + if(!turbine_area.outdoors) + . += span_notice("Its must be constructed outdoors to function.") + if(pressure_too_low) + . += span_notice("There must be enough atmospheric pressure for the turbine to spin.") + + +/obj/machinery/power/colony_wind_turbine/process() + var/area/our_current_area = get_area(src) + if(!our_current_area.outdoors) + icon_state = "turbine" + add_avail(0) + return + + var/turf/our_turf = get_turf(src) + var/datum/gas_mixture/environment = our_turf.return_air() + + if(environment.return_pressure() < minimum_pressure) + pressure_too_low = TRUE + icon_state = "turbine" + add_avail(0) + return + + pressure_too_low = FALSE + var/storming_out = FALSE + + var/datum/weather/weather_we_track + for(var/datum/weather/possible_weather in SSweather.processing) + if((our_turf.z in possible_weather.impacted_z_levels) || (our_current_area in possible_weather.impacted_areas)) + weather_we_track = possible_weather + break + if(weather_we_track) + if(!(weather_we_track.stage == END_STAGE)) + storming_out = TRUE + + add_avail((storming_out ? storm_power_production : regular_power_production)) + + var/new_icon_state = (storming_out ? "turbine_storm" : "turbine_normal") + icon_state = new_icon_state + + +// Item for deploying wind turbines +/obj/item/flatpacked_machine/wind_turbine + name = "flat-packed miniature wind turbine" + icon = 'modular_skyrat/modules/colony_fabricator/icons/wind_turbine.dmi' + icon_state = "turbine_packed" + type_to_deploy = /obj/machinery/power/colony_wind_turbine + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm b/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm index c434228a9bb..531f90f7a4b 100644 --- a/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm +++ b/modular_skyrat/modules/colony_fabricator/code/colony_fabricator.dm @@ -44,7 +44,7 @@ icon_state = "colony_lathe_working" update_appearance() -/obj/machinery/rnd/production/colony_lathe/do_print(path, amount) +/obj/machinery/rnd/production/colony_lathe/finalize_build() . = ..() soundloop.stop() set_light(l_range = 0) diff --git a/modular_skyrat/modules/colony_fabricator/code/construction/doors.dm b/modular_skyrat/modules/colony_fabricator/code/construction/doors.dm index fb84fa473bc..5e901b29cc7 100644 --- a/modular_skyrat/modules/colony_fabricator/code/construction/doors.dm +++ b/modular_skyrat/modules/colony_fabricator/code/construction/doors.dm @@ -9,6 +9,17 @@ density = FALSE opacity = FALSE +/obj/machinery/door/poddoor/shutters/colony_fabricator/do_animate(animation) + switch(animation) + if("opening") + flick("opening", src) + icon_state = "open" + playsound(src, animation_sound, 30, TRUE) + if("closing") + flick("closing", src) + icon_state = "closed" + playsound(src, animation_sound, 30, TRUE) + /obj/item/flatpacked_machine/shutter_kit name = "prefab shutters parts kit" icon = 'modular_skyrat/modules/colony_fabricator/icons/doors/packed.dmi' diff --git a/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm b/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm new file mode 100644 index 00000000000..2781c521353 --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/construction/manual_door.dm @@ -0,0 +1,81 @@ +/obj/structure/mineral_door/manual_colony_door + name = "manual airlock" + icon = 'modular_skyrat/modules/colony_fabricator/icons/doors/airlock_manual.dmi' + material_flags = NONE + icon_state = "manual" + openSound = 'modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_open.wav' + closeSound = 'modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_close.wav' + /// What we disassemble into + var/disassembled_type = /obj/item/flatpacked_machine/airlock_kit_manual + /// How long it takes to open/close the door + var/manual_actuation_delay = 1 SECONDS + +/obj/structure/mineral_door/manual_colony_door/deconstruct(disassembled = TRUE) + if(disassembled) + new disassembled_type(get_turf(src)) + qdel(src) + +// Pickaxes won't dig these apart +/obj/structure/mineral_door/manual_colony_door/pickaxe_door(mob/living/user, obj/item/item_in_question) + return + +// These doors have a short do_after to check if you can open or close them +/obj/structure/mineral_door/manual_colony_door/TryToSwitchState(atom/user) + if(isSwitchingStates || !anchored) + return + if(!do_after(user, manual_actuation_delay, src)) + return + return ..() + +// We don't care about being bumped, just a copy of the base bumped proc +/obj/structure/mineral_door/manual_colony_door/Bumped(atom/movable/bumped_atom) + set waitfor = FALSE + SEND_SIGNAL(src, COMSIG_ATOM_BUMPED, bumped_atom) + +/obj/structure/mineral_door/manual_colony_door/Open() + isSwitchingStates = TRUE + playsound(src, openSound, 100, TRUE) + set_opacity(FALSE) + flick("[initial(icon_state)]opening",src) + icon_state = "[initial(icon_state)]open" + sleep(1 SECONDS) + set_density(FALSE) + door_opened = TRUE + layer = OPEN_DOOR_LAYER + air_update_turf(TRUE, FALSE) + update_appearance() + isSwitchingStates = FALSE + + if(close_delay != -1) + addtimer(CALLBACK(src, PROC_REF(Close)), close_delay) + +/obj/structure/mineral_door/manual_colony_door/Close() + if(isSwitchingStates || !door_opened) + return + var/turf/T = get_turf(src) + for(var/mob/living/L in T) + return + isSwitchingStates = TRUE + playsound(src, closeSound, 100, TRUE) + flick("[initial(icon_state)]closing",src) + icon_state = initial(icon_state) + sleep(1 SECONDS) + set_density(TRUE) + set_opacity(TRUE) + door_opened = FALSE + layer = initial(layer) + air_update_turf(TRUE, TRUE) + update_appearance() + isSwitchingStates = FALSE + +// Parts kit for putting the door together +/obj/item/flatpacked_machine/airlock_kit_manual + name = "prefab manual airlock parts kit" + icon = 'modular_skyrat/modules/colony_fabricator/icons/doors/packed.dmi' + icon_state = "airlock_parts_manual" + type_to_deploy = /obj/structure/mineral_door/manual_colony_door + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + ) + w_class = WEIGHT_CLASS_NORMAL diff --git a/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm b/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm index 766a5b9a401..5c9e6dafcae 100644 --- a/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm +++ b/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm @@ -16,7 +16,7 @@ GLOBAL_LIST_INIT(plastic_wall_panel_recipes, list( new/datum/stack_recipe("prefabricated wall", /turf/closed/wall/prefab_plastic, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("prefabricated window", /obj/structure/window/reinforced/colony_fabricator, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("prefabricated window", /obj/structure/window/fulltile/colony_fabricator, time = 1 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ )) /obj/item/stack/sheet/plastic_wall_panel @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(plastic_wall_panel_recipes, list( if(!use(1)) user.balloon_alert(user, "not enough material!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - new walltype(build_on) + build_on.place_on_top(walltype, flags = CHANGETURF_INHERIT_AIR) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/stack/sheet/plastic_wall_panel/get_main_recipes() diff --git a/modular_skyrat/modules/colony_fabricator/code/construction/windows.dm b/modular_skyrat/modules/colony_fabricator/code/construction/windows.dm index e2848ad7961..daddb68fc9a 100644 --- a/modular_skyrat/modules/colony_fabricator/code/construction/windows.dm +++ b/modular_skyrat/modules/colony_fabricator/code/construction/windows.dm @@ -1,11 +1,43 @@ -/obj/structure/window/reinforced/colony_fabricator +/obj/structure/window/fulltile/colony_fabricator name = "prefabricated window" desc = "A conservatively built metal frame with a thick sheet of space-grade glass slotted into it." icon = 'modular_skyrat/modules/colony_fabricator/icons/prefab_window.dmi' icon_state = "prefab-0" base_icon_state = "prefab" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE - canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE + fulltile = TRUE glass_type = /obj/item/stack/sheet/plastic_wall_panel glass_amount = 1 + +/obj/structure/grille/attackby(obj/item/item_in_question, mob/user, params) + if(!istype(item_in_question, /obj/item/stack/sheet/plastic_wall_panel)) + return ..() + + if(broken) + return + var/obj/item/stack/stack_in_question = item_in_question + if(stack_in_question.get_amount() < 1) + to_chat(user, span_warning("You need at least one plastic panel for that!")) + return + var/dir_to_set = SOUTHWEST + if(!anchored) + to_chat(user, span_warning("[src] needs to be fastened to the floor first!")) + return + for(var/obj/structure/window/window_on_turf in loc) + to_chat(user, span_warning("There is already a window there!")) + return + if(!clear_tile(user)) + return + to_chat(user, span_notice("You start placing the window...")) + if(!do_after(user, 1 SECONDS, target = src)) + return + if(!src.loc || !anchored) //Grille broken or unanchored while waiting + return + for(var/obj/structure/window/window_on_turf in loc) //Another window already installed on grille + return + if(!clear_tile(user)) + return + var/obj/structure/window/new_window = new /obj/structure/window/fulltile/colony_fabricator(drop_location()) + new_window.setDir(dir_to_set) + new_window.state = 0 + stack_in_question.use(1) + to_chat(user, span_notice("You place [new_window] on [src].")) diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/appliances.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/appliances.dm index acd6182f3f1..8a4a70f318f 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/appliances.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/appliances.dm @@ -4,6 +4,8 @@ #define FABRICATOR_SUBCATEGORY_POWER "/Power" #define FABRICATOR_SUBCATEGORY_ATMOS "/Atmospherics" #define FABRICATOR_SUBCATEGORY_FLUIDS "/Liquids" +#define FABRICATOR_SUBCATEGORY_MATERIALS "/Materials" +#define FABRICATOR_SUBCATEGORY_SUSTENANCE "/Sustenance" // Techweb node that shouldnt show up anywhere ever specifically for the fabricator to work with @@ -18,6 +20,11 @@ "survival_knife", // I just don't want to make a whole new node for this one sorry "soup_pot", // This one too "water_synth", + "hydro_synth", + "frontier_sustenance_dispenser", + "co2_cracker", + "portable_recycler", + "foodricator", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000000000000000) // God save you hidden = TRUE @@ -90,7 +97,99 @@ ) construction_time = 10 SECONDS +// Plumbable chem machine that makes nothing but water + +/datum/design/hydro_synthesizer + name = "Hydroponics Chemical Synthesizer" + id = "hydro_synth" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/machinery/plumbing/synthesizer/colony_hydroponics + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_FLUIDS, + ) + construction_time = 10 SECONDS + +// Chem dispenser that dispenses various flavored beverages and nutrislop, yum! + +/datum/design/frontier_sustenance_dispenser + name = "Sustenance Dispenser" + id = "frontier_sustenance_dispenser" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/machinery/chem_dispenser/frontier_appliance + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_SUSTENANCE, + ) + construction_time = 30 SECONDS + +// CO2 cracker, portable machines that takes CO2 and turns it into oxygen + +/datum/design/co2_cracker + name = "Portable Carbon Dioxide Cracker" + id = "co2_cracker" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, // We're gonna pretend plasma is the catalyst for co2 cracking + ) + build_path = /obj/machinery/electrolyzer/co2_cracker + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_ATMOS, + ) + construction_time = 30 SECONDS + +// A portable recycling machine, use item with materials on it to recycle + +/datum/design/portable_recycler + name = "Portable Recycler" + id = "portable_recycler" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, // Titan for the crushing element + ) + build_path = /obj/machinery/colony_recycler + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_MATERIALS, + ) + construction_time = 30 SECONDS + +// Rations printer, turns biomass into seeds, some synthesized foods, ingredients, so on + +/datum/design/foodricator + name = "Organic Rations Printer" + id = "foodricator" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/flatpacked_machine/organics_ration_printer + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_SUSTENANCE, + ) + construction_time = 30 SECONDS + #undef FABRICATOR_CATEGORY_APPLIANCES #undef FABRICATOR_SUBCATEGORY_POWER #undef FABRICATOR_SUBCATEGORY_ATMOS #undef FABRICATOR_SUBCATEGORY_FLUIDS +#undef FABRICATOR_SUBCATEGORY_MATERIALS +#undef FABRICATOR_SUBCATEGORY_SUSTENANCE diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/construction.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/construction.dm index 14e26f0e69c..7e5e608aca3 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/construction.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/construction.dm @@ -10,6 +10,7 @@ description = "Contains all of the colony fabricator's structure designs." design_ids = list( "prefab_airlock_kit", + "prefab_manual_airlock_kit", "prefab_shutters_kit", "prefab_floor_tile", "prefab_cat_floor_tile", @@ -37,6 +38,23 @@ ) construction_time = 30 SECONDS +// Manul Airlock kit + +/datum/design/prefab_manual_airlock_kit + name = "Prefab Manual Airlock" + id = "prefab_manual_airlock_kit" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + ) + build_path = /obj/item/flatpacked_machine/airlock_kit_manual + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + FABRICATOR_SUBCATEGORY_STRUCTURES, + ) + construction_time = 30 SECONDS + // Shutters kit /datum/design/prefab_shutters_kit @@ -57,7 +75,7 @@ // Fancy floor tiles /datum/design/prefab_floor_tile - name = "Prefab Floor Tile" + name = "Prefab Floor Tile x4" id = "prefab_floor_tile" build_type = COLONY_FABRICATOR materials = list( @@ -73,7 +91,7 @@ // Fancy catwalk floor tiles /datum/design/prefab_cat_floor_tile - name = "Prefab Catwalk Plating" + name = "Prefab Catwalk Plating x4" id = "prefab_cat_floor_tile" build_type = COLONY_FABRICATOR materials = list( @@ -94,7 +112,7 @@ build_type = COLONY_FABRICATOR materials = list( /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, - /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5 + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, ) build_path = /obj/item/stack/sheet/plastic_wall_panel/ten category = list( diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/equipment.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/equipment.dm index 1740162cbf4..067b0084046 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/equipment.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/equipment.dm @@ -3,7 +3,7 @@ id = "survival_knife" build_type = COLONY_FABRICATOR materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT * 6 + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 6, ) build_path = /obj/item/knife/combat/survival category = list( @@ -17,7 +17,7 @@ id = "soup_pot" build_type = COLONY_FABRICATOR materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5 + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, ) build_path = /obj/item/reagent_containers/cup/soup_pot category = list( diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/construction.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/construction.dm index 1a83a810cc2..ea92e20e1f3 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/construction.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/construction.dm @@ -40,6 +40,8 @@ . = ..() build_type |= COLONY_FABRICATOR +// Wall frames + /datum/design/camera_assembly/New() . = ..() build_type |= COLONY_FABRICATOR @@ -48,6 +50,32 @@ . = ..() build_type |= COLONY_FABRICATOR +/datum/design/light_switch_frame/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/ignition_control/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/sparker/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/newscaster_frame/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/status_display_frame/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/requests_console/New() + . = ..() + build_type |= COLONY_FABRICATOR + +// Lights + /datum/design/light_tube/New() . = ..() build_type |= COLONY_FABRICATOR @@ -56,6 +84,8 @@ . = ..() build_type |= COLONY_FABRICATOR +// Conveyors + /datum/design/conveyor_belt/New() . = ..() build_type |= COLONY_FABRICATOR @@ -64,6 +94,8 @@ . = ..() build_type |= COLONY_FABRICATOR +// Materials + /datum/design/lavarods/New() . = ..() build_type |= COLONY_FABRICATOR diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm index 86b70bc7f74..47560f14e6a 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm @@ -14,10 +14,6 @@ . = ..() build_type |= COLONY_FABRICATOR -/datum/design/board/recycler/New() - . = ..() - build_type |= COLONY_FABRICATOR - /datum/design/board/suit_storage_unit/New() . = ..() build_type |= COLONY_FABRICATOR @@ -34,6 +30,32 @@ . = ..() build_type |= COLONY_FABRICATOR -/datum/design/board/biogenerator/New() +// Turbine Stuff + +/datum/design/board/turbine_computer/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/board/turbine_compressor/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/board/turbine_rotor/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/board/turbine_stator/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/turbine_part_compressor/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/turbine_part_stator/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/turbine_part_rotor/New() . = ..() build_type |= COLONY_FABRICATOR diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/flatpack_machines.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/flatpack_machines.dm index a824a145df9..5912a347bd2 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/flatpack_machines.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/flatpack_machines.dm @@ -22,6 +22,8 @@ "flatpack_fuel_generator", "flatpack_rtg", "flatpack_thermo", + "flatpack_ore_silo", + "flatpack_turbine_team_fortress_two", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000000000000000) // God save you hidden = TRUE @@ -201,6 +203,46 @@ ) construction_time = 20 SECONDS +// Ore silo except it beeps + +/datum/design/flatpack_ore_silo + name = "Flat-packed Ore Silo" + desc = "An all-in-one materials management solution. Connects resource-using machines \ + through a network of distrobution systems." + id = "flatpack_ore_silo" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + ) + build_path = /obj/item/flatpacked_machine/ore_silo + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_FLATPACK_MACHINES + FABRICATOR_SUBCATEGORY_MATERIALS, + ) + construction_time = 1 MINUTES + +// Wind turbine, produces tiny amounts of power when placed outdoors in an atmosphere, but makes significantly more if there's a storm in that area + +/datum/design/flatpack_turbine_team_fortress_two + name = "Flat-packed Miniature Wind Turbine" + desc = "A deployable fabricator capable of producing other flat-packed machines and other special equipment tailored for \ + rapidly constructing functional structures given resources and power. While it cannot be upgraded, it can be repacked \ + and moved to any location you see fit. This one makes specialized engineering designs and tools." + id = "flatpack_turbine_team_fortress_two" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/flatpacked_machine/wind_turbine + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_FLATPACK_MACHINES + FABRICATOR_SUBCATEGORY_POWER, + ) + construction_time = 30 SECONDS + #undef FABRICATOR_CATEGORY_FLATPACK_MACHINES #undef FABRICATOR_SUBCATEGORY_MANUFACTURING #undef FABRICATOR_SUBCATEGORY_POWER diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/ingredients.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/ingredients.dm new file mode 100644 index 00000000000..3c7b6e8d39a --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/ingredients.dm @@ -0,0 +1,65 @@ +/datum/design/frontier_ration_egg + name = "Egg" + id = "frontier_ration_egg" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/food/egg + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + ) + +/datum/design/frontier_ration_chicken + name = "Chicken" + id = "frontier_ration_chicken" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/food/meat/slab/chicken + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + ) + +/datum/design/frontier_ration_mystery_meat + name = "Meat Product" + id = "frontier_ration_mystery_meat" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/food/meat/slab/meatproduct + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + ) + +/datum/design/frontier_ration_butter + name = "Butter" + id = "frontier_ration_butter" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/food/butter + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + ) + +/datum/design/frontier_ration_cheese + name = "Cheese" + id = "frontier_ration_cheese" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/food/cheese/wedge + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + ) + +/datum/design/frontier_ration_cheese_firm + name = "Firm Cheese" + id = "frontier_ration_firm_cheese" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/food/cheese/firm_cheese_slice + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_INGREDIENTS, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/reagents.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/reagents.dm new file mode 100644 index 00000000000..64134e7f67f --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/reagents.dm @@ -0,0 +1,65 @@ +/datum/design/frontier_ration_flour + name = "Flour Sack" + id = "frontier_ration_flour_sack" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/condiment/flour/small_ration + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + ) + +/datum/design/frontier_ration_flour_korta + name = "Korta Flour Sack" + id = "frontier_ration_flour_sack_korta" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/condiment/small_ration_korta_flour + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + ) + +/datum/design/frontier_ration_rice + name = "Rice Sack" + id = "frontier_ration_rice_sack" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/condiment/rice/small_ration + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + ) + +/datum/design/frontier_ration_sugar + name = "Sugar Sack" + id = "frontier_ration_sugar_sack" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/condiment/sugar/small_ration + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + ) + +/datum/design/frontier_ration_soy_milk + name = "Soy Milk" + id = "frontier_ration_soy_milk_cart" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/condiment/soymilk/small_ration + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + ) + +/datum/design/frontier_ration_milk + name = "Milk" + id = "frontier_ration_milk_cart" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/condiment/milk/small_ration + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_BAGS, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm new file mode 100644 index 00000000000..ed1590d71b3 --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm @@ -0,0 +1,87 @@ +/datum/design/organic_parsnip_seed + name = "Pack of Parsnip Seeds" + id = "oganic_parsnip_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/carrot/parsnip + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_beet_seed + name = "Pack of White-Beet Seeds" + id = "oganic_beet_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/whitebeet + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_potato_seed + name = "Pack of Potato Seeds" + id = "oganic_potato_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/potato + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_soy_seed + name = "Pack of Soybean Seeds" + id = "oganic_soy_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/soya + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_rice_seed + name = "Pack of Rice Seeds" + id = "oganic_rice_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/wheat/rice + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_oat_seed + name = "Pack of Oat Seeds" + id = "oganic_oat_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/wheat/oat + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_korta_seed + name = "Pack of Korta Seeds" + id = "oganic_korta_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/korta_nut + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) + +/datum/design/organic_herb_seed + name = "Pack of Herb Seeds" + id = "oganic_herb_seed" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/seeds/herbs + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_SEEDS, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/snacks.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/snacks.dm new file mode 100644 index 00000000000..73098b23288 --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/snacks.dm @@ -0,0 +1,76 @@ +/datum/design/frontier_ration_gum + name = "Gum" + id = "frontier_ration_gum" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/storage/box/gum + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) + +/datum/design/frontier_ration_gum_wakeup + name = "Activin 12 Hour Medicated Gum" + id = "frontier_ration_gum_wakeup" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/storage/box/gum/wake_up + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) + +/datum/design/frontier_ration_energy_bar + name = "High Power Energy Bar" + id = "frontier_ration_energy_bar" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/food/energybar + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) + +/datum/design/frontier_ration_ciggies + name = "Cigarettes" + id = "frontier_ration_ciggies" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/storage/fancy/cigarettes/cigpack_uplift + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) + +/datum/design/frontier_ration_engine_fodder + name = "Engine Fodder" + id = "frontier_ration_engine_fodder" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/food/vendor_snacks/moth_bag + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) + +/datum/design/frontier_ration_fueljak_snack + name = "Fueljack's Snack" + id = "frontier_ration_fueljak_snack" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/food/vendor_snacks/moth_bag/fuel_jack + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) + +/datum/design/frontier_ration_ricecracker + name = "Rice Crackers" + id = "frontier_ration_ricecracker" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/food/vendor_snacks/rice_crackers + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_SNACKS, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/utensils.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/utensils.dm new file mode 100644 index 00000000000..05508fc659b --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/rations_printer_designs/utensils.dm @@ -0,0 +1,43 @@ +/datum/design/frontier_ration_plastic_fork + name = "Plastic Fork" + id = "frontier_ration_plastic_fork" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 10) + build_path = /obj/item/kitchen/fork/plastic + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS, + ) + +/datum/design/frontier_ration_plastic_spoon + name = "Plastic Spoon" + id = "frontier_ration_plastic_spoon" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 10) + build_path = /obj/item/kitchen/spoon/plastic + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS, + ) + +/datum/design/frontier_ration_plastic_knife + name = "Plastic Knife" + id = "frontier_ration_plastic_knife" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 10) + build_path = /obj/item/knife/plastic + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS, + ) + +/datum/design/frontier_ration_plastic_cup + name = "Plastic Cup" + id = "frontier_ration_plastic_cup" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/reagent_containers/cup/glass/coffee_cup + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/design_datums/tools.dm b/modular_skyrat/modules/colony_fabricator/code/design_datums/tools.dm index 0ddfb18e1f7..f69d0d1f431 100644 --- a/modular_skyrat/modules/colony_fabricator/code/design_datums/tools.dm +++ b/modular_skyrat/modules/colony_fabricator/code/design_datums/tools.dm @@ -55,7 +55,7 @@ build_path = /obj/item/weldingtool/electric/arc_welder materials = list( /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT * 1.5, ) category = list( diff --git a/modular_skyrat/modules/colony_fabricator/code/looping_sounds.dm b/modular_skyrat/modules/colony_fabricator/code/looping_sounds.dm index 5c375e6259c..f8caa59225f 100644 --- a/modular_skyrat/modules/colony_fabricator/code/looping_sounds.dm +++ b/modular_skyrat/modules/colony_fabricator/code/looping_sounds.dm @@ -31,5 +31,5 @@ 'modular_skyrat/modules/colony_fabricator/sound/conditioner/conditioner_4.wav' = 1, ) mid_length = 3 SECONDS - volume = 75 + volume = 40 falloff_exponent = 3 diff --git a/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm b/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm new file mode 100644 index 00000000000..3f2aa400814 --- /dev/null +++ b/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm @@ -0,0 +1,23 @@ +/obj/machinery/ore_silo/colony_lathe + name = "colony ore silo" + desc = "An all-in-one materials management solution. Connects resource-using machines \ + through a network of distribution systems." + icon = 'modular_skyrat/modules/colony_fabricator/icons/ore_silo.dmi' + circuit = null + /// What this unpacks into + var/unpacked_type = /obj/item/flatpacked_machine/ore_silo + +/obj/machinery/ore_silo/colony_lathe/silo_log(obj/machinery/machinery_in_question, action, amount, noun, list/mats) + . = ..() + playsound(src, 'sound/machines/beep.ogg', 30, TRUE) + +// Item for deploying ore silos +/obj/item/flatpacked_machine/ore_silo + name = "flat-packed ore silo" + icon = 'modular_skyrat/modules/colony_fabricator/icons/ore_silo.dmi' + icon_state = "ore_silo" + type_to_deploy = /obj/machinery/ore_silo/colony_lathe + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + ) diff --git a/modular_skyrat/modules/colony_fabricator/code/machines/power_storage_unit.dm b/modular_skyrat/modules/colony_fabricator/code/machines/power_storage_unit.dm index d98040312af..241d3c3c367 100644 --- a/modular_skyrat/modules/colony_fabricator/code/machines/power_storage_unit.dm +++ b/modular_skyrat/modules/colony_fabricator/code/machines/power_storage_unit.dm @@ -5,9 +5,9 @@ higher maximum output than some larger units. Most commonly seen being used not for their ability to store \ power, but rather for use in regulating power input and output." icon = 'modular_skyrat/modules/colony_fabricator/icons/power_storage_unit/small_battery.dmi' - capacity = 75e4 - input_level_max = 4e5 - output_level_max = 4e5 + capacity = 750 * 1000 + input_level_max = 400 * 1000 + output_level_max = 400 * 1000 circuit = null obj_flags = CAN_BE_HIT | NO_DECONSTRUCTION /// The item we turn into when repacked @@ -39,9 +39,17 @@ return // We also don't need to bother with fuddling with charging power cells, there are none to remove -/obj/machinery/power/smes/on_deconstruction() +/obj/machinery/power/smes/battery_pack/on_deconstruction() return +// Automatically set themselves to be completely charged on init + +/obj/machinery/power/smes/battery_pack/precharged + +/obj/machinery/power/smes/battery_pack/precharged/Initialize(mapload) + . = ..() + charge = capacity + // Item for creating the small battery and carrying it around /obj/item/flatpacked_machine/station_battery @@ -58,11 +66,19 @@ low maximum output compared to smaller units. Most commonly seen as large backup batteries, or simply \ for large power storage where throughput is not a concern." icon = 'modular_skyrat/modules/colony_fabricator/icons/power_storage_unit/large_battery.dmi' - capacity = 1e7 - input_level_max = 5e4 - output_level_max = 5e4 + capacity = 10000 * 1000 + input_level_max = 50 * 1000 + output_level_max = 50 * 1000 repacked_type = /obj/item/flatpacked_machine/large_station_battery +// Automatically set themselves to be completely charged on init + +/obj/machinery/power/smes/battery_pack/large/precharged + +/obj/machinery/power/smes/battery_pack/large/precharged/Initialize(mapload) + . = ..() + charge = capacity + /obj/item/flatpacked_machine/large_station_battery name = "flat-packed large stationary battery" icon_state = "battery_large_packed" diff --git a/modular_skyrat/modules/colony_fabricator/code/machines/thermomachine.dm b/modular_skyrat/modules/colony_fabricator/code/machines/thermomachine.dm index 4f59cac7251..1cd83901891 100644 --- a/modular_skyrat/modules/colony_fabricator/code/machines/thermomachine.dm +++ b/modular_skyrat/modules/colony_fabricator/code/machines/thermomachine.dm @@ -20,6 +20,7 @@ AddElement(/datum/element/repackable, repacked_type, 2 SECONDS) AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) flick("thermo_deploy", src) + setDir(dir) /obj/machinery/atmospherics/components/unary/thermomachine/deployable/RefreshParts() . = ..() diff --git a/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm b/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm index 604bf109b0e..f25de4f295d 100644 --- a/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm +++ b/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm @@ -32,6 +32,10 @@ greyscale_config_belt = null greyscale_config_inhand_left = null greyscale_config_inhand_right = null + /// Used on Initialize, how much time to cut cable restraints and zipties. + 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 = null /obj/item/screwdriver/omni_drill/Initialize(mapload) . = ..() @@ -67,6 +71,7 @@ var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) if(!check_menu(user) || !tool_result) return + RemoveElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) switch(tool_result) if("Wrench") tool_behaviour = TOOL_WRENCH @@ -74,6 +79,7 @@ if("Wirecutters") tool_behaviour = TOOL_WIRECUTTER sharpness = NONE + AddElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) if("Screwdriver") tool_behaviour = TOOL_SCREWDRIVER sharpness = SHARP_POINTY diff --git a/modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi b/modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi index c8533ee3e1e..96126d26101 100644 Binary files a/modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi and b/modular_skyrat/modules/colony_fabricator/icons/chemistry_machines.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/doors/airlock_manual.dmi b/modular_skyrat/modules/colony_fabricator/icons/doors/airlock_manual.dmi new file mode 100644 index 00000000000..3ced7b3a163 Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/icons/doors/airlock_manual.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/doors/packed.dmi b/modular_skyrat/modules/colony_fabricator/icons/doors/packed.dmi index 1f3dacc63d9..118709bb772 100644 Binary files a/modular_skyrat/modules/colony_fabricator/icons/doors/packed.dmi and b/modular_skyrat/modules/colony_fabricator/icons/doors/packed.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/foodricator.dmi b/modular_skyrat/modules/colony_fabricator/icons/foodricator.dmi new file mode 100644 index 00000000000..d54728eb58a Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/icons/foodricator.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/ore_silo.dmi b/modular_skyrat/modules/colony_fabricator/icons/ore_silo.dmi new file mode 100644 index 00000000000..8cbf8158644 Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/icons/ore_silo.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/parts_kits.dmi b/modular_skyrat/modules/colony_fabricator/icons/parts_kits.dmi new file mode 100644 index 00000000000..75a4e97e23f Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/icons/parts_kits.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/portable_machines.dmi b/modular_skyrat/modules/colony_fabricator/icons/portable_machines.dmi new file mode 100644 index 00000000000..046d517a0de Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/icons/portable_machines.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/icons/wind_turbine.dmi b/modular_skyrat/modules/colony_fabricator/icons/wind_turbine.dmi new file mode 100644 index 00000000000..26a37260b73 Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/icons/wind_turbine.dmi differ diff --git a/modular_skyrat/modules/colony_fabricator/sound/attributions.txt b/modular_skyrat/modules/colony_fabricator/sound/attributions.txt index 41f5a6b8600..a2042d10aa0 100644 --- a/modular_skyrat/modules/colony_fabricator/sound/attributions.txt +++ b/modular_skyrat/modules/colony_fabricator/sound/attributions.txt @@ -12,3 +12,5 @@ modular_skyrat/modules/colony_fabricator/sound/conditioner/conditioner_(1 - 4).w The following sounds are from https://pixabay.com/sound-effects/welder-3-54547/ modular_skyrat/modules/colony_fabricator/sound/arc_welder/arc_welder.ogg + +The sounds at modular_skyrat/modules/colony_fabriactor_event_code/sound/manual_door are from https://pixabay.com/sound-effects/schlonk-107321/ diff --git a/modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_close.wav b/modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_close.wav new file mode 100644 index 00000000000..a2f6ad300b0 Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_close.wav differ diff --git a/modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_open.wav b/modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_open.wav new file mode 100644 index 00000000000..431b3eb6ea0 Binary files /dev/null and b/modular_skyrat/modules/colony_fabricator/sound/manual_door/manual_door_open.wav differ diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/akh_frontier.dm b/modular_skyrat/modules/company_imports/code/armament_datums/akh_frontier.dm index 1c42f23b121..290ab7386fc 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/akh_frontier.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/akh_frontier.dm @@ -31,6 +31,10 @@ cost = CARGO_CRATE_VALUE * 6 restricted = TRUE +/datum/armament_entry/company_import/akh_frontier/deployables_fab/foodricator + item_type = /obj/item/flatpacked_machine/organics_ration_printer + cost = CARGO_CRATE_VALUE * 2 + // Various smaller appliances than the deployable machines below /datum/armament_entry/company_import/akh_frontier/appliances @@ -44,6 +48,13 @@ /datum/armament_entry/company_import/akh_frontier/appliances/water_synth item_type = /obj/item/flatpacked_machine/water_synth +/datum/armament_entry/company_import/akh_frontier/appliances/hydro_synth + item_type = /obj/item/flatpacked_machine/hydro_synth + +/datum/armament_entry/company_import/akh_frontier/appliances/sustenance_dispenser + item_type = /obj/item/flatpacked_machine/sustenance_machine + cost = PAYCHECK_COMMAND * 2 + // Flatpacked, ready to deploy machines /datum/armament_entry/company_import/akh_frontier/deployables_misc @@ -56,6 +67,12 @@ /datum/armament_entry/company_import/akh_frontier/deployables_misc/thermomachine item_type = /obj/item/flatpacked_machine/thermomachine +/datum/armament_entry/company_import/akh_frontier/deployables_misc/co2_cracker + item_type = /obj/item/flatpacked_machine/co2_cracker + +/datum/armament_entry/company_import/akh_frontier/deployables_misc/recycler + item_type = /obj/item/flatpacked_machine/recycler + // Flatpacked, ready to deploy machines for power related activities /datum/armament_entry/company_import/akh_frontier/deployables diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm b/modular_skyrat/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm index 339cd458073..57500064ad8 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm @@ -163,7 +163,7 @@ item_type = /obj/item/ammo_box/advanced/s12gauge/antitide */ //BUBBER EDIT END /datum/armament_entry/company_import/vitezstvi/shot_shells/confetti - item_type = /obj/item/ammo_box/advanced/s12gauge/honk + item_type = /obj/item/ammo_box/advanced/s12gauge/honkshot // Boxes of kiboko launcher ammo diff --git a/modular_skyrat/modules/company_imports/code/objects/hud_glasses.dm b/modular_skyrat/modules/company_imports/code/objects/hud_glasses.dm index 0793a3cca8e..fdb9df70e32 100644 --- a/modular_skyrat/modules/company_imports/code/objects/hud_glasses.dm +++ b/modular_skyrat/modules/company_imports/code/objects/hud_glasses.dm @@ -17,7 +17,12 @@ desc = "A heads-up display that scans humanoids in view, and displays if their current ID possesses a firearms permit or not." id = "permit_glasses" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/clothing/glasses/hud/gun_permit - category = list(RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC, + ) departmental_flags = DEPARTMENT_BITFLAG_CARGO diff --git a/modular_skyrat/modules/conveyor_sorter/code/conveyor_sorter.dm b/modular_skyrat/modules/conveyor_sorter/code/conveyor_sorter.dm index 32cec0b2f9a..550de51f205 100644 --- a/modular_skyrat/modules/conveyor_sorter/code/conveyor_sorter.dm +++ b/modular_skyrat/modules/conveyor_sorter/code/conveyor_sorter.dm @@ -144,8 +144,13 @@ id = "conveysorter" build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/conveyor_sorter - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5) - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_CARGO) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_CARGO, + ) departmental_flags = DEPARTMENT_BITFLAG_CARGO /datum/techweb_node/conveyor_sorter @@ -181,10 +186,10 @@ id = "conveyor_sorter_improved" build_path = /obj/item/conveyor_sorter/improved materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, - /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, - /datum/material/gold = SMALL_MATERIAL_AMOUNT * 5, - /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 5, + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, ) diff --git a/modular_skyrat/modules/cortical_borer/code/cortical_borer_chems.dm b/modular_skyrat/modules/cortical_borer/code/cortical_borer_chems.dm index b69f69a31ec..4fc9c6d2cca 100644 --- a/modular_skyrat/modules/cortical_borer/code/cortical_borer_chems.dm +++ b/modular_skyrat/modules/cortical_borer/code/cortical_borer_chems.dm @@ -6,7 +6,7 @@ var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(M, span_notice("[high_message]")) - M.add_mood_event("tweaking", /datum/mood_event/stimulant_medium, name) + M.add_mood_event("tweaking", /datum/mood_event/stimulant_medium, 1, name) M.AdjustStun(-40 * REM * seconds_per_tick) M.AdjustKnockdown(-40 * REM * seconds_per_tick) M.AdjustUnconscious(-40 * REM * seconds_per_tick) diff --git a/modular_skyrat/modules/cryosleep/code/cryopod.dm b/modular_skyrat/modules/cryosleep/code/cryopod.dm index f2d9c4b5bae..812b83574dd 100644 --- a/modular_skyrat/modules/cryosleep/code/cryopod.dm +++ b/modular_skyrat/modules/cryosleep/code/cryopod.dm @@ -496,7 +496,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod, 32) return to_chat(user, span_notice("You tuck [occupant.name] into their pod!")) qdel(weapon) - user.add_mood_event("tucked", /datum/mood_event/tucked_in, occupant) + user.add_mood_event("tucked", /datum/mood_event/tucked_in, 1, occupant) tucked = TRUE /obj/machinery/cryopod/update_icon_state() diff --git a/modular_skyrat/modules/customization/game/objects/items/devices/crutch.dm b/modular_skyrat/modules/customization/game/objects/items/devices/crutch.dm index 77bae224399..9377029f96a 100644 --- a/modular_skyrat/modules/customization/game/objects/items/devices/crutch.dm +++ b/modular_skyrat/modules/customization/game/objects/items/devices/crutch.dm @@ -6,7 +6,9 @@ inhand_icon_state = "crutch" lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/melee_lefthand.dmi' righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/melee_righthand.dmi' - custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 6) + custom_materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 6, + ) attack_verb_continuous = list("bludgeons", "whacks", "thrashes") attack_verb_simple = list("bludgeon", "whack", "thrash") - + diff --git a/modular_skyrat/modules/customization/game/objects/items/plushes.dm b/modular_skyrat/modules/customization/game/objects/items/plushes.dm index 1d6349c5651..23ba628eac8 100644 --- a/modular_skyrat/modules/customization/game/objects/items/plushes.dm +++ b/modular_skyrat/modules/customization/game/objects/items/plushes.dm @@ -426,7 +426,7 @@ user.changeNext_move(CLICK_CD_MELEE) // To avoid spam, in some cases (sadly not all of them) var/mob/living/living_user = user if(istype(living_user)) - living_user.add_mood_event("hug", /datum/mood_event/warmhug/rubi, src) + living_user.add_mood_event("hug", /datum/mood_event/warmhug/rubi, 1, src) user.visible_message(span_notice("[user] hugs \the [src]."), span_notice("You hug \the [src].")) /datum/mood_event/warmhug/rubi diff --git a/modular_skyrat/modules/customization/modules/clothing/accessories.dm b/modular_skyrat/modules/customization/modules/clothing/accessories.dm index 53223af7956..ae078ea7ebb 100644 --- a/modular_skyrat/modules/customization/modules/clothing/accessories.dm +++ b/modular_skyrat/modules/customization/modules/clothing/accessories.dm @@ -6,3 +6,27 @@ /obj/item/clothing/accessory/skilt/armourless armor_type = /datum/armor/none + +/obj/item/clothing/accessory/armband/cargo/nonsec + name = "brown armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is brown." + +/obj/item/clothing/accessory/armband/engine/nonsec + name = "orange armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is orange with a reflective strip!" + +/obj/item/clothing/accessory/armband/science/nonsec + name = "purple armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is purple." + +/obj/item/clothing/accessory/armband/hydro/nonsec + name = "green-blue armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is green and blue." + +/obj/item/clothing/accessory/armband/med/nonsec + name = "white armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is white." + +/obj/item/clothing/accessory/armband/medblue/nonsec + name = "white-blue armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is white and blue." diff --git a/modular_skyrat/modules/customization/modules/clothing/head/head.dm b/modular_skyrat/modules/customization/modules/clothing/head/head.dm index d05828cd095..f8ad4b1573e 100644 --- a/modular_skyrat/modules/customization/modules/clothing/head/head.dm +++ b/modular_skyrat/modules/customization/modules/clothing/head/head.dm @@ -24,13 +24,22 @@ //Cyberpunk PI Costume - Sprites from Eris /obj/item/clothing/head/fedora/det_hat/cybergoggles //Subset of detective fedora so that detectives dont have to sacrifice candycorns for style - name = "type-34C semi-enclosed headwear" - desc = "Civilian model of a popular helmet used by certain law enforcement agencies. It does not have any armor plating, but has a neo-laminated fiber lining." + name = "type-34P semi-enclosed headwear" + desc = "A popular helmet used by certain law enforcement agencies. It has minor armor plating and a neo-laminated fiber lining." icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' icon_state = "cyberpunkgoggle" supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON +/obj/item/clothing/head/fedora/det_hat/cybergoggles/civilian //Actually civilian with no armor for drip purposes only + name = "type-34C semi-enclosed headwear" + desc = "The civilian model of a popular helmet used by certain law enforcement agencies. It has no armor plating." + icon = 'modular_skyrat/master_files/icons/obj/clothing/hats.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head.dmi' + icon_state = "cyberpunkgoggle" + armor_type = /datum/armor/none + supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON + /obj/item/clothing/head/hats/intern/developer name = "intern beancap" diff --git a/modular_skyrat/modules/customization/modules/clothing/masks/masquerade_mask.dm b/modular_skyrat/modules/customization/modules/clothing/masks/masquerade_mask.dm new file mode 100644 index 00000000000..45a63b861a9 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/clothing/masks/masquerade_mask.dm @@ -0,0 +1,33 @@ + +/obj/item/clothing/mask/masquerade + name = "masquerade mask" + desc = "You'll never guess who's under that mask, it's the perfect disguise!" + icon_state = "maskerade" + icon = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask.dmi' + worn_icon = 'modular_skyrat/modules/GAGS/icons/mask/masquerade_mask_worn.dmi' + flags_1 = IS_PLAYER_COLORABLE_1 + clothing_flags = MASKINTERNALS + alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER + supports_variations_flags = CLOTHING_SNOUTED_VARIATION | CLOTHING_SNOUTED_VOX_VARIATION | CLOTHING_SNOUTED_BETTER_VOX_VARIATION + greyscale_colors = "#ececec#333333#9b1e1e" + greyscale_config = /datum/greyscale_config/masquerade_mask + greyscale_config_worn = /datum/greyscale_config/masquerade_mask/worn + greyscale_config_worn_muzzled = /datum/greyscale_config/masquerade_mask/worn/snouted + greyscale_config_worn_better_vox = /datum/greyscale_config/masquerade_mask/worn/better_vox + greyscale_config_worn_vox = /datum/greyscale_config/masquerade_mask/worn/vox + greyscale_config_worn_teshari = /datum/greyscale_config/masquerade_mask/worn/teshari + +/obj/item/clothing/mask/masquerade/feathered + name = "feathered masquerade mask" + desc = "You'll never guess who's under that mask, it's the perfect disguise! This one even has a feather, to make it fancier!" + icon_state = "maskerade_feather" + +/obj/item/clothing/mask/masquerade/two_colors + name = "split masquerade mask" + desc = "You'll never guess who's under that mask, it's the perfect disguise! There's even two colors, to add to the confusion!" + icon_state = "maskerade_two_colors" + +/obj/item/clothing/mask/masquerade/two_colors/feathered + name = "feathered split masquerade mask" + desc = "You'll never guess who's under that mask, it's the perfect disguise! There's even two colors AND a feather, making it the most fancy masquerade mask yet!" + icon_state = "maskerade_two_colors_feather" diff --git a/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm b/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm index 379599c5cf4..d437e18a94e 100644 --- a/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm +++ b/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm @@ -147,15 +147,24 @@ blood_overlay_type = "coat" /obj/item/clothing/suit/croptop - name = "black crop top turtleneck" - desc = "A comfy looking turtleneck that exposes your midriff, fashionable but makes the point of a sweater moot." - icon_state = "croptop_black" + name = "crop top turtleneck" + desc = "A comfy looking turtleneck that exposes your midriff, fashionable but makes the point of a sweater moot. Now with Pycroft polychromatic tech!" + icon_state = "croptop" + greyscale_config = /datum/greyscale_config/croptop + greyscale_config_worn = /datum/greyscale_config/croptop/worn + greyscale_colors = "#1d1b1b" body_parts_covered = CHEST|ARMS cold_protection = CHEST|ARMS + flags_1 = IS_PLAYER_COLORABLE_1 icon = 'modular_skyrat/master_files/icons/obj/clothing/suits.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi' supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON +/obj/item/clothing/suit/croptop/Initialize(mapload) + . = ..() + AddElement(/datum/element/gags_recolorable) + update_icon(UPDATE_OVERLAYS) + /obj/item/clothing/suit/varsity name = "varsity jacket" desc = "A simple varsity jacket with no obvious sources." diff --git a/modular_skyrat/modules/customization/modules/food_and_drinks/food/SRseafood.dm b/modular_skyrat/modules/customization/modules/food_and_drinks/food/SRseafood.dm index 973aa09a694..6fac651fde7 100644 --- a/modular_skyrat/modules/customization/modules/food_and_drinks/food/SRseafood.dm +++ b/modular_skyrat/modules/customization/modules/food_and_drinks/food/SRseafood.dm @@ -5,8 +5,8 @@ icon_state = "tunacan" trash_type = /obj/item/trash/can/food/tuna food_reagents = list( - /datum/reagent/consumable/nutriment = 4, - /datum/reagent/consumable/nutriment/protein = 9, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/nutriment/vitamin = 6 ) tastes = list("tuna" = 1) @@ -16,3 +16,10 @@ name = "can of tuna" icon = 'modular_skyrat/master_files/icons/obj/food/irnbru.dmi' icon_state = "tunacan_empty" + +/obj/item/food/fishmeat/moonfish/akula + name = "aquatic fillet" + desc = "A fillet of a rather large fish..." + tastes = list("tender fish" = 1) + foodtypes = SEAFOOD | GORE + venue_value = FOOD_MEAT_HUMAN diff --git a/modular_skyrat/modules/customization/modules/jobs/_job.dm b/modular_skyrat/modules/customization/modules/jobs/_job.dm index 83e1ee3eedc..c5e3c5e5b21 100644 --- a/modular_skyrat/modules/customization/modules/jobs/_job.dm +++ b/modular_skyrat/modules/customization/modules/jobs/_job.dm @@ -231,9 +231,14 @@ /datum/job/proc/has_required_languages(datum/preferences/pref) if(!required_languages) return TRUE - for(var/lang in required_languages) + // if we have a bilingual quirk, check that as well + var/bilingual_pref + if(/datum/quirk/bilingual::name in pref.all_quirks) + bilingual_pref = pref.read_preference(/datum/preference/choiced/language) + + for(var/datum/language/lang as anything in required_languages) //Doesnt have language, or the required "level" is too low (understood, while needing spoken) - if(!pref.languages[lang] || pref.languages[lang] < required_languages[lang]) + if((!pref.languages[lang] || pref.languages[lang] < required_languages[lang]) && bilingual_pref != lang.name) // SKYRAT EDIT - check the bilingual quirk return FALSE return TRUE diff --git a/modular_skyrat/modules/customization/modules/language/_language_holder.dm b/modular_skyrat/modules/customization/modules/language/_language_holder.dm index 0904187a9ae..149901e5852 100644 --- a/modular_skyrat/modules/customization/modules/language/_language_holder.dm +++ b/modular_skyrat/modules/customization/modules/language/_language_holder.dm @@ -90,4 +90,3 @@ /datum/language/common = list(LANGUAGE_ATOM), /datum/language/canilunzt = list(LANGUAGE_ATOM) ) - diff --git a/modular_skyrat/modules/customization/modules/language/chitinclick.dm b/modular_skyrat/modules/customization/modules/language/chitinclick.dm index 3f16fe93195..c8eba66ba8c 100644 --- a/modular_skyrat/modules/customization/modules/language/chitinclick.dm +++ b/modular_skyrat/modules/customization/modules/language/chitinclick.dm @@ -1,14 +1,21 @@ -/datum/language/moffic - name = "Chitin-Click" - desc = "A popular non-Human language that finds extensive use by various types of anthropomorphic invertebrates the likes of Mothpeople and other types of insects. It consists of complex flutters, chittering, antenna movements, and sparse guttural syllables. In modern Sol standard writing, some of its sounds have been compared to Ancient Swedish (Dating back to the Human 19th century)." +/datum/language/chitinclick + name = "Chitinclick" + desc = "A popular non-Human language that finds extensive use by various types of anthropomorphic invertebrates. It consists of complex flutters, chittering, antenna movements, and sparse guttural syllables." key = "C" - space_chance = 30 + space_chance = 40 //References some replaced languages. syllables = list( // Original - "chi", "cha", "at", "mo", "kli", "ac", "f", "cli", "fz", "fs", + "a", "ak", "ae", "ai", "az", "ba", "bz", "bu", "bh", "br", "bi", + "c", "ca", "ci", "ch", "chk", "cr", "cl", "ce", "cu", "cli", "cla", + "du", "dr", "dri", "de", "do", "dza", "dk", "g", "ga", "gr", "dz", + "gi", "gchk", "i", "ii", "ik", "it", "il", "ie", "iz", "ir", "io", + "pi", "pz", "pe", "po", "phk", "k", "kz", "kl", "ka", "kli", "kh", + "kch", "vh", "vr", "vz", "veh", "mr", "mz", "mi", "ma", "mhk", "zz", + "ze", "zu", "zo", "za", "nz", "zi", "fz", "fr", "f", "fi", "click", + "chit", "rr", "ru", "ra", "rzz", "ri", "re", // Buzzwords "zz", "buzz", "ZZ", - // Moffic - "ø", "öh", "ää", "år", "käyt", "dår", "ån", "næ", "møt", "om", "när", ) + icon_state = "chitinclick" + icon = 'modular_skyrat/master_files/icons/misc/language.dmi' diff --git a/modular_skyrat/modules/customization/modules/language/mothic.dm b/modular_skyrat/modules/customization/modules/language/mothic.dm new file mode 100644 index 00000000000..de863abae3b --- /dev/null +++ b/modular_skyrat/modules/customization/modules/language/mothic.dm @@ -0,0 +1,20 @@ +/datum/language/moffic + name = "Mothic" + desc = "Spoken colloquially by the Mothfolk of Va Lumla, the early iteration of Mothic emerged when Fueljacks relied on their receptors for simple, one-worded pheromones to communicate, and navigate the often fatal maintenance tunnels sprawled throughout the fleet. \ + The moths developed gesticulation through antennas and wings to convey deeper intent, with mandibles providing emotional context through clicks and trills. \ + After First Contact, human speakers managed to achieve a similar effect from clicking their tongue to roof, and steer the tone with the width of their mouth while using their hands in place of antennas. \ + It is informally spoken, deploying many slangs and shorthands from Common. Has phonetic resemblance to Italian." + space_chance = 40 + // Syllables derived from Italian. + syllables = list( + "a", "an", "ar", "ave", "avo", "are", "ale", "be", "buo", "ca", "cie", "cr", + "ch", "che", "co", "cco", "ce", "cu", "ci", "ccia", "ccio", "da", "di", "do", + "e", "é", "ere", "ette", "fa", "fu", "fo", "gi", "gio", "gn", "go", "gu", "ni", + "gri", "ia", "iei", "ile", "imo", "l", "la", "lla", "le", "li", "lia", "lio", + "lo", "lu", "me", "mi", "mo", "mos", "na", "ne", "no", "nuo", "o", "ò", "oi", + "or", "os", "otto", "qua", "que", "qui", "pi", "po", "rò", "sa", "se", "si", + "sto", "ua", "ue", "ui", "un", "ta", "tra", "te", "tri", "tre", "tro", "to", + "ti", "va", "vi", "ve", "vo", "veni", "ver", "tu", "dru", "bi", "en", "je", + "dici", "tru", "zo", "ze", "ul", "bo", "ba", "gh", "ino", "etta", "i", "in", + "chh", "rio", "ie", "bar", "bas", "die", "ter", "pa", "pe", "pu", "fe", "fi", + ) diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm index 54666ee7a0a..695e7310f3f 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm @@ -211,6 +211,10 @@ name = "Long Gloomy Bangs" icon_state = "hair_gloomy_long" +/datum/sprite_accessory/hair/skyrat/gloomy_longer + name = "Very Long Gloomy Bangs" + icon_state = "hair_gloomy_longer" + /datum/sprite_accessory/hair/skyrat/halfshave name = "Half-shaved 2" icon_state = "hair_halfshave" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm index 7a9181b75a9..6b2f9381728 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm @@ -40,6 +40,9 @@ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/akula, BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/akula, ) + + meat = /obj/item/food/fishmeat/moonfish/akula + /// This variable stores the timer datum which appears if the mob becomes wet var/dry_up_timer = TIMER_ID_NULL diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm index 29df861b8bf..bdd20d6b2d4 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm @@ -23,6 +23,8 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/aquatic, ) + meat = /obj/item/food/fishmeat/moonfish/akula + /datum/species/aquatic/get_default_mutant_bodyparts() return list( "tail" = list("Shark", TRUE), diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/corrupted_tongue.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/corrupted_tongue.dm index 4a1a5e1aa41..53d99426d0e 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/corrupted_tongue.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/corrupted_tongue.dm @@ -1,8 +1,7 @@ /// Maximum an Hemophage will drain, they will drain less if they hit their cap. #define HEMOPHAGE_DRAIN_AMOUNT 50 /// The multiplier for blood received by Hemophages out of humans with ckeys. -#define BLOOD_DRAIN_MULTIPLIER_CKEY 1.5 - +#define BLOOD_DRAIN_MULTIPLIER_CKEY 1.15 /datum/component/organ_corruption/tongue corruptable_organ_type = /obj/item/organ/internal/tongue @@ -102,11 +101,20 @@ // We start by checking that the victim is a human and they have a client, so we can give them the // beneficial status effect for drinking higher-quality blood. var/is_target_human_with_client = istype(victim, /mob/living/carbon/human) && victim.client + var/horrible_feeding = FALSE if(ismonkey(victim)) is_target_human_with_client = FALSE // Sorry, not going to get the status effect from monkeys, even if they have a client in them. - + hemophage.add_mood_event("gross_food", /datum/mood_event/disgust/hemophage_feed_monkey) // drinking from a monkey is inherently gross, like, REALLY gross + hemophage.adjust_disgust(DISGUST_LEVEL_GROSS + 15, DISGUST_LEVEL_MAXEDOUT) blood_volume_difference = BLOOD_VOLUME_NORMAL - hemophage.blood_volume + horrible_feeding = TRUE + + if(istype(victim, /mob/living/carbon/human/species/monkey)) + is_target_human_with_client = FALSE // yep you're still not getting the status effect from humonkeys either. your tumour knows. + hemophage.add_mood_event("gross_food", /datum/mood_event/disgust/hemophage_feed_humonkey) + hemophage.adjust_disgust(DISGUST_LEVEL_GROSS / 4, DISGUST_LEVEL_GROSS) // it's still gross but nowhere near as bad, though. + horrible_feeding = TRUE StartCooldown() @@ -129,18 +137,36 @@ log_combat(hemophage, victim, "drained [drained_blood]u of blood from", addition = " (NEW BLOOD VOLUME: [victim.blood_volume] cL)") victim.show_message(span_danger("[hemophage] drains some of your blood!")) - to_chat(hemophage, span_notice("You drink some blood from [victim]![is_target_human_with_client ? " That tasted particularly good!" : ""]")) + + if(horrible_feeding) + if(istype(victim, /mob/living/carbon/human/species/monkey)) + to_chat(hemophage, span_notice("You take tentative draws of blood from [victim], each mouthful awash with the taste of ozone and a strange artificial twinge.")) + else + to_chat(hemophage, span_warning("You choke back tepid mouthfuls of foul blood from [victim]. The taste is absolutely vile.")) + else + to_chat(hemophage, span_notice("You pull greedy gulps of precious lifeblood from [victim]'s veins![is_target_human_with_client ? " That tasted particularly good!" : ""]")) playsound(hemophage, 'sound/items/drink.ogg', 30, TRUE, -2) + // just let the hemophage know they're capped out on blood if they're trying to go for an exsanguinate and wondering why it isn't working + if(drained_blood != HEMOPHAGE_DRAIN_AMOUNT && hemophage.blood_volume >= (BLOOD_VOLUME_MAXIMUM - HEMOPHAGE_DRAIN_AMOUNT)) + to_chat(hemophage, span_boldnotice("Your thirst is temporarily slaked, and you can digest no more new blood for the moment.")) + if(victim.blood_volume <= BLOOD_VOLUME_OKAY) to_chat(hemophage, span_warning("That definitely left them looking pale...")) + to_chat(victim, span_warning("A groaning lethargy creeps into your muscles as you begin to feel slightly clammy...")) //let the victim know too if(is_target_human_with_client) hemophage.apply_status_effect(/datum/status_effect/blood_thirst_satiated) + hemophage.add_mood_event("drank_human_blood", /datum/mood_event/hemophage_feed_human) // absolutely scrumptious + hemophage.clear_mood_event("gross_food") // it's a real palate cleanser, you know + hemophage.disgust *= 0.85 //also clears a little bit of disgust too - if(!victim.blood_volume || victim.blood_volume < BLOOD_VOLUME_SURVIVE) - to_chat(hemophage, span_warning("You finish off [victim]'s blood supply.")) + // for this to ever occur, the hemophage actually has to be decently hungry, otherwise they'll cap their own blood reserves and be unable to pull it off. + if(!victim.blood_volume || victim.blood_volume <= BLOOD_VOLUME_SURVIVE) + to_chat(hemophage, span_boldwarning("A final sputter of blood trickles from [victim]'s collapsing veins as your terrible hunger drains them almost completely dry.")) + else if ((victim.blood_volume + HEMOPHAGE_DRAIN_AMOUNT) <= BLOOD_VOLUME_SURVIVE) + to_chat(hemophage, span_warning("A sense of hesitation gnaws: you know for certain that taking much more blood from [victim] WILL kill them. ...but another part of you sees only opportunity.")) #undef HEMOPHAGE_DRAIN_AMOUNT diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_moods.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_moods.dm new file mode 100644 index 00000000000..51e637b348f --- /dev/null +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_moods.dm @@ -0,0 +1,19 @@ +/datum/mood_event/hemophage_feed_human + description = "I slaked my hunger on fresh, vital blood. That felt good!" + mood_change = 2 + timeout = 5 MINUTES + +/datum/mood_event/disgust/hemophage_feed_monkey + description = "I had to feed off a gibbering monkey... what have I become?" + mood_change = -4 + timeout = 5 MINUTES + +/datum/mood_event/disgust/hemophage_feed_humonkey + description = "Somehow I know deep down that humonkey blood is no substitute for the real thing..." + mood_change = -1 + timeout = 5 MINUTES + +/datum/mood_event/disgust/hemophage_feed_synthesized_blood + description = "My last blood meal was artificial and tasted... wrong." + mood_change = -2 + timeout = 5 MINUTES diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_organs.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_organs.dm index 7a0e972f3d8..7a9cc37b6a0 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_organs.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage/hemophage_organs.dm @@ -85,6 +85,10 @@ var/datum/reagent/blood/blood = reagents.has_reagent(/datum/reagent/blood) if(blood) blood.metabolization_rate = BLOOD_METABOLIZATION_RATE + var/blood_DNA = blood.data["blood_DNA"] + if (!blood_DNA) //does the blood we're digesting have any DNA? if it doesn't, it's artificial, and that's gross. + src.owner.adjust_disgust(DISGUST_LEVEL_GROSS / 16, DISGUST_LEVEL_VERYGROSS) + src.owner.add_mood_event("gross_food", /datum/mood_event/disgust/hemophage_feed_synthesized_blood) return ..() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm index 60c0eee37cd..1443559caf2 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm @@ -45,6 +45,8 @@ LOADOUT_ITEM_EARS = VOX_EARS_ICON ) + meat = /obj/item/food/meat/slab/chicken/human //item file in teshari module + /datum/species/vox/get_default_mutant_bodyparts() return list( "tail" = list("Vox Tail", FALSE), diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm index 48b2b3d327b..7e2a4af5c01 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm @@ -23,6 +23,8 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant, ) + meat = /obj/item/food/meat/slab/corgi + /datum/species/vulpkanin/get_default_mutant_bodyparts() return list( "tail" = list("Fox", TRUE), diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm index 4b2052bd083..8d783f08ccb 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm @@ -2,7 +2,7 @@ // A cloning mistake, crossing human and xenomorph DNA name = "Xenomorph Hybrid" id = SPECIES_XENO - family_heirlooms = list(/obj/item/toy/plush/rouny, /obj/item/toy/toy_xeno) + family_heirlooms = list(/obj/item/toy/plush/rouny, /obj/item/clothing/mask/facehugger/toy) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -10,7 +10,17 @@ TRAIT_MUTANT_COLORS, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID + mutantbrain = /obj/item/organ/internal/brain/xeno_hybrid mutanttongue = /obj/item/organ/internal/tongue/xeno_hybrid + mutantliver = /obj/item/organ/internal/liver/xeno_hybrid + mutantstomach = /obj/item/organ/internal/stomach/xeno_hybrid + mutant_organs = list( + /obj/item/organ/internal/alien/plasmavessel/roundstart, + /obj/item/organ/internal/alien/resinspinner/roundstart, + /obj/item/organ/internal/alien/hivenode, + ) + exotic_blood = /datum/reagent/toxin/acid + heatmod = 2.5 mutant_bodyparts = list() external_organs = list() payday_modifier = 1.0 @@ -42,6 +52,25 @@ /datum/species/xeno/get_species_lore() return list(placeholder_lore) +/datum/species/xeno/create_pref_unique_perks() + var/list/to_add = list() + + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "biohazard", + SPECIES_PERK_NAME = "Xenomorphic Biology", + SPECIES_PERK_DESC = "Xeno-hybrids inherit organs from their primal ascendants." + )) + + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "fire", + SPECIES_PERK_NAME = "High Temperature Weakness", + SPECIES_PERK_DESC = "A partial silicone structure and acid blood make the xeno-hybrid species extremely weak to heat." + )) + + return to_add + /datum/species/xeno/prepare_human_for_preview(mob/living/carbon/human/xeno) var/xeno_color = "#525288" xeno.dna.features["mcolor"] = xeno_color @@ -52,3 +81,60 @@ xeno.dna.mutant_bodyparts["xenohead"] = list(MUTANT_INDEX_NAME = "Standard", MUTANT_INDEX_COLOR_LIST = list(xeno_color, xeno_color, xeno_color)) regenerate_organs(xeno, src, visual_only = TRUE) xeno.update_body(TRUE) + +///Xenomorph organs modified to suit roundstart styling +#define BUILD_DURATION 0.5 SECONDS + +//Plasma vessel +/obj/item/organ/internal/alien/plasmavessel/roundstart + stored_plasma = 55 + max_plasma = 55 + plasma_rate = 2 + heal_rate = 0 + actions_types = list( + /datum/action/cooldown/alien/make_structure/plant_weeds/roundstart, + /datum/action/cooldown/alien/transfer, + ) + +/datum/action/cooldown/alien/make_structure/plant_weeds + var/build_duration = 0 SECONDS //regular aliens can build instantly + +/datum/action/cooldown/alien/make_structure/plant_weeds/roundstart + build_duration = BUILD_DURATION //hybrids are a bit slower + +/datum/action/cooldown/alien/make_structure/plant_weeds/Activate(atom/target) + if(build_duration && !do_after(owner, build_duration)) + owner.balloon_alert(owner, "interrupted!") + return + return ..() + +//Resin spinner +/obj/item/organ/internal/alien/resinspinner/roundstart + actions_types = list(/datum/action/cooldown/alien/make_structure/resin/roundstart) + +/datum/action/cooldown/alien/make_structure/resin + var/build_duration = 0 SECONDS + +/datum/action/cooldown/alien/make_structure/resin/roundstart + build_duration = BUILD_DURATION + //Non-modularly checked in `code\modules\mob\living\carbon\alien\adult\alien_powers.dm` + +//Organ resprites +/obj/item/organ/internal/brain/xeno_hybrid + icon_state = "brain-x" //rebranding + +/obj/item/organ/internal/stomach/xeno_hybrid + icon_state = "stomach-x" + +/obj/item/organ/internal/liver/xeno_hybrid + icon_state = "liver-x" + +//Liver modification (xenohybrids can process plasma!) +/obj/item/organ/internal/liver/xeno_hybrid/handle_chemical(mob/living/carbon/owner, datum/reagent/toxin/chem, seconds_per_tick, times_fired) + . = ..() + if(. & COMSIG_MOB_STOP_REAGENT_CHECK) + return + if(chem.type == /datum/reagent/toxin/plasma) + chem.toxpwr = 0 + +#undef BUILD_DURATION diff --git a/modular_skyrat/modules/customization/modules/mob/living/living.dm b/modular_skyrat/modules/customization/modules/mob/living/living.dm index eeb48b1ffae..e7eedf00efb 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/living.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/living.dm @@ -1,8 +1,11 @@ /mob/living/Topic(href, href_list) . = ..() if(href_list["temporary_flavor"]) - if(temporary_flavor_text) - var/datum/browser/popup = new(usr, "[name]'s temporary flavor text", "[name]'s Temporary Flavor Text", 500, 200) - popup.set_content(text("[][]", "[name]'s temporary flavor text", replacetext(temporary_flavor_text, "\n", "
"))) - popup.open() - return + show_temp_ftext(usr) + +/mob/living/proc/show_temp_ftext(mob/user) + if(temporary_flavor_text) + var/datum/browser/popup = new(user, "[name]'s temporary flavor text", "[name]'s Temporary Flavor Text", 500, 200) + popup.set_content(text("[][]", "[name]'s temporary flavor text", replacetext(temporary_flavor_text, "\n", "
"))) + popup.open() + return diff --git a/modular_skyrat/modules/customization/modules/mob/living/silicon/topic.dm b/modular_skyrat/modules/customization/modules/mob/living/silicon/topic.dm index 3a5310e8c3b..4c49f9fd516 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/silicon/topic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/silicon/topic.dm @@ -3,3 +3,5 @@ if(href_list["lookup_info"] == "open_examine_panel") examine_panel.holder = src examine_panel.ui_interact(usr) //datum has a tgui component, here we open the window + if(href_list["temporary_flavor"]) // we need this here because tg code doesnt call parent in /mob/living/silicon/Topic() + show_temp_ftext(usr) diff --git a/modular_skyrat/modules/decay_subsystem/code/decaySS.dm b/modular_skyrat/modules/decay_subsystem/code/decaySS.dm index a91f8619499..38b13e8bc55 100644 --- a/modular_skyrat/modules/decay_subsystem/code/decaySS.dm +++ b/modular_skyrat/modules/decay_subsystem/code/decaySS.dm @@ -58,10 +58,11 @@ SUBSYSTEM_DEF(decay) possible_areas += iterating_area // Now add the turfs - for(var/turf/iterating_turf as anything in iterating_area.get_contained_turfs()) - if(!(iterating_turf.flags_1 & CAN_BE_DIRTY_1)) - continue - possible_turfs += iterating_turf + for(var/list/zlevel_turfs as anything in iterating_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + if(!(area_turf.flags_1 & CAN_BE_DIRTY_1)) + continue + possible_turfs += area_turf if(!possible_turfs) CRASH("SSDecay had no possible turfs to use!") diff --git a/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm b/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm index 475315bede3..c3d7076845c 100644 --- a/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm +++ b/modular_skyrat/modules/deforest_medical_items/code/chemicals/demoneye.dm @@ -121,7 +121,7 @@ constant_dose_time += seconds_per_tick - our_guy.add_mood_event("tweaking", /datum/mood_event/stimulant_heavy/sundowner, name) + our_guy.add_mood_event("tweaking", /datum/mood_event/stimulant_heavy/sundowner, 1, name) our_guy.adjustStaminaLoss(-10 * REM * seconds_per_tick) our_guy.AdjustSleeping(-20 * REM * seconds_per_tick) diff --git a/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm b/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm index ab65e0689b8..e60b6b47d35 100644 --- a/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm +++ b/modular_skyrat/modules/deforest_medical_items/code/healing_stack_items.dm @@ -30,7 +30,7 @@ var/treatment_sound = 'sound/items/duct_tape_rip.ogg' // This is only relevant for the types of wounds defined, we can't work if there are none -/obj/item/stack/medical/wound_recovery/try_heal(mob/living/patient, mob/user, silent) +/obj/item/stack/medical/wound_recovery/try_heal(mob/living/patient, mob/user, silent = FALSE, looping = FALSE) if(patient.has_status_effect(/datum/status_effect/vulnerable_to_damage)) patient.balloon_alert(user, "still recovering from last use!") diff --git a/modular_skyrat/modules/emotes/code/emotes.dm b/modular_skyrat/modules/emotes/code/emotes.dm index 07a6be56e92..9be5b2f1769 100644 --- a/modular_skyrat/modules/emotes/code/emotes.dm +++ b/modular_skyrat/modules/emotes/code/emotes.dm @@ -193,7 +193,12 @@ emote_type = EMOTE_AUDIBLE mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) vary = TRUE - sound = 'modular_skyrat/modules/emotes/sound/emotes/mothchitter.ogg' + +/datum/emote/living/chitter/get_sound(mob/living/user) + if(ismoth(user)) + return 'modular_skyrat/modules/emotes/sound/emotes/mothchitter.ogg' + else + return'sound/creatures/chitter.ogg' /datum/emote/living/sigh/get_sound(mob/living/user) if(iscarbon(user)) diff --git a/modular_skyrat/modules/emotes/code/scream_datums.dm b/modular_skyrat/modules/emotes/code/scream_datums.dm index 8e75aa7f556..8c1d32bdbe9 100644 --- a/modular_skyrat/modules/emotes/code/scream_datums.dm +++ b/modular_skyrat/modules/emotes/code/scream_datums.dm @@ -58,6 +58,11 @@ GLOBAL_LIST_EMPTY(scream_types) male_screamsounds = list('modular_skyrat/modules/emotes/sound/voice/scream_lizard.ogg') female_screamsounds = null +/datum/scream_type/cat + name = "Cat Scream" + male_screamsounds = list('modular_skyrat/modules/emotes/sound/voice/scream_cat.ogg') + female_screamsounds = null + /datum/scream_type/moth name = "Moth Scream" male_screamsounds = list('modular_skyrat/modules/emotes/sound/voice/scream_moth.ogg') diff --git a/modular_skyrat/modules/emotes/sound/voice/scream_cat.ogg b/modular_skyrat/modules/emotes/sound/voice/scream_cat.ogg index a9f3be40ddd..ba00eec223c 100644 Binary files a/modular_skyrat/modules/emotes/sound/voice/scream_cat.ogg and b/modular_skyrat/modules/emotes/sound/voice/scream_cat.ogg differ diff --git a/modular_skyrat/modules/exp_corps/code/gear.dm b/modular_skyrat/modules/exp_corps/code/gear.dm index 5d3668f3f6d..47d40d2b0a9 100644 --- a/modular_skyrat/modules/exp_corps/code/gear.dm +++ b/modular_skyrat/modules/exp_corps/code/gear.dm @@ -50,9 +50,6 @@ max_integrity = 200 var/repairable_by = /obj/item/stack/sheet/plasteel //what to repair the shield with -/obj/item/shield/riot/pointman/shatter(mob/living/carbon/human/owner) - playsound(owner, 'sound/effects/glassbr3.ogg', 100) - new /obj/item/pointman_broken((get_turf(src))) /obj/item/shield/riot/pointman/attackby(obj/item/W, mob/user, params) if(istype(W, repairable_by)) diff --git a/modular_skyrat/modules/food_replicator/code/clothing.dm b/modular_skyrat/modules/food_replicator/code/clothing.dm index 8d1b6238ed6..5e92b3fd3dc 100644 --- a/modular_skyrat/modules/food_replicator/code/clothing.dm +++ b/modular_skyrat/modules/food_replicator/code/clothing.dm @@ -37,6 +37,7 @@ worn_icon = 'modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi' worn_icon_digi = 'modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi' icon_state = "cloak_colonial" + allowed = /obj/item/clothing/suit/jacket/leather::allowed // these are special and can be worn in the suit slot, so we need this var to be defined /obj/item/clothing/neck/cloak/colonial/mob_can_equip(mob/living/equipper, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action) if(is_species(equipper, /datum/species/teshari)) diff --git a/modular_skyrat/modules/food_replicator/code/rationpacks.dm b/modular_skyrat/modules/food_replicator/code/rationpacks.dm index c22d588d49a..98b9a0240a2 100644 --- a/modular_skyrat/modules/food_replicator/code/rationpacks.dm +++ b/modular_skyrat/modules/food_replicator/code/rationpacks.dm @@ -89,14 +89,18 @@ name = "empty nachos tray" desc = "Covered in sauce smearings and smaller pieces of the dish on the inside, a plastic food tray with not much use anymore. It's probably best to dispose of it or recycle it." icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) icon_state = "nacho_trash" /obj/item/trash/blins name = "empty crepes wrapper" desc = "Empty torn wrapper that used to hold something ridiculously sweet. It's probably best to recycle it." icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT * 0.5) + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT * 0.5, + ) icon_state = "blin_trash" /obj/item/storage/box/gum/colonial diff --git a/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm b/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm index 2f977bb9259..1f95477ecb3 100644 --- a/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm +++ b/modular_skyrat/modules/ghostcafe/code/ghost_role_spawners.dm @@ -69,7 +69,7 @@ name = "ID, jumpsuit and shoes" uniform = /obj/item/clothing/under/color/random shoes = /obj/item/clothing/shoes/sneakers/black - id = /obj/item/card/id/advanced/ghost_cafe + id = /obj/item/card/id/advanced/chameleon/ghost_cafe back = /obj/item/storage/backpack/chameleon backpack_contents = list(/obj/item/storage/box/syndie_kit/chameleon/ghostcafe = 1) @@ -112,9 +112,10 @@ new /obj/item/clothing/neck/chameleon(src) new /obj/item/storage/belt/chameleon(src) new /obj/item/card/id/advanced/chameleon(src) + new /obj/item/stamp/chameleon(src) new /obj/item/hhmirror/syndie(src) -/obj/item/card/id/advanced/ghost_cafe +/obj/item/card/id/advanced/chameleon/ghost_cafe name = "\improper Cafe ID" desc = "An ID straight from God." icon_state = "card_centcom" diff --git a/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm b/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm index b879a8ec37b..a33f7c16859 100644 --- a/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm +++ b/modular_skyrat/modules/ghostcafe/code/ghostcafeturf.dm @@ -13,3 +13,22 @@ name = "nitrogen-filled plating" desc = "Vox box certified." initial_gas_mix = "n2=104;TEMP=293.15" + +/turf/open/indestructible/bathroom + icon = 'modular_skyrat/modules/ghostcafe/icons/floors.dmi'; + icon_state = "titanium_blue_old"; + name = "bathroom floor" + footstep = FOOTSTEP_FLOOR + tiled_dirt = FALSE + +/turf/open/indestructible/carpet + desc = "It's really cozy! Great for soft paws!"; + icon = 'modular_skyrat/modules/ghostcafe/icons/carpet_royalblack.dmi'; + icon_state = "carpet"; + name = "soft carpet" + bullet_bounce_sound = null + footstep = FOOTSTEP_CARPET + barefootstep = FOOTSTEP_CARPET_BAREFOOT + clawfootstep = FOOTSTEP_CARPET_BAREFOOT + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + tiled_dirt = FALSE diff --git a/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm b/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm index 080aa0c7cc4..d3ca93cf1d2 100644 --- a/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm +++ b/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm @@ -38,6 +38,10 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/accessories.dmi' icon_state = "armband_lopland" +/obj/item/clothing/accessory/armband/deputy/lopland/nonsec + name = "blue armband" + desc = "An armband, worn to signify proficiency in a skill or association with a department. This one is blue." + /obj/item/clothing/accessory/armband/deputy/lopland desc = "A Peacekeeper-blue armband, showing the wearer to be certified by Lopland as a top-of-their-class Security Officer." diff --git a/modular_skyrat/modules/hairbrush/code/hairbrush.dm b/modular_skyrat/modules/hairbrush/code/hairbrush.dm index 5dae1a37d6e..8f18945e318 100644 --- a/modular_skyrat/modules/hairbrush/code/hairbrush.dm +++ b/modular_skyrat/modules/hairbrush/code/hairbrush.dm @@ -47,7 +47,7 @@ else user.visible_message(span_notice("[usr] brushes [human_target]'s hair!"), span_notice("You brush [human_target]'s hair."), ignored_mobs=list(human_target)) human_target.show_message(span_notice("[usr] brushes your hair!"), MSG_VISUAL) - human_target.add_mood_event("brushed", /datum/mood_event/brushed, user) + human_target.add_mood_event("brushed", /datum/mood_event/brushed, 1, user) else if(istype(target, /mob/living/simple_animal/pet)) if(!do_after(usr, brush_speed, target)) @@ -55,4 +55,4 @@ to_chat(user, span_notice("[target] closes [target.p_their()] eyes as you brush [target.p_them()]!")) var/mob/living/living_user = user if(istype(living_user)) - living_user.add_mood_event("brushed", /datum/mood_event/brushed/pet, target) + living_user.add_mood_event("brushed", /datum/mood_event/brushed/pet, 1, target) diff --git a/modular_skyrat/modules/holdingfashion_port/code/bluespace_design.dm b/modular_skyrat/modules/holdingfashion_port/code/bluespace_design.dm index dfef15d2312..79856dcc67e 100644 --- a/modular_skyrat/modules/holdingfashion_port/code/bluespace_design.dm +++ b/modular_skyrat/modules/holdingfashion_port/code/bluespace_design.dm @@ -3,9 +3,16 @@ desc = "A block of metal ready to be transformed into a satchel of holding with a bluespace anomaly core." id = "satchel_holding" build_type = PROTOLATHE - materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 2, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/diamond = SHEET_MATERIAL_AMOUNT, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/satchel_of_holding_inert - category = list(RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_BLUESPACE) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_BLUESPACE, + ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE /datum/design/duffel_holding @@ -13,7 +20,14 @@ desc = "A block of metal ready to be transformed into a duffel bag of holding with a bluespace anomaly core." id = "duffel_holding" build_type = PROTOLATHE - materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 2, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/diamond = SHEET_MATERIAL_AMOUNT, + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/duffel_of_holding_inert - category = list(RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_BLUESPACE) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_BLUESPACE, + ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/modular_skyrat/modules/huds/code/designs.dm b/modular_skyrat/modules/huds/code/designs.dm index d4f0586ada9..631e0859c02 100644 --- a/modular_skyrat/modules/huds/code/designs.dm +++ b/modular_skyrat/modules/huds/code/designs.dm @@ -3,10 +3,14 @@ desc = "A heads-up display that scans the humans in view and provides accurate data about their health status. This one has a prescription lens." id = "health_hud_prescription" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/health/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -15,10 +19,14 @@ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status. This one has a prescription lens." id = "security_hud_prescription" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/security/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY, ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY @@ -27,10 +35,14 @@ desc = "A HUD used to analyze and determine faults within robotic machinery. This one has a prescription lens." id = "diagnostic_hud_prescription" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/diagnostic/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -39,10 +51,14 @@ desc = "These glasses scan the contents of containers and projects their contents to the user in an easy to read format. This one has a prescription lens." id = "science_hud_prescription" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/science/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_MEDICAL @@ -51,10 +67,14 @@ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition. Prescription lens has been added into this design." id = "mesons_prescription" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/meson/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING @@ -63,10 +83,15 @@ desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes. Prescription lens has been added into this design." id = "engine_goggles_prescription" build_type = PROTOLATHE | AWAY_LATHE | COLONY_FABRICATOR - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plasma = SMALL_MATERIAL_AMOUNT, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plasma = SMALL_MATERIAL_AMOUNT, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/meson/engine/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING @@ -75,9 +100,13 @@ desc = "Used by engineering staff to see underfloor objects such as cables and pipes. Prescription lens has been added into this design." id = "tray_goggles_prescription" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SMALL_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = SMALL_MATERIAL_AMOUNT, + ) build_path = /obj/item/clothing/glasses/meson/engine/tray/prescription category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING diff --git a/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm b/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm index 504f7346dfb..6933041c786 100644 --- a/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm +++ b/modular_skyrat/modules/hyposprays/code/autolathe_designs.dm @@ -2,15 +2,26 @@ name = "Large Hypovial" id = "large_hypovial" build_type = AUTOLATHE | PROTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/reagent_containers/cup/vial/large - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL) + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, + ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL /datum/design/pen name = "Pen" id = "pen" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT, + /datum/material/glass = SMALL_MATERIAL_AMOUNT, + ) build_path = /obj/item/pen - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC) + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC, + ) diff --git a/modular_skyrat/modules/implants/code/augments_chest.dm b/modular_skyrat/modules/implants/code/augments_chest.dm index 87e817da379..0b4fe75668b 100644 --- a/modular_skyrat/modules/implants/code/augments_chest.dm +++ b/modular_skyrat/modules/implants/code/augments_chest.dm @@ -1,7 +1,3 @@ -// for readability's sake, define here to match the healthscan() proc's use of it -// if someone updates that upstream, fix that here too, wouldja? -#define SCANNER_VERBOSE 1 - /obj/item/organ/internal/cyberimp/chest/scanner name = "internal health analyzer" desc = "An advanced health analyzer implant, designed to directly interface with a host's body and relay scan information to the brain on command." @@ -26,5 +22,3 @@ chemscan(owner, owner) else healthscan(owner, owner, SCANNER_VERBOSE, TRUE) - -#undef SCANNER_VERBOSE diff --git a/modular_skyrat/modules/implants/code/medical_designs.dm b/modular_skyrat/modules/implants/code/medical_designs.dm index 3197d96c5b7..5ebcfa2e63e 100644 --- a/modular_skyrat/modules/implants/code/medical_designs.dm +++ b/modular_skyrat/modules/implants/code/medical_designs.dm @@ -3,11 +3,15 @@ desc = "A long, sharp, mantis-like blade installed within the forearm, acting as a deadly self defense weapon." id = "ci-mantis" build_type = MECHFAB - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/armblade category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT, ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY @@ -19,12 +23,12 @@ materials = list ( /datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, ) construction_time = 20 SECONDS build_path = /obj/item/organ/internal/cyberimp/arm/razor_claws category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SECURITY @@ -33,11 +37,15 @@ desc = "An advanced hacking and machine modification toolkit fitted into an arm implant, designed to be installed on a subject's arm." id = "ci-hacker" build_type = MECHFAB - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/hacker category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING @@ -46,11 +54,15 @@ desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." id = "ci-flash" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/flash category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -59,11 +71,16 @@ desc = "Everything a botanist needs in an arm implant, designed to be installed on a subject's arm." id = "ci-botany" build_type = MECHFAB | PROTOLATHE - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + ) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/botany category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SERVICE @@ -73,10 +90,16 @@ id = "ci-nv" build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 6, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 6, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 6, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 6, /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT,) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/organ/internal/eyes/night_vision/cyber category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -86,10 +109,15 @@ id = "ci-antisleep" build_type = PROTOLATHE | MECHFAB construction_time = 60 - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 6, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 6, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/organ/internal/cyberimp/brain/anti_sleep category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -99,10 +127,15 @@ id = "ci-scanner" build_type = MECHFAB | PROTOLATHE construction_time = 40 - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, /datum/material/silver = SHEET_MATERIAL_AMOUNT, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/organ/internal/cyberimp/chest/scanner category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -111,11 +144,15 @@ desc = "A set of janitor tools fitted into an arm implant, designed to be installed on subject's arm." id = "ci-janitor" build_type = PROTOLATHE | MECHFAB - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/janitor category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SERVICE @@ -124,11 +161,15 @@ desc = "A lighter, installed into the subject's arm. Incredibly useless." id = "ci-lighter" build_type = PROTOLATHE | MECHFAB - materials = list (/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 5) + materials = list ( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) construction_time = 100 build_path = /obj/item/organ/internal/cyberimp/arm/lighter category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SERVICE @@ -142,6 +183,6 @@ name = "Reviver Implant" id = "ci-reviver" category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_COMBAT, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/modular_skyrat/modules/imported_vendors/code/vendor_food.dm b/modular_skyrat/modules/imported_vendors/code/vendor_food.dm index 2fe1e97965d..df5e62c82c9 100644 --- a/modular_skyrat/modules/imported_vendors/code/vendor_food.dm +++ b/modular_skyrat/modules/imported_vendors/code/vendor_food.dm @@ -7,14 +7,18 @@ desc = "The condensation and what you can only hope are the leftovers of food make this a bit hard to reuse." icon = 'modular_skyrat/modules/imported_vendors/icons/imported_quick_foods.dmi' icon_state = "foodtray_empty" - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) /obj/item/trash/empty_side_pack name = "empty side wrapper" desc = "Unfortunately, this no longer holds any sides to distract you from the other 'food'." icon = 'modular_skyrat/modules/imported_vendors/icons/imported_quick_foods.dmi' icon_state = "foodpack_generic_trash" - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) /obj/item/trash/empty_side_pack/nt icon_state = "foodpack_nt_trash" diff --git a/modular_skyrat/modules/imported_vendors/code/vendor_snacks.dm b/modular_skyrat/modules/imported_vendors/code/vendor_snacks.dm index 38de344ec4d..b5229a876bf 100644 --- a/modular_skyrat/modules/imported_vendors/code/vendor_snacks.dm +++ b/modular_skyrat/modules/imported_vendors/code/vendor_snacks.dm @@ -19,7 +19,9 @@ desc = "The leftovers of what was likely a great snack in a past time." icon = 'modular_skyrat/modules/imported_vendors/icons/imported_quick_foods.dmi' icon_state = "foodpack_generic_trash" - custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) /* * Yangyu Snacks diff --git a/modular_skyrat/modules/indicators/code/combat_indicator.dm b/modular_skyrat/modules/indicators/code/combat_indicator.dm index 3e42b21ec4c..67b97da1591 100644 --- a/modular_skyrat/modules/indicators/code/combat_indicator.dm +++ b/modular_skyrat/modules/indicators/code/combat_indicator.dm @@ -42,11 +42,6 @@ GLOBAL_VAR_INIT(combat_indicator_overlay, GenerateCombatOverlay()) if(combat_indicator) . += GLOB.combat_indicator_overlay -/mob/living/silicon/robot/update_icons() - . = ..() - if(combat_indicator) - add_overlay(GLOB.combat_indicator_overlay) - /obj/vehicle/sealed/update_overlays() . = ..() if(combat_indicator_vehicle) diff --git a/modular_skyrat/modules/jukebox/code/dance_machine.dm b/modular_skyrat/modules/jukebox/code/dance_machine.dm index 17030d72740..09d335f4460 100644 --- a/modular_skyrat/modules/jukebox/code/dance_machine.dm +++ b/modular_skyrat/modules/jukebox/code/dance_machine.dm @@ -15,12 +15,13 @@ var/list/datum/weakref/rangers = list() /// World.time when the current song will stop playing, but also a cooldown between activations var/stop = 0 - /// List of /datum/tracks we can play - var/list/songs = list() /// Current song selected var/datum/track/selection = null /// Volume of the songs played - var/volume = 100 + var/volume = 50 + //https://www.desmos.com/calculator/ybto1dyqzk + var/falloff_dist_offset = 20 // higher = jukebox can be heard from further away + var/falloff_dist_divider = 100 // lower = falloff begins sooner /obj/machinery/jukebox/disco name = "radiant dance machine mark IV" @@ -38,16 +39,19 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF obj_flags = CAN_BE_HIT | NO_DECONSTRUCTION +/obj/machinery/jukebox/public + req_access = list() + falloff_dist_offset = 10 + falloff_dist_divider = 50 + /obj/machinery/jukebox/Initialize(mapload) . = ..() - songs = SSjukeboxes.songs - if(length(songs)) - selection = pick(songs) + if(length(SSjukeboxes.songs)) + selection = pick(SSjukeboxes.songs) /obj/machinery/jukebox/Destroy() dance_over() selection = null - songs.Cut() return ..() /obj/machinery/jukebox/attackby(obj/item/O, mob/user, params) @@ -73,6 +77,10 @@ SSvis_overlays.add_vis_overlay(src, icon, "active", layer, plane, dir, alpha) SSvis_overlays.add_vis_overlay(src, icon, "active", 0, EMISSIVE_PLANE, dir, alpha) +/obj/machinery/jukebox/examine(mob/user) + . = ..() + if (active) + . += "Now playing: [selection.song_name]" /obj/machinery/jukebox/ui_status(mob/user) if(!anchored) diff --git a/modular_skyrat/modules/jukebox/code/jukebox_subsystem.dm b/modular_skyrat/modules/jukebox/code/jukebox_subsystem.dm index f4eaa805a54..8c964eae582 100644 --- a/modular_skyrat/modules/jukebox/code/jukebox_subsystem.dm +++ b/modular_skyrat/modules/jukebox/code/jukebox_subsystem.dm @@ -14,13 +14,6 @@ SUBSYSTEM_DEF(jukeboxes) var/song_beat = 0 var/song_associated_id = null -/datum/track/New(name, path, length, beat, assocID) - song_name = name - song_path = path - song_length = length - song_beat = beat - song_associated_id = assocID - /datum/controller/subsystem/jukeboxes/proc/addjukebox(obj/machinery/jukebox/jukebox, datum/track/T, jukefalloff = 1) if(!istype(T)) CRASH("[src] tried to play a song with a nonexistant track") @@ -65,7 +58,8 @@ SUBSYSTEM_DEF(jukeboxes) return activejukeboxes.Find(jukeinfo) return FALSE -/datum/controller/subsystem/jukeboxes/Initialize() +/datum/controller/subsystem/jukeboxes/proc/reload_songs() + songs = list() var/list/tracks = flist("[global.config.directory]/jukebox_music/sounds/") for(var/S in tracks) var/datum/track/T = new() @@ -78,6 +72,9 @@ SUBSYSTEM_DEF(jukeboxes) T.song_beat = text2num(L[3]) T.song_associated_id = L[4] songs |= T + +/datum/controller/subsystem/jukeboxes/Initialize() + reload_songs() for(var/i in CHANNEL_JUKEBOX_START to CHANNEL_JUKEBOX) freejukeboxchannels |= i return SS_INIT_SUCCESS @@ -98,27 +95,25 @@ SUBSYSTEM_DEF(jukeboxes) stack_trace("Nonexistant or invalid object associated with jukebox.") continue var/sound/song_played = sound(juketrack.song_path) - // var/turf/currentturf = get_turf(jukebox) //BUBBERSTATION CHANGE, CUSTOM FALLOFF - song_played.falloff = 255 //BUBBERSTATION CHANGE, CUSTOM FALLOFF + song_played.falloff = 255 for(var/mob/M in GLOB.player_list) if(!HAS_JUKEBOX_PREF(M)) M.stop_sound_channel(jukeinfo[2]) continue - var/volume = jukebox.volume //BUBBERSTATION CHANGE, CUSTOM FALLOFF + var/volume = jukebox.volume if(jukebox.z == M.z) //todo - expand this to work with mining planet z-levels when robust jukebox audio gets merged to master song_played.status = SOUND_UPDATE - //BUBBERSTATION CHANGE START, CUSTOM FALLOFF //https://www.desmos.com/calculator/ybto1dyqzk if(jukeinfo[4]) //HAS FALLOFF var/distance = get_dist(M,jukebox) volume = min( 50, volume, - volume * ((max(1,volume*0.1 + 20 - distance)/80)**0.2 - (distance/100)) + volume * ((max(1,volume*0.1 + jukebox.falloff_dist_offset - distance)/80)**0.2 - (distance/jukebox.falloff_dist_divider)) ) volume = round(volume,1) if(volume < jukebox.volume*0.5) @@ -133,10 +128,10 @@ SUBSYSTEM_DEF(jukeboxes) if(volume < 1) song_played.status |= SOUND_MUTE - //BUBBERSTATION CHANGE END, CUSTOM FALLOFF else song_played.status = SOUND_MUTE | SOUND_UPDATE //Setting volume = 0 doesn't let the sound properties update at all, which is lame. - M.playsound_local(null, null, volume, channel = jukeinfo[2], sound_to_use = song_played) //BUBBERSTATION CHANGE, CUSTOM FALLOFF. + + M.playsound_local(null, null, volume, channel = jukeinfo[2], sound_to_use = song_played) CHECK_TICK return diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm index b6461c2fed1..ed462fceaf5 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_controller.dm @@ -35,14 +35,17 @@ SUBSYSTEM_DEF(liquids) /datum/controller/subsystem/liquids/fire(resumed = FALSE) if(run_type == SSLIQUIDS_RUN_TYPE_TURFS) - if(!currentrun_active_turfs.len && active_turfs.len) - currentrun_active_turfs = active_turfs.Copy() - for(var/tur in currentrun_active_turfs) + if(!resumed) + src.currentrun_active_turfs = active_turfs.Copy() + // cache for speed + var/list/currentrun_active_turfs = src.currentrun_active_turfs + while(currentrun_active_turfs.len) + var/turf/turf = currentrun_active_turfs[currentrun_active_turfs.len] + turf.process_liquid_cell() + currentrun_active_turfs.Remove(turf) if(MC_TICK_CHECK) - return - var/turf/T = tur - T.process_liquid_cell() - currentrun_active_turfs -= T //work off of index later + break + resumed = FALSE if(!currentrun_active_turfs.len) run_type = SSLIQUIDS_RUN_TYPE_GROUPS if (run_type == SSLIQUIDS_RUN_TYPE_GROUPS) @@ -58,7 +61,8 @@ SUBSYSTEM_DEF(liquids) LG.break_group() if(MC_TICK_CHECK) run_type = SSLIQUIDS_RUN_TYPE_IMMUTABLES //No currentrun here for now - return + break + resumed = FALSE run_type = SSLIQUIDS_RUN_TYPE_IMMUTABLES if(run_type == SSLIQUIDS_RUN_TYPE_IMMUTABLES) for(var/t in active_immutables) @@ -66,8 +70,9 @@ SUBSYSTEM_DEF(liquids) T.process_immutable_liquid() /* if(MC_TICK_CHECK) - return + break */ + resumed = FALSE run_type = SSLIQUIDS_RUN_TYPE_EVAPORATION if(run_type == SSLIQUIDS_RUN_TYPE_EVAPORATION) @@ -78,7 +83,8 @@ SUBSYSTEM_DEF(liquids) if(prob(EVAPORATION_CHANCE)) T.liquids.process_evaporation() if(MC_TICK_CHECK) - return + break + resumed = FALSE evaporation_counter = 0 run_type = SSLIQUIDS_RUN_TYPE_FIRE @@ -90,11 +96,12 @@ SUBSYSTEM_DEF(liquids) T.liquids.process_fire() if(MC_TICK_CHECK) return + resumed = FALSE fire_counter = 0 run_type = SSLIQUIDS_RUN_TYPE_TURFS /datum/controller/subsystem/liquids/proc/add_active_turf(turf/T) - if(!active_turfs[T]) + if(can_fire && !active_turfs[T]) active_turfs[T] = TRUE if(T.lgroup) T.lgroup.amount_of_active_turfs++ diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm index 7182a6411c9..40a376605e1 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm @@ -305,7 +305,6 @@ if(!any_share) SSliquids.active_immutables -= src - /* * OPEN TURFS */ diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_accessory.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_accessory.dm index 9140fc6ee7e..addd37faf58 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_accessory.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_accessory.dm @@ -51,39 +51,38 @@ GLOBAL_LIST_INIT(loadout_accessory, generate_loadout_items(/datum/loadout_item/a */ /datum/loadout_item/accessory/armband_medblue - name = "Medical Armband (blue stripe)" - item_path = /obj/item/clothing/accessory/armband/medblue - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_MEDICAL_DOCTOR, JOB_PARAMEDIC, JOB_CHEMIST, JOB_VIROLOGIST, JOB_ORDERLY, JOB_CORONER) + name = "Blue-White Armband" + item_path = /obj/item/clothing/accessory/armband/medblue/nonsec /datum/loadout_item/accessory/armband_med - name = "Medical Armband (white)" - item_path = /obj/item/clothing/accessory/armband/med - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_MEDICAL_DOCTOR, JOB_PARAMEDIC, JOB_CHEMIST, JOB_VIROLOGIST, JOB_ORDERLY, JOB_CORONER) + name = "White Armband" + item_path = /obj/item/clothing/accessory/armband/med/nonsec /datum/loadout_item/accessory/armband_cargo - name = "Cargo Armband" - item_path = /obj/item/clothing/accessory/armband/cargo - restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_CUSTOMS_AGENT) + name = "Brown Armband" + item_path = /obj/item/clothing/accessory/armband/cargo/nonsec /datum/loadout_item/accessory/armband_engineering - name = "Engineering Armband" - item_path = /obj/item/clothing/accessory/armband/engine - restricted_roles = list(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_ENGINEERING_GUARD) + name = "Orange Armband" + item_path = /obj/item/clothing/accessory/armband/engine/nonsec + +/datum/loadout_item/accessory/armband_security_nonsec + name = "Blue Armband" + item_path = /obj/item/clothing/accessory/armband/deputy/lopland/nonsec /datum/loadout_item/accessory/armband_security name = "Security Armband" item_path = /obj/item/clothing/accessory/armband/deputy/lopland - restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE) + restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/accessory/armband_security_deputy name = "Security Deputy Armband" item_path = /obj/item/clothing/accessory/armband/deputy - restricted_roles = list(JOB_CORRECTIONS_OFFICER) + restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/accessory/armband_science - name = "Science Armband" - item_path = /obj/item/clothing/accessory/armband/science - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST, JOB_SCIENCE_GUARD) + name = "Purple Armband" + item_path = /obj/item/clothing/accessory/armband/science/nonsec /* * ARMOURLESS diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm index f8f74889b50..a30e25c923f 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_glasses.dm @@ -63,6 +63,10 @@ GLOBAL_LIST_INIT(loadout_glasses, generate_loadout_items(/datum/loadout_item/gla name = "Modern Glasses" item_path = /obj/item/clothing/glasses/regular/betterunshit +/datum/loadout_item/glasses/prescription_glasses/kim + name = "Binoclard Lenses" + item_path = /obj/item/clothing/glasses/regular/kim + /* * COSMETIC GLASSES */ diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_gloves.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_gloves.dm index 936ca251455..3d78c20d1aa 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_gloves.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_gloves.dm @@ -78,6 +78,10 @@ GLOBAL_LIST_INIT(loadout_gloves, generate_loadout_items(/datum/loadout_item/glov name = "Evening Gloves" item_path = /obj/item/clothing/gloves/evening +/datum/loadout_item/gloves/kim + name = "Aerostatic Gloves" + item_path = /obj/item/clothing/gloves/kim + /datum/loadout_item/gloves/maid name = "Maid Arm Covers" item_path = /obj/item/clothing/gloves/maid diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm index 47db4c9daed..baf41696517 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm @@ -341,6 +341,22 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea name = "Flower Pin" item_path = /obj/item/clothing/head/costume/skyrat/flowerpin +/datum/loadout_item/head/floral_garland + name = "Floral Garland" + item_path = /obj/item/clothing/head/costume/garland + +/datum/loadout_item/head/sunflower_crown + name = "Sunflower Crown" + item_path = /obj/item/clothing/head/costume/garland/sunflower + +/datum/loadout_item/head/lily_crown + name = "Lily Crown" + item_path = /obj/item/clothing/head/costume/garland/lily + +/datum/loadout_item/head/poppy_crown + name = "Poppy Crown" + item_path = /obj/item/clothing/head/costume/garland/poppy + /datum/loadout_item/head/rice_hat name = "Rice Hat" item_path = /obj/item/clothing/head/costume/rice_hat @@ -448,27 +464,22 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea /datum/loadout_item/head/trekcap name = "Officer's Cap (White)" item_path = /obj/item/clothing/head/hats/caphat/parade/fedcap - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL) /datum/loadout_item/head/trekcapcap name = "Officer's Cap (Black)" item_path = /obj/item/clothing/head/hats/caphat/parade/fedcap/black - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY) /datum/loadout_item/head/trekcapmedisci name = "MedSci Officer's Cap (Blue)" item_path = /obj/item/clothing/head/hats/caphat/parade/fedcap/medsci - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_MEDICAL_DOCTOR, JOB_PARAMEDIC,JOB_CHEMIST, JOB_VIROLOGIST, JOB_PSYCHOLOGIST, JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_ORDERLY, JOB_CORONER) /datum/loadout_item/head/trekcapeng name = "Eng Officer's Cap (Yellow)" item_path = /obj/item/clothing/head/hats/caphat/parade/fedcap/eng - restricted_roles = list(JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_CORRECTIONS_OFFICER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_QUARTERMASTER, JOB_ENGINEERING_GUARD, JOB_CUSTOMS_AGENT) /datum/loadout_item/head/trekcapsec name = "Officer's Cap (Red)" item_path = /obj/item/clothing/head/hats/caphat/parade/fedcap/sec - restricted_roles = list(JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_CORRECTIONS_OFFICER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_QUARTERMASTER, JOB_CUSTOMS_AGENT) /* * JOB-LOCKED @@ -511,9 +522,8 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea restricted_roles = list(JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/head/blasthelmet - name = "General's Helmet" + name = "Blast Helmet" item_path = /obj/item/clothing/head/hats/imperial/helmet - restricted_roles = list(JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_CORRECTIONS_OFFICER, JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER) /datum/loadout_item/head/navybluehoscap name = "Head of Security's Naval Cap" @@ -530,35 +540,34 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea item_path = /obj/item/clothing/head/beret/sec/navywarden restricted_roles = list(JOB_WARDEN) -/datum/loadout_item/head/cybergoggles //Cyberpunk-P.I. Outfit +/datum/loadout_item/head/cybergoggles_civ name = "Type-34C Forensics Headwear" + item_path = /obj/item/clothing/head/fedora/det_hat/cybergoggles/civilian + +/datum/loadout_item/head/cybergoggles //Cyberpunk-P.I. Outfit + name = "Type-34P Forensics Headwear" item_path = /obj/item/clothing/head/fedora/det_hat/cybergoggles - restricted_roles = list(JOB_DETECTIVE) + restricted_roles = list(JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/head/nursehat name = "Nurse Hat" item_path = /obj/item/clothing/head/costume/nursehat - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_GENETICIST, JOB_CHEMIST, JOB_VIROLOGIST) /datum/loadout_item/head/imperial_generic name = "Grey Naval Officer Cap" item_path = /obj/item/clothing/head/hats/imperial - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER, JOB_NT_REP) /datum/loadout_item/head/imperial_grey name = "Dark Grey Naval Officer Cap" item_path = /obj/item/clothing/head/hats/imperial/grey - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER, JOB_NT_REP) /datum/loadout_item/head/imperial_red name = "Red Naval Officer Cap" item_path = /obj/item/clothing/head/hats/imperial/red - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER) /datum/loadout_item/head/imperial_white name = "White Naval Officer Cap" item_path = /obj/item/clothing/head/hats/imperial/white - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER) /datum/loadout_item/head/azulea_oldblood name = "Oldblood's Royal cap" @@ -579,40 +588,30 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea /datum/loadout_item/head/atmos_beret name = "Atmospherics Beret" item_path = /obj/item/clothing/head/beret/atmos - restricted_roles = list( - JOB_ATMOSPHERIC_TECHNICIAN, - JOB_CHIEF_ENGINEER, - ) /datum/loadout_item/head/engi_beret name = "Engineering Beret" item_path = /obj/item/clothing/head/beret/engi - restricted_roles = list(JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_CHIEF_ENGINEER, JOB_ENGINEERING_GUARD) /datum/loadout_item/head/cargo_beret name = "Supply Beret" item_path = /obj/item/clothing/head/beret/cargo - restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_CUSTOMS_AGENT) /datum/loadout_item/head/beret_med name = "Medical Beret" item_path = /obj/item/clothing/head/beret/medical - restricted_roles = list(JOB_MEDICAL_DOCTOR,JOB_VIROLOGIST, JOB_CHEMIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_ORDERLY, JOB_CORONER) /datum/loadout_item/head/beret_paramedic name = "Paramedic Beret" item_path = /obj/item/clothing/head/beret/medical/paramedic - restricted_roles = list(JOB_PARAMEDIC, JOB_CHIEF_MEDICAL_OFFICER) /datum/loadout_item/head/beret_viro name = "Virologist Beret" item_path = /obj/item/clothing/head/beret/medical/virologist - restricted_roles = list(JOB_VIROLOGIST, JOB_CHIEF_MEDICAL_OFFICER) /datum/loadout_item/head/beret_chem name = "Chemist Beret" item_path = /obj/item/clothing/head/beret/medical/chemist - restricted_roles = list(JOB_CHEMIST, JOB_CHIEF_MEDICAL_OFFICER) /datum/loadout_item/head/beret_coroner //Bubbers Addition name = "Coroner Beret" @@ -622,12 +621,10 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea /datum/loadout_item/head/beret_sci name = "Scientist Beret" item_path = /obj/item/clothing/head/beret/science - restricted_roles = list(JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_SCIENCE_GUARD) /datum/loadout_item/head/beret_robo name = "Roboticist Beret" item_path = /obj/item/clothing/head/beret/science/fancy/robo - restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) /* * FAMILIES diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm index d0052806a13..160ff263b0b 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm @@ -73,6 +73,10 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) name = "Gas Mask" item_path = /obj/item/clothing/mask/gas +/datum/loadout_item/mask/gas_alt + name = "Black Gas Mask" + item_path = /obj/item/clothing/mask/gas/alt + /datum/loadout_item/mask/gas_glass name = "Glass Gas Mask" item_path = /obj/item/clothing/mask/gas/glass @@ -87,6 +91,26 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) // Ain't a damn thing +/* +* MASQUERADE MASKS +*/ + +/datum/loadout_item/mask/masquerade + name = "Masquerade Mask" + item_path = /obj/item/clothing/mask/masquerade + +/datum/loadout_item/mask/masquerade/two_colors + name = "Split Masquerade Mask" + item_path = /obj/item/clothing/mask/masquerade/two_colors + +/datum/loadout_item/mask/masquerade/feathered + name = "Feathered Masquerade Mask" + item_path = /obj/item/clothing/mask/masquerade/feathered + +/datum/loadout_item/mask/masquerade/two_colors/feathered + name = "Feathered Split Masquerade Mask" + item_path = /obj/item/clothing/mask/masquerade/two_colors/feathered + /* * FAMILIES */ diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm index f3771ad5fbd..cbabba6b8fb 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm @@ -121,7 +121,6 @@ GLOBAL_LIST_INIT(loadout_necks, generate_loadout_items(/datum/loadout_item/neck) /datum/loadout_item/neck/discoproper name = "Horrible Necktie" item_path = /obj/item/clothing/neck/tie/disco - restricted_roles = list(JOB_DETECTIVE) /* * COLLARS @@ -282,7 +281,6 @@ GLOBAL_LIST_INIT(loadout_necks, generate_loadout_items(/datum/loadout_item/neck) /datum/loadout_item/neck/stethoscope name = "Stethoscope" item_path = /obj/item/clothing/neck/stethoscope - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER) /datum/loadout_item/neck/maid name = "Maid Neck Cover" @@ -295,12 +293,12 @@ GLOBAL_LIST_INIT(loadout_necks, generate_loadout_items(/datum/loadout_item/neck) /datum/loadout_item/neck/holobadge name = "Holobadge" item_path = /obj/item/clothing/accessory/badge/holo - restricted_roles = list(JOB_SECURITY_OFFICER, JOB_DETECTIVE, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/neck/holobadge_cord name = "Holobadge with Lanyard" item_path = /obj/item/clothing/accessory/badge/holo/cord - restricted_roles = list(JOB_SECURITY_OFFICER, JOB_DETECTIVE, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) /* * DONATOR diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm index 5e21956f8bd..71d665a904e 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm @@ -194,6 +194,10 @@ GLOBAL_LIST_INIT(loadout_shoes, generate_loadout_items(/datum/loadout_item/shoes name = "Green Snakeskin Shoes" item_path = /obj/item/clothing/shoes/discoshoes +/datum/loadout_item/shoes/kim + name = "Aerostatic Shoes" + item_path = /obj/item/clothing/shoes/kim + /datum/loadout_item/shoes/dominaheels name = "Dominant Heels" item_path = /obj/item/clothing/shoes/latex_heels/domina_heels @@ -215,6 +219,10 @@ GLOBAL_LIST_INIT(loadout_shoes, generate_loadout_items(/datum/loadout_item/shoes name = "Roller Skates" item_path = /obj/item/clothing/shoes/wheelys/rollerskates +/datum/loadout_item/shoes/jingleshoes + name = "Jester Shoes" + item_path = /obj/item/clothing/shoes/jester_shoes + /* * SEASONAL */ @@ -233,7 +241,7 @@ GLOBAL_LIST_INIT(loadout_shoes, generate_loadout_items(/datum/loadout_item/shoes */ /datum/loadout_item/shoes/jester - name = "Jester Shoes" + name = "Clown's Jester Shoes" item_path = /obj/item/clothing/shoes/clown_shoes/jester restricted_roles = list(JOB_CLOWN) diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm index d5e638a7e67..4891323c05c 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm @@ -119,7 +119,6 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/labcoat_medical name = "Medical Labcoat" item_path = /obj/item/clothing/suit/toggle/labcoat/medical - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER) /* * PONCHOS @@ -347,7 +346,7 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su item_path = /obj/item/clothing/suit/toggle/trackjacket /datum/loadout_item/suit/croptop - name = "Black Crop Top Turtleneck" + name = "Crop Top Turtleneck" item_path = /obj/item/clothing/suit/croptop /* @@ -455,7 +454,10 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/discojacket name = "Disco Ass Blazer" item_path = /obj/item/clothing/suit/discoblazer - restricted_roles = list(JOB_DETECTIVE) + +/datum/loadout_item/suit/kimjacket + name = "Aerostatic Bomber Jacket" + item_path = /obj/item/clothing/suit/kimjacket /datum/loadout_item/suit/cardigan name = "Cardigan" @@ -537,58 +539,48 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/coat_med name = "Medical Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/medical - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_MEDICAL_DOCTOR, JOB_ORDERLY) // Reserved for Medical Doctors, Orderlies, and their boss, the Chief Medical Officer /datum/loadout_item/suit/coat_paramedic name = "Paramedic Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/medical/paramedic - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_PARAMEDIC) // Reserved for Paramedics and their boss, the Chief Medical Officer /datum/loadout_item/suit/coat_robotics name = "Robotics Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/science/robotics - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_ROBOTICIST) /datum/loadout_item/suit/coat_sci name = "Science Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/science - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_SCIENCE_GUARD) // Reserved for the Science Departement /datum/loadout_item/suit/coat_eng name = "Engineering Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/engineering - restricted_roles = list(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ENGINEERING_GUARD) // Reserved for Station Engineers, Engineering Guards, and their boss, the Chief Engineer /datum/loadout_item/suit/coat_atmos name = "Atmospherics Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos - restricted_roles = list(JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN) // Reserved for Atmos Techs and their boss, the Chief Engineer /datum/loadout_item/suit/coat_hydro name = "Hydroponics Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/hydro - restricted_roles = list(JOB_HEAD_OF_PERSONNEL, JOB_BOTANIST) // Reserved for Botanists and their boss, the Head of Personnel /datum/loadout_item/suit/coat_bar name = "Bartender Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/skyrat/bartender - restricted_roles = list(JOB_HEAD_OF_PERSONNEL, JOB_BARTENDER) //Reserved for Bartenders and their boss, the Head of Personnel /datum/loadout_item/suit/coat_cargo name = "Cargo Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/cargo - restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_CUSTOMS_AGENT) // Reserved for Cargo Techs, Customs Agents, and their boss, the Quartermaster /datum/loadout_item/suit/coat_miner name = "Mining Winter Coat" item_path = /obj/item/clothing/suit/hooded/wintercoat/miner - restricted_roles = list(JOB_QUARTERMASTER, JOB_SHAFT_MINER) // Reserved for Miners and their boss, the Quartermaster // JACKETS /datum/loadout_item/suit/navybluejacketofficer name = "Security Officer's Navy Blue Formal Jacket" item_path = /obj/item/clothing/suit/jacket/officer/blue - restricted_roles = list(JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_WARDEN) + restricted_roles = list(JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/suit/navybluejacketwarden name = "Warden's Navy Blue Formal Jacket" @@ -603,7 +595,7 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/security_jacket name = "Security Jacket" item_path = /obj/item/clothing/suit/toggle/jacket/sec - restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE) + restricted_roles = list(JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY) //Not giving this one to COs because it's actually better than the one they spawn with /datum/loadout_item/suit/brit name = "High Vis Armored Vest" @@ -613,7 +605,7 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/british_jacket name = "Peacekeeper Officer Coat" item_path = /obj/item/clothing/suit/british_officer - restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_WARDEN, JOB_DETECTIVE) + restricted_roles = list(JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_OFFICER, JOB_HEAD_OF_SECURITY, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/suit/offdep_jacket name = "Off-Department Jacket" @@ -622,27 +614,22 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/engi_jacket name = "Engineering Jacket" item_path = /obj/item/clothing/suit/toggle/jacket/engi - restricted_roles = list(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_ENGINEERING_GUARD) /datum/loadout_item/suit/sci_jacket name = "Science Jacket" item_path = /obj/item/clothing/suit/toggle/jacket/sci - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST, JOB_SCIENCE_GUARD) /datum/loadout_item/suit/med_jacket name = "Medbay Jacket" item_path = /obj/item/clothing/suit/toggle/jacket/med - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_MEDICAL_DOCTOR, JOB_PARAMEDIC, JOB_CHEMIST, JOB_VIROLOGIST, JOB_ORDERLY) /datum/loadout_item/suit/supply_jacket name = "Supply Jacket" item_path = /obj/item/clothing/suit/toggle/jacket/supply - restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_CUSTOMS_AGENT) /datum/loadout_item/suit/cargo_gorka_jacket name = "Cargo Gorka Jacket" item_path = /obj/item/clothing/suit/toggle/cargo_tech - restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_CUSTOMS_AGENT) /datum/loadout_item/suit/qm_jacket name = "Quartermaster's Overcoat" @@ -653,7 +640,6 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su /datum/loadout_item/suit/labcoat_highvis name = "High-Vis Labcoat" item_path = /obj/item/clothing/suit/toggle/labcoat/skyrat/highvis - restricted_roles = list(JOB_CHIEF_MEDICAL_OFFICER, JOB_PARAMEDIC, JOB_ATMOSPHERIC_TECHNICIAN, JOB_DETECTIVE, JOB_CHEMIST, JOB_ORDERLY) /* * FAMILIES diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm index 702983b4966..cfb0cc14e3a 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm @@ -33,7 +33,6 @@ GLOBAL_LIST_INIT(loadout_toys, generate_loadout_items(/datum/loadout_item/toys)) /datum/loadout_item/toys/narsie name = "Nar'sie Plushie" item_path = /obj/item/toy/plush/narplush - restricted_roles = list(JOB_CHAPLAIN) /datum/loadout_item/toys/nukie name = "Nukie Plushie" @@ -50,7 +49,6 @@ GLOBAL_LIST_INIT(loadout_toys, generate_loadout_items(/datum/loadout_item/toys)) /datum/loadout_item/toys/ratvar name = "Ratvar Plushie" item_path = /obj/item/toy/plush/ratplush - restricted_roles = list(JOB_CHAPLAIN) /datum/loadout_item/toys/rouny name = "Rouny Plushie" diff --git a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm index 3282d4a572a..af76341e5f9 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm @@ -96,23 +96,18 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/jumpsuit/impcommand name = "Light Grey Officer's Naval Jumpsuit" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial/generic - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER, JOB_NT_REP) /datum/loadout_item/under/jumpsuit/impcom name = "Grey Officer's Naval Jumpsuit" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial/generic/grey - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER, JOB_NT_REP) /datum/loadout_item/under/jumpsuit/impred name = "Red Officer's Naval Jumpsuit" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial/generic/red - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER) //NT Reps would never wear red, it's unbefitting - /datum/loadout_item/under/jumpsuit/impcomtrous name = "Grey Officer's Naval Jumpsuit (Trousers)" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial/generic/pants - restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER, JOB_NT_REP) /datum/loadout_item/under/jumpsuit/security_trousers name = "Security Trousers" @@ -132,37 +127,30 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/jumpsuit/disco name = "Superstar Cop Uniform" item_path = /obj/item/clothing/under/rank/security/detective/disco - restricted_roles = list(JOB_DETECTIVE) /datum/loadout_item/under/jumpsuit/kim name = "Aerostatic Suit" item_path = /obj/item/clothing/under/rank/security/detective/kim - restricted_roles = list(JOB_DETECTIVE) /datum/loadout_item/under/jumpsuit/paramed_light name = "Light Paramedic Uniform" item_path = /obj/item/clothing/under/rank/medical/paramedic/skyrat/light - restricted_roles = list(JOB_PARAMEDIC) /datum/loadout_item/under/jumpsuit/paramed_light_skirt name = "Light Paramedic Skirt" item_path = /obj/item/clothing/under/rank/medical/paramedic/skyrat/light/skirt - restricted_roles = list(JOB_PARAMEDIC) /datum/loadout_item/under/jumpsuit/chemist_formal name = "Chemist's Formal Jumpsuit" item_path = /obj/item/clothing/under/rank/medical/chemist/skyrat/formal - restricted_roles = list(JOB_CHEMIST) /datum/loadout_item/under/jumpsuit/chemist_formal_skirt name = "Chemist's Formal Jumpskirt" item_path = /obj/item/clothing/under/rank/medical/chemist/skyrat/formal/skirt - restricted_roles = list(JOB_CHEMIST) /datum/loadout_item/under/jumpsuit/hlscientist name = "Ridiculous Scientist Outfit" item_path = /obj/item/clothing/under/rank/rnd/scientist/skyrat/hlscience - restricted_roles = list(JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) /datum/loadout_item/under/jumpsuit/rd_jumpsuit name = "Research Director's Jumpsuit" @@ -177,7 +165,6 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/jumpsuit/cargo name = "Cargo Technician's Jumpsuit" item_path = /obj/item/clothing/under/rank/cargo/tech - restricted_roles = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_CUSTOMS_AGENT) /datum/loadout_item/under/jumpsuit/cargo/skirt name = "Cargo Technician's Skirt" @@ -199,22 +186,18 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/jumpsuit/utility_eng name = "Engineering Utility Uniform" item_path = /obj/item/clothing/under/rank/engineering/engineer/skyrat/utility - restricted_roles = list(JOB_STATION_ENGINEER,JOB_ATMOSPHERIC_TECHNICIAN, JOB_CHIEF_ENGINEER, JOB_ENGINEERING_GUARD) /datum/loadout_item/under/jumpsuit/utility_med name = "Medical Utility Uniform" item_path = /obj/item/clothing/under/rank/medical/doctor/skyrat/utility - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_PARAMEDIC, JOB_CHEMIST, JOB_VIROLOGIST, JOB_GENETICIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_PSYCHOLOGIST, JOB_ORDERLY) /datum/loadout_item/under/jumpsuit/utility_sci name = "Science Utility Uniform" item_path = /obj/item/clothing/under/rank/rnd/scientist/skyrat/utility - restricted_roles = list(JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_SCIENCE_GUARD) /datum/loadout_item/under/jumpsuit/utility_cargo name = "Supply Utility Uniform" item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/utility - restricted_roles = list(JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_QUARTERMASTER, JOB_CUSTOMS_AGENT) /datum/loadout_item/under/jumpsuit/utility_sec name = "Security Utility Uniform" @@ -566,32 +549,26 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/miscellaneous/blacknwhite name = "Classic Prisoner Jumpsuit" item_path = /obj/item/clothing/under/rank/prisoner/classic - restricted_roles = list(JOB_PRISONER) /datum/loadout_item/under/miscellaneous/redscrubs name = "Red Scrubs" item_path = /obj/item/clothing/under/rank/medical/scrubs/skyrat/red - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_GENETICIST, JOB_CHEMIST, JOB_VIROLOGIST, JOB_PARAMEDIC) /datum/loadout_item/under/miscellaneous/bluescrubs name = "Blue Scrubs" item_path = /obj/item/clothing/under/rank/medical/scrubs/blue - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_GENETICIST, JOB_CHEMIST, JOB_VIROLOGIST, JOB_PARAMEDIC) /datum/loadout_item/under/miscellaneous/greenscrubs name = "Green Scrubs" item_path = /obj/item/clothing/under/rank/medical/scrubs/green - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_GENETICIST, JOB_CHEMIST, JOB_VIROLOGIST, JOB_PARAMEDIC) /datum/loadout_item/under/miscellaneous/purplescrubs name = "Purple Scrubs" item_path = /obj/item/clothing/under/rank/medical/scrubs/purple - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_GENETICIST, JOB_CHEMIST, JOB_VIROLOGIST, JOB_PARAMEDIC) /datum/loadout_item/under/miscellaneous/whitescrubs name = "White Scrubs" item_path = /obj/item/clothing/under/rank/medical/scrubs/skyrat/white - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_GENETICIST, JOB_CHEMIST, JOB_VIROLOGIST, JOB_PARAMEDIC) /datum/loadout_item/under/miscellaneous/gear_harness name = "Gear Harness" @@ -604,27 +581,22 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/miscellaneous/cargo_casual name = "Cargo Tech Casualwear" item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/casualman - restricted_roles = list(JOB_CARGO_TECHNICIAN) /datum/loadout_item/under/miscellaneous/cargo_shorts name = "Cargo Tech Shorts" item_path = /obj/item/clothing/under/rank/cargo/tech/alt - restricted_roles = list(JOB_CARGO_TECHNICIAN) /datum/loadout_item/under/miscellaneous/cargo_black name = "Black Cargo Uniform" item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/evil - restricted_roles = list(JOB_CARGO_TECHNICIAN) /datum/loadout_item/under/miscellaneous/cargo_turtle name = "Cargo Turtleneck" item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/turtleneck - restricted_roles = list(JOB_CARGO_TECHNICIAN) /datum/loadout_item/under/miscellaneous/cargo_skirtle name = "Cargo Skirtleneck" item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/turtleneck/skirt - restricted_roles = list(JOB_CARGO_TECHNICIAN) /datum/loadout_item/under/miscellaneous/qm_skirtle name = "Quartermaster's Skirtleneck" @@ -651,8 +623,6 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/miscellaneous/mech_suit name = "Mech Suit" item_path = /obj/item/clothing/under/costume/mech_suit - //restricted_roles = list(JOB_ROBOTICIST) // Bubberstation Edit - //Bubber edit: This is a costume and has no strong need to be restricted. /* * FORMAL UNDERSUITS @@ -880,7 +850,6 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/formal/designer_inferno name = "Designer Inferno Suit" item_path = /obj/item/clothing/under/suit/skyrat/inferno/beeze - restricted_roles = list(JOB_LAWYER) /datum/loadout_item/under/formal/pencil name = "Black Pencilskirt" diff --git a/modular_skyrat/modules/lowpop/code/config.dm b/modular_skyrat/modules/lowpop/code/config.dm new file mode 100644 index 00000000000..d8f03f3d7f9 --- /dev/null +++ b/modular_skyrat/modules/lowpop/code/config.dm @@ -0,0 +1,11 @@ +// When enabled, turns the lowpop system on +/datum/config_entry/flag/lowpop_measures_enabled + default = FALSE + +// The threshold for lowpop systems to be enabled. +/datum/config_entry/number/lowpop_threshold + default = 10 + +// How often the subsystem should fire. +/datum/config_entry/number/lowpop_subsystem_fire + default = 10 MINUTES diff --git a/modular_skyrat/modules/lowpop/code/lowpop_subsystem.dm b/modular_skyrat/modules/lowpop/code/lowpop_subsystem.dm new file mode 100644 index 00000000000..25d0662d3bb --- /dev/null +++ b/modular_skyrat/modules/lowpop/code/lowpop_subsystem.dm @@ -0,0 +1,110 @@ +#define LOWPOP_ON_MESSAGE "Due to staffing issues, we have enacted the 'critically low staff' protocol. We will periodically use our high-intensity electron beam to recharge your SMES arrays." +#define LOWPOP_OFF_MESSAGE "As the staffing issues have been resolved, we have resumed normal staffing protocol. Automatic SMES recharging will no longer occur." +#define SMES_CRITICALLY_LOW_PERCENTAGE 5 +#define RECHARGE_THRESHOLD 70 + +// A subsystem for handling lowpop affairs. +SUBSYSTEM_DEF(lowpop) + name = "Lowpop Control Measures" + wait = 10 MINUTES + runlevels = RUNLEVEL_GAME + /// Since the last fire, were the measures on or off? + var/lowpop_active = FALSE + /// List of atmos machinery we set no power to + var/static/list/atmos_machinery_no_power = list( + /obj/machinery/atmospherics/components/trinary, + /obj/machinery/atmospherics/components/binary, + ) + +/datum/controller/subsystem/lowpop/Initialize() + if(!CONFIG_GET(flag/lowpop_measures_enabled)) + can_fire = FALSE + return SS_INIT_NO_NEED + wait = CONFIG_GET(number/lowpop_subsystem_fire) + if(LAZYLEN(GLOB.player_list) > CONFIG_GET(number/lowpop_threshold)) // Don't announce it if we're not within the threshold. We use player list as people haven't spawned in yet. + return SS_INIT_SUCCESS + RegisterSignal(SSticker, COMSIG_TICKER_ROUND_STARTING, PROC_REF(roundstart_check)) + return SS_INIT_SUCCESS + +/** + * Roundstart check + * + * We check at roundstart if we should activate the measures. + */ +/datum/controller/subsystem/lowpop/proc/roundstart_check() + if(get_active_player_count(TRUE, FALSE, FALSE) > CONFIG_GET(number/lowpop_threshold)) + disable_lowpop_measures() + return // If we go above it don't do it! + enable_lowpop_measures() + addtimer(CALLBACK(src, PROC_REF(send_announcement), LOWPOP_ON_MESSAGE), rand(10 SECONDS, 30 SECONDS)) + +/datum/controller/subsystem/lowpop/proc/send_announcement(message) + priority_announce(message, "Staffing Bureau") + + +/datum/controller/subsystem/lowpop/fire(resumed) + var/fire_population_count = get_active_player_count(TRUE, FALSE, FALSE) + if(fire_population_count <= CONFIG_GET(number/lowpop_threshold)) // Oh no, we went below the threshold. + enable_lowpop_measures() + if(!lowpop_active) + return + // First, check if we need to turn these measures off. + if(fire_population_count > CONFIG_GET(number/lowpop_threshold)) + // Okay, we're high enough again, lets turn it off, and let everyone know! + disable_lowpop_measures() + addtimer(CALLBACK(src, PROC_REF(send_announcement), LOWPOP_OFF_MESSAGE), rand(10 SECONDS, 30 SECONDS)) + return + + power_restore() + +/datum/controller/subsystem/lowpop/proc/enable_lowpop_measures() + lowpop_active = TRUE + update_power_changes() + + +/datum/controller/subsystem/lowpop/proc/disable_lowpop_measures() + lowpop_active = FALSE + update_power_changes() + +/** + * Changes the power requirements of some things. + */ +/datum/controller/subsystem/lowpop/proc/update_power_changes() + if(lowpop_active) + for(var/obj/machinery/atmospherics/atmos_device as anything in GLOB.atmos_components) + if(is_type_in_list(atmos_device, atmos_machinery_no_power)) + atmos_device.update_use_power(NO_POWER_USE) + else + for(var/obj/machinery/atmospherics/atmos_device as anything in GLOB.atmos_components) + if(is_type_in_list(atmos_device, atmos_machinery_no_power)) + atmos_device.update_use_power(initial(atmos_device.use_power)) +/** + * Here we check a few things, namely, if the SMES on station are more than percent critically low, we recharge! + */ +/datum/controller/subsystem/lowpop/proc/power_restore() + var/list/all_smes = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/smes) + var/list/critically_low_smes = list() + var/list/valid_smes = list() + + for(var/obj/machinery/power/smes/smes as anything in all_smes) + // check if its the right z level + if(!is_station_level(smes.z)) + continue + LAZYADD(valid_smes, smes) + // check if it's actually low on power + if((smes.charge / smes.capacity * 100) < SMES_CRITICALLY_LOW_PERCENTAGE) + LAZYADD(critically_low_smes, smes) + + // check if enough of them are out of power + if((LAZYLEN(critically_low_smes) / LAZYLEN(valid_smes) * 100) < RECHARGE_THRESHOLD) + return + + // recharge all those smes if we're out of power! + for(var/obj/machinery/power/smes/smes as anything in valid_smes) + smes.charge = smes.capacity + smes.output_level = smes.output_level_max + smes.output_attempt = TRUE + smes.update_appearance() + smes.power_change() + + minor_announce("All SMESs on [station_name()] have been recharged via electron beam.", "Power Systems Recharged") diff --git a/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm b/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm index fb52206891e..2fe35123064 100644 --- a/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm +++ b/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm @@ -37,9 +37,6 @@ /obj/item/gun/ballistic/automatic/pistol/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SCARBOROUGH) -/obj/item/gun/ballistic/automatic/pistol/m45a5/give_manufacturer_examine() - AddElement(/datum/element/manufacturer_examine, COMPANY_NANOTRASEN) - /obj/item/gun/ballistic/revolver/c38/detective/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_NANOTRASEN) @@ -55,15 +52,9 @@ /obj/item/gun/ballistic/automatic/pistol/clandestine/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SCARBOROUGH) -/obj/item/gun/ballistic/automatic/pistol/pdh/pulse/give_manufacturer_examine() - return - /obj/item/gun/ballistic/automatic/l6_saw/toy/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_DONK) -/obj/item/gun/ballistic/automatic/cmg/give_manufacturer_examine() - AddElement(/datum/element/manufacturer_examine, COMPANY_NANOTRASEN) - /obj/item/gun/ballistic/revolver/mateba/give_manufacturer_examine() return diff --git a/modular_skyrat/modules/mapping/code/areas/shuttles.dm b/modular_skyrat/modules/mapping/code/areas/shuttles.dm index 91966bb45a5..dcd8b954858 100644 --- a/modular_skyrat/modules/mapping/code/areas/shuttles.dm +++ b/modular_skyrat/modules/mapping/code/areas/shuttles.dm @@ -20,6 +20,7 @@ /area/shuttle/tarkon_driver name = "Tarkon Driver" + requires_power = TRUE /area/shuttle/trader/bridge name = "Trader Ship Bridge" diff --git a/modular_skyrat/modules/mapping/code/areas/space.dm b/modular_skyrat/modules/mapping/code/areas/space.dm index 6787c26289e..36947835045 100644 --- a/modular_skyrat/modules/mapping/code/areas/space.dm +++ b/modular_skyrat/modules/mapping/code/areas/space.dm @@ -147,30 +147,37 @@ /area/ruin/space/has_grav/port_tarkon name = "P-T Cryo-Storage" + icon = 'icons/area/areas_station.dmi' + icon_state = "cryo" /area/ruin/space/has_grav/port_tarkon/afthall name = "P-T Aft Hallway" + icon_state = "afthall" /area/ruin/space/has_grav/port_tarkon/forehall name = "P-T Fore Hallway" + icon_state = "forehall" /area/ruin/space/has_grav/port_tarkon/starboardhall name = "P-T Starboard Hallway" + icon_state = "starboardhall" /area/ruin/space/has_grav/port_tarkon/porthall name = "P-T Port Hallway" + icon_state = "porthall" /area/ruin/space/has_grav/port_tarkon/trauma name = "P-T Trauma Center" - icon_state = "medbay1" + icon_state = "med_central" /area/ruin/space/has_grav/port_tarkon/developement name = "P-T Developement Center" - icon_state = "research" + icon_state = "science" + area_flags = XENOBIOLOGY_COMPATIBLE | UNIQUE_AREA /area/ruin/space/has_grav/port_tarkon/comms name = "P-T Communication Center" - icon_state = "captain" + icon_state = "command" /area/ruin/space/has_grav/port_tarkon/power1 name = "P-T Solar Control" @@ -178,7 +185,7 @@ /area/ruin/space/has_grav/port_tarkon/centerhall name = "P-T Central Hallway" - icon_state = "hallC" + icon_state = "centralhall" /area/ruin/space/has_grav/port_tarkon/secoff name = "P-T Security Office" @@ -186,7 +193,7 @@ /area/ruin/space/has_grav/port_tarkon/atmos name = "P-T Atmospheric Center" - icon_state = "engine" + icon_state = "atmos" /area/ruin/space/has_grav/port_tarkon/kitchen name = "P-T Kitchen" @@ -198,15 +205,15 @@ /area/ruin/space/has_grav/port_tarkon/cargo name = "P-T Cargo Center" - icon_state = "cargo" + icon_state = "cargo_office" /area/ruin/space/has_grav/port_tarkon/mining name = "P-T Mining Office" - icon_state = "cargo" + icon_state = "mining_dock" /area/ruin/space/has_grav/port_tarkon/storage name = "P-T Warehouse" - icon_state = "cargo" + icon_state = "cargo_warehouse" /area/ruin/space/has_grav/port_tarkon/toolstorage name = "P-T Tool Storage" @@ -218,11 +225,11 @@ /area/ruin/space/has_grav/port_tarkon/dorms name = "P-T Dorms" - icon_state = "crew_quarters" + icon_state = "dorms" /area/solars/tarkon name = "\improper P-T Solar Array" - icon_state = "solarsS" + icon_state = "space_near" has_gravity = STANDARD_GRAVITY // Cargodise Lost Freighter diff --git a/modular_skyrat/modules/mapping/code/fluff.dm b/modular_skyrat/modules/mapping/code/fluff.dm index 5edba8228c0..32bd48b7b30 100644 --- a/modular_skyrat/modules/mapping/code/fluff.dm +++ b/modular_skyrat/modules/mapping/code/fluff.dm @@ -7,11 +7,6 @@ desc = "An ancient access card with the words \"Cutter's Pod\" printed on in big bold letters. It'll be a miracle if this still works." trim = /datum/id_trim/away/old/eng -/obj/item/card/id/away/tarkon - name = "Tarkon visitor's pass" - desc = "A dust-collected visitors pass, A small tagline reading \"Port Tarkon, The first step to Civilian Partnership in Space Homesteading\"." - trim = /datum/id_trim/away/tarkon - /* ----------------- Lore ----------------- */ //Tape subtype for adding ruin lore -- the variables below are the ones you need to change /obj/item/tape/ruins @@ -85,147 +80,6 @@ 8 = 380 ) -/obj/item/tape/ruins/tarkon //A passing message from the late officer. - name = "dusty tape" - icon_state = "tape_greyscale" - desc = "An old, dusty tape with a small, faded stamp, reading \"An officer's final order.\"... Should definitely be flipped if not being read when played." - - used_capacity = 380 - storedinfo = list( - 1 = "The universal recorder says, \"Recording started.\"", - 2 = "Officer ??? sighs, \"Officer's Log, Year Twenty-five-... oh to hell with it...\"", - 3 = "Officer ??? says, \"I.. Did the best that i could for them... The crew... The ones that were awake, that is...\"", - 4 = "Officer ??? sighs, \"The ones that are still asleep... They had a chance... Those in the understorage are still safe... The RTG's were disconnected topside so they would survive...\"", - 5 = "Officer ??? sniffles, \"... Overseer Tavus... I... did what I could for them... Asked the crew to board the cargo shuttle... Leave the main shuttle if the sleepers activated...\"", - 6 = "Officer ??? groans, \"God... Those.. Things. Aliens... They got Tavus... Severed his leg clean off... Told him that.. We'd clean out the port... And he'd wake up in the trauma bay...\"", - 7 = "Officer ??? coughs then calmly states, \"... If.. Anyone wakes up... If the Ensign... Is alive... They're in charge now... The.. The Tarkon Drill's designs are... In the solars room, in a hidden floorsafe... The... The future of Tarkon Industries... Is in those designs...\"", - 8 = "The universal recorder says, \"Recording stopped.\"" - ) - timestamp = list( - 1 = 0, - 2 = 30, - 3 = 130, - 4 = 180, - 5 = 230, - 6 = 280, - 7 = 330, - 8 = 380 - ) - -/obj/item/tape/ruins/tarkon/safe //A tape recorded by the foreman. - icon_state = "tape_greyscale" - desc = "An old tape with a label, \"Exchange with the Science Leader\"... Should definitely be flipped if not being read when played." - - used_capacity = 380 - storedinfo = list( - 1 = "The universal recorder says, \"Recording started.\"", - 2 = "Foreman ??? sighs, \"Right... Scientist Arkus?\"", - 3 = "Scientist Arkus says, \"Ah, Foreman Verok... Come, We already got a spot chosen, a rather safe one to keep it..\"", - 4 = "Foreman Verok grumbles, \"... Wait, Right next to that egg... Thing?\"", - 5 = "Scientist Arkus pauses then says sharply, \"... Is there a problem? Its been dormant ever since we've been here, If it was going to come alive it would have done so while putting the tiling down. Besides... I got lunch to attend...\"", - 6 = "Foreman Verok groans, \"Right... Right I'll.. Get to work on it then... Just keep an ear out...\"", - 7 = "Foreman Verok grumbles, \"Right... Calm down, Verok... Place the floor safe, scoot the tile back in place... And afterwards grab some money from the one by the financing console under the table... I dont think Tavus will notice an extra few credits missing...\"", - 8 = "The universal recorder says, \"Recording stopped.\"" - ) - timestamp = list( - 1 = 0, - 2 = 30, - 3 = 130, - 4 = 180, - 5 = 230, - 6 = 280, - 7 = 330, - 8 = 380 - ) - -/obj/item/tape/ruins/tarkon/celebration //A tape recorded by the ensign during the mid-construction celebration. - icon_state = "tape_greyscale" - desc = "An old tape with a label, \"Celebrations were a mistake\", writen shakily in red pen.. Should definitely be flipped if not being read when played." - - used_capacity = 380 - storedinfo = list( - 1 = "The universal recorder says, \"Recording started.\"", - 2 = "Drinks can be heard clinking together, busy chatter of a party drowning out most noises", - 3 = "Ensign ??? says, \"Hey, HEY! Everyone! Shut up for a toast!\"", - 4 = "The boistrous cheering can be heard slowly calming down to an eerie silence.", - 5 = "Ensign ??? clears their throat then starts to announce, \"As you've all known.. Its been years since this project started... Bright minds and talented engineers hand in hand working on this project...\"", - 6 = "Ensign ??? says pointedly, \"And after five long years, Tarkon Industries has had its first success. The driver finding a suitable asteroid, And making its mark known by carving out the current docking bay for our transport.\"", - 7 = "Ensign ??? announces, \"Yesterday, We've worked, Toiled in the rock and sand of what is our new home... But today! We celebrate, For Tarkons first success, And for a bright future in the next century! The Twenty-Sixth century is looking bright for us!\"", - 8 = "The universal recorder says, \"Recording stopped.\"" - ) - timestamp = list( - 1 = 0, - 2 = 30, - 3 = 130, - 4 = 180, - 5 = 230, - 6 = 280, - 7 = 330, - 8 = 380 - ) - -/* ----------------- Fluff/Paper ----------------- */ - -/obj/item/paper/fluff/ruins/tarkon - name = "paper - 'Port Integrity Printout'" - default_raw_text = "*Warning, Integrity Compromised*

Automated Integrity Printout, If printout is inconsistent with results, Please recalibrate sensors.
  1. Aft Hallway: Integrity Nominal.
  2. Fore Hallway: Integrity Compromised. Cause unknown.
  3. Port Hallway: Integrity Compromised, Breached into space.
  4. Starboard Hallway: Integrity Nominal.

Please inform any awake maintenance crew and standby for assistance." - -/obj/item/paper/fluff/ruins/tarkon/atmosincident - name = "paper - 'What in gods name did you do'" - default_raw_text = "WHAT IN THE FUCK DID YOU GUYS DO?

I go away on a material run with the miners, and the moment i re-entered the port, There's a loud bang and an air warning.

YOU WILL ALL GET YOUR ASSES TO THE STAFF HALL BEFORE ANY OF THIS GETS CLEANED UP." - -/obj/item/paper/fluff/ruins/tarkon/coupplans - name = "paper - 'Palm of our hands...'" - default_raw_text = "It seems the plan went acordingly, Arkus. Specialist Karleigh took the prototype plates as a reassurance we'll get her a suit, and just like a fish, the bug was excellent bait.

They were talking about a safe somewhere in security, now we just need to get those... \"Special\" shells to her and watch her shotgun turn into a pipebomb. Rest of security will be in a panic, all we'll need to do is convince the foreman to play along, and i'm sure this welder will do nicely." - -/obj/item/paper/fluff/ruins/tarkon/designdoc - name = "paper - 'Port Tarkon Design Instructions'" - default_raw_text = "Hello, great engineers and builders!

Just so we're all clear, Everyone within Tarkon's Premises that is labeled as an Engineer is to read and understand these design notes.

- A red delivery marking is to denote the location of a new door for a room.
- A blue delivery marking is to denote the location of a Firelock (We dont want an incident with the turbine to go port-wide...)
- A white delivery marking is to denote a new sectioning wall/window.
A yellow delivery marking is to denote a temporary firelock line to allow expansion.

I hope that our most talented hands will not fail us." - -/obj/item/paper/fluff/ruins/tarkon/transmission //hints towards update 2.0 - name = "paper - 'Transmission Received...'" - default_raw_text = "

Transmission Received


Transmitter: Tarkon Headquarters.
Date: 11/7/2501.

Message Received:


We regret to inform you that our current investment in the Tarkon Driver has been notably risen with the reported state. We have sent a Specialist to come deal with the situation, And that any and all living employees of Tarkon Industries are advised to do their best to fight back any current infestations to the best of their abilities. If and upon the specialist's arrival any crew members able to hold a gun are required to communicate and work with the specialist to their command. They outrank any surviving Ensigns and are to be treated as if my own commands.

Signed,

Security General Leith Hardston

" - -/obj/item/paper/fluff/ruins/tarkon/goals - name = "paper - 'Tarkon Industries'" - default_raw_text = "

Tarkon Industries Informative Guide



We at Tarkon Industries hope to create a long guided future for the average homesteader, creating a living space for the average spacer to settle down in, create future investments for traders, or even up to get people to make large communities among asteroid belts.

Our greatest engineers have been working day, night, morning and evenings to create a stable, structurally sound system to start implanting stations, living areas and ports upon asteroids and planetoids too small to sustain life on the same level that of a goldie-lock planet.

Having great pride in our heritage we have taken our industrious, communicative past to create a future for our kin, Inspiring better feats, further research and larger projects upon future generations.

Looking to help? Then you can visit us at the Tarkon Industries Headquarters, The active co-ordinants can be detected starting around the Orion Belt, and we are actively accepting bright minds and great workers to help us.


Tarkon Industries: Building the future, nail by nail, asteroid by asteroid. 2456-2500(c)" - -/obj/item/paper/fluff/ruins/tarkon/vaulter - name = "paper - 'Tarkon Vaulter'" - default_raw_text = "

Tarkon Industries Designs:


Tarkon Vaulter Prototype



Designed HEAVILY after the Driver, The vaulter is of a similar concept, but at a much larger scale. Designed to work on larger planetoids and even moon and similar planetary satellites, The Tarkon Vaulter is another step towards Space Homesteading. Where the Driver and Vaulter split, however, is where the construction system lies. With the Vaulter, The construction is much more vertical in construction, starting by usually creating a cavern underneath its landing where a main room is constructed, and shortly after an elevator is deployed.

Where the Driver relies on early construction of an additional power system, The vaulter is planned to have a much higher RTG count so that it may power the initial base construction, But the cost of which being making it much larger and with a much higher material storage needed so it can construct a decent area of operation on its first trip. With the Driver in its early testing phase, We are hoping to better tune its designs before shifting attention towards the driver, which have high hopes to enter testing in the early twenty-sixth century" - -/obj/item/paper/fluff/ruins/tarkon/driverpitch - name = "paper - 'Tarkon Driver'" - default_raw_text = "

Tarkon Industries Designs:


Tarkon Driver Prototype



Seeing the success of space-based mining, We at Tarkon Industries wish to expand on the thought of a drill to a much larger goal, By mounting a drill and several cams to secur it in place, The Driver is designed to implant itself within the side of a large asteroid or small planetoid, Drilling out an area before the drill can be expanded out and slowly recycled to start construction of an operation base.

With the first area dug the first priority should be an additional energy-producing area, or a portable generator to help fuel energy for future mining, Which should be done to slowly hollow out the planetoid and constructing walls, floors and ceilings. After the driver is properly cammed in place, the back part of it can be unhitched, allowing it to act as a ferry shuttle for materials, workforce or tools.

With our first Tarkon Driver being ready to test in 2479, We have found a suitable asteroid, and hope to make connection to it by the start of 2480." - -/obj/item/paper/fluff/ruins/tarkon/detain - name = "paper - 'Tarkon Detainment Record'" - default_raw_text = "

Tarkon Industries Detainment Record:



Detainee:Arcus Vilkov
Rank/Occupation:Junior Scientist
Reason: Attemptive sabotage of a working generator

Detainee:Tilber Sinns
Rank/Occupation:Apprentice Miner
Reason:Detonated a volatile rock cluster close to a wall, Causing 3 hours of reconstruction.

Detainee:Gearalt Antonov
Rank/Occupation:Engineer Specialist
Reason:Public Intoxication

Detainee:Minke Arntz
Rank/Occupation:Field Researcher
Reason:Deconstructed an M6 to study the effects of space dust on ballistic firearms.

Detainee:Renanta McCrory
Rank/Occupation:Medical Surgeon
Reason:Medical Malpractice, Swapped the thumbs of a patient with their big toes. Removed from Premises." - -/obj/item/paper/fluff/ruins/tarkon/defcon5 - name = "paper - 'Tarkon Defcon Alert'" - default_raw_text = "

Tarkon Defcon Level: 5



Seems everyone partied too hard


Company Automated reminder to clean up and get back to work. You aint gonna earn a dime if you dont work on company time." - -/obj/item/paper/fluff/ruins/tarkon/defcon4 - name = "paper - 'Tarkon Defcon Alert'" - default_raw_text = "

Tarkon Defcon Level: 4



Everthing alright there?


Port has been struck by a rather large meteor from the port side. Be careful of any local carp population, they tend to make dens everywhere they can." - -/obj/item/paper/fluff/ruins/tarkon/defcon3 - name = "paper - 'Tarkon Defcon Alert'" - default_raw_text = "

Tarkon Defcon Level: 3



Signals been dead, Automated response sent


The port has seem to gained some new residents... and not friendly ones. Do your best to survive, Reclaimers are being geared up to be sent if the GPS goes out" - -/obj/item/paper/fluff/ruins/tarkon/defcon2 - name = "paper - 'Tarkon Defcon Alert'" - default_raw_text = "

Tarkon Defcon Level: 2



T#E V3IL H@S B3EN BR0K#N


$IGN@L L0ST. #OP3 LOST. N0 O%E 1S COM1NG." - -/obj/item/paper/crumpled/fluff/tarkon - name = "Crumpled note" - default_raw_text = "Look, i dont know where the fuck that suit was found, but i have a hard time believing it was made by him entirely. I already know his less than ethical obtainment methods, But that piece of tech? Its a blasted shame he's just using it for hauling crates..." - -/obj/item/paper/crumpled/fluff/tarkon/prisoner - name = "Blood-scrawled note" - default_raw_text = "I can hear th em crawling i n the ro ck
The his sing the scra tch ing


th ey c o m e
" - /* ----------------- Fluff/Decor ----------------- */ /obj/structure/decorative/fluff/ai_node //Budding AI's way of interfacing with stuff it couldn't normally do so with. Needed to be placed by a willing human, before borgs were created. Used in any ruins regarding pre-bluespace, self-aware AIs icon = 'modular_skyrat/modules/mapping/icons/obj/fluff.dmi' diff --git a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm index 4626eb19a19..abc511941ef 100644 --- a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm +++ b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/command.dm @@ -23,7 +23,7 @@ /obj/structure/closet/secure_closet/interdynefob/sa_locker/PopulateContents() ..() - new /obj/item/ammo_box/magazine/m9mm_aps(src) + new /obj/item/storage/toolbox/guncase/skyrat/pistol/aps(src) new /obj/item/storage/bag/garment/station_admiral(src) new /obj/item/radio/headset/interdyne/command(src) @@ -67,6 +67,7 @@ new /obj/item/gun/energy/disabler(src) new /obj/item/storage/bag/garment/master_arms(src) new /obj/item/radio/headset/interdyne(src) + new /obj/item/storage/toolbox/guncase/skyrat/c20r(src) /obj/structure/closet/secure_closet/interdynefob/cl_locker icon_door = "hop" diff --git a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm index 82eb8a85314..bf81406992f 100644 --- a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm +++ b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/security.dm @@ -33,7 +33,7 @@ ..() new /obj/item/storage/belt/security/full(src) - new /obj/item/gun/energy/disabler(src) + new /obj/item/gun/energy/e_gun(src) new /obj/item/storage/bag/garment/brig_officer(src) new /obj/item/radio/headset/interdyne(src) diff --git a/modular_skyrat/modules/mapping/code/misc.dm b/modular_skyrat/modules/mapping/code/misc.dm index 098cc9ddb7a..206d0c934f2 100644 --- a/modular_skyrat/modules/mapping/code/misc.dm +++ b/modular_skyrat/modules/mapping/code/misc.dm @@ -7,32 +7,6 @@ icon_state = "luna" inhand_icon_state = "luna" -/datum/mod_theme/prototype/hauler - name = "Prototype: Hauler" - desc = "Bulky and quite heavy, This prototype modular suit has seemed to be modified quite a bit with additional supports to distribute its weight. The servos there within have been modified to handle the additional stress, but the loose wiring required an internal lining of rubberized insulation" - inbuilt_modules = list() - charge_drain = DEFAULT_CHARGE_DRAIN * 3 - siemens_coefficient = 0 - slowdown_active = 1 - -/obj/item/mod/control/pre_equipped/prototype/hauler - theme = /datum/mod_theme/prototype/hauler - req_access = list(ACCESS_TARKON) - applied_cell = /obj/item/stock_parts/cell/high - applied_modules = list( - /obj/item/mod/module/storage/large_capacity, - /obj/item/mod/module/welding, - /obj/item/mod/module/clamp, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/tether, - ) - -/obj/machinery/suit_storage_unit/industrial/hauler - mod_type = /obj/item/mod/control/pre_equipped/prototype/hauler - -/obj/item/areaeditor/blueprints/tarkon - desc = "Blueprints of the Tarkon surface breaching drill and several Tarkon base designs. Red, stamped text reads \"Confidential\" on the backside of it." - name = "Tarkon Design Prints" /obj/item/mod/module/armor_booster/retractplates name = "MOD retractive plates module" diff --git a/modular_skyrat/modules/mapping/code/mob_spawns.dm b/modular_skyrat/modules/mapping/code/mob_spawns.dm index f0290e7e994..4db0689b3ad 100644 --- a/modular_skyrat/modules/mapping/code/mob_spawns.dm +++ b/modular_skyrat/modules/mapping/code/mob_spawns.dm @@ -194,6 +194,7 @@ /obj/item/knife/combat/survival = 1, /obj/item/t_scanner/adv_mining_scanner/lesser = 1, /obj/item/gun/energy/recharge/kinetic_accelerator = 1, + /obj/item/storage/toolbox/guncase/skyrat/pistol = 1, ) id_trim = /datum/id_trim/syndicom/skyrat/ds2/miner l_pocket = /obj/item/card/mining_point_card @@ -214,11 +215,13 @@ head = /obj/item/clothing/head/soft/sec/syndicate backpack_contents = list( /obj/item/storage/box/survival = 1, + /obj/item/storage/box/syndie_kit/space_suit = 1, ) id_trim = /datum/id_trim/syndicom/skyrat/ds2/enginetechnician glasses = /obj/item/clothing/glasses/welding/up belt = /obj/item/storage/belt/utility/syndicate gloves = /obj/item/clothing/gloves/combat + r_pocket = /obj/item/gun/energy/e_gun/mini /datum/outfit/ds2/syndicate/researcher name = "DS-2 Researcher" @@ -228,6 +231,7 @@ glasses = /obj/item/clothing/glasses/sunglasses/chemical gloves = /obj/item/clothing/gloves/color/black back = /obj/item/storage/backpack/satchel + r_pocket = /obj/item/gun/energy/e_gun/mini /datum/outfit/ds2/syndicate/stationmed name = "DS-2 Medical Officer" @@ -241,6 +245,7 @@ /obj/item/storage/box/survival = 1, /obj/item/crowbar = 1, /obj/item/storage/medkit/surgery = 1, + /obj/item/gun/syringe/rapidsyringe = 1, ) /datum/outfit/ds2/syndicate/brigoff @@ -284,6 +289,7 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses/redsec back = /obj/item/storage/backpack/satchel/sec/redsec head = /obj/item/clothing/head/hats/hos/beret/syndicate + l_pocket = /obj/item/gun/energy/e_gun/mini r_pocket = /obj/item/flashlight/seclite implants = list( /obj/item/implant/weapons_auth, @@ -297,13 +303,14 @@ shoes = /obj/item/clothing/shoes/laceup back = /obj/item/storage/backpack/satchel id_trim = /datum/id_trim/syndicom/skyrat/ds2/corporateliasion + belt = /obj/item/gun/energy/e_gun /datum/outfit/ds2/syndicate_command/admiral name = "DS-2 Admiral" uniform = /obj/item/clothing/under/rank/captain/skyrat/utility/syndicate suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate back = /obj/item/storage/backpack/satchel - belt = /obj/item/gun/ballistic/automatic/pistol/aps + belt = /obj/item/storage/belt/sabre head = /obj/item/clothing/head/hats/hos/cap/syndicate id = /obj/item/card/id/advanced/gold/generic id_trim = /datum/id_trim/syndicom/skyrat/ds2/stationadmiral @@ -454,128 +461,13 @@ handlebank(crewman) return ..() -//Port Tarkon, 6 people trapped in a revamped charlie-station like ghost role. Survive the aliens and threats, Fix the port and/or finish construction -/obj/effect/mob_spawn/ghost_role/human/tarkon - name = "P-T Abandoned Crew" - prompt_name = "an abandoned cargo member" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - you_are_text = "You are an abandoned member of Port Tarkon, an attempt to create steady living vaults within large asteroids. You have no real idea who Interdyne is, And your last recollection of NT is the producer of some... Less than ethically obtained goods on the port." - flavour_text = "Something went wrong. Morality of experiments went awry, expansions were made before scans were fully done and now you have to deal with the aftermath of your past crews exodus. Bring P-T to the success it was ment to be, or die trying. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" - important_text = "DO NOT abandon the port, PERIOD, but using the ship to buy more items or get help is good, if not ideal. Do not trade special equipment to the station. Unwelcomed and uninvited guests are not obligated to your kindness." - outfit = /datum/outfit/tarkon - spawner_job_path = /datum/job/tarkon - loadout_enabled = TRUE - quirks_enabled = TRUE - random_appearance = FALSE - computer_area = /area/ruin/space/has_grav/port_tarkon/centerhall - -/datum/outfit/tarkon - name = "default port tarkon outfit" - uniform = /obj/item/clothing/under/rank/cargo/tech/skyrat/utility - back = /obj/item/storage/backpack - shoes = /obj/item/clothing/shoes/winterboots - gloves = /obj/item/clothing/gloves/fingerless - glasses = /obj/item/clothing/glasses/sunglasses - id = /obj/item/card/id/away/tarkon/cargo - l_pocket = /obj/item/card/mining_point_card - r_pocket = /obj/item/mining_voucher - ears = /obj/item/radio/headset/tarkon - -/datum/outfit/tarkon/post_equip(mob/living/carbon/human/tarkon, visualsOnly = FALSE) - var/obj/item/card/id/id_card = tarkon.wear_id - if(istype(id_card)) - id_card.registered_name = tarkon.real_name - id_card.update_label() - id_card.update_icon() - var/obj/item/radio/target_radio = tarkon.ears - target_radio.set_frequency(FREQ_TARKON) - target_radio.recalculateChannels() - - handlebank(tarkon) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/tarkon/sci - prompt_name = "an abandoned scientist" - outfit = /datum/outfit/tarkon/sci - -/datum/outfit/tarkon/sci - name = "Port Tarkon Science Outfit" - uniform = /obj/item/clothing/under/rank/rnd/scientist/skyrat/utility - glasses = /obj/item/clothing/glasses/hud/diagnostic - id = /obj/item/card/id/away/tarkon/sci - l_hand = /obj/item/inducer - l_pocket = null - r_pocket = /obj/item/stock_parts/cell/high - -/obj/effect/mob_spawn/ghost_role/human/tarkon/med - prompt_name = "an abandoned medical resident" - outfit = /datum/outfit/tarkon/med - -/datum/outfit/tarkon/med - name = "Port Tarkon Medical Outfit" - uniform = /obj/item/clothing/under/rank/medical/doctor/skyrat/utility - glasses = /obj/item/clothing/glasses/hud/health - id = /obj/item/card/id/away/tarkon/med - neck = /obj/item/clothing/neck/stethoscope - l_pocket = /obj/item/healthanalyzer - r_pocket = /obj/item/stack/medical/suture/medicated - -/obj/effect/mob_spawn/ghost_role/human/tarkon/engi - prompt_name = "an abandoned maintenance engineer" - outfit = /datum/outfit/tarkon/engi - -/datum/outfit/tarkon/engi - name = "Port Tarkon Engineering Outfit" - uniform = /obj/item/clothing/under/rank/engineering/engineer/skyrat/utility - glasses = /obj/item/clothing/glasses/meson/engine/tray - id = /obj/item/card/id/away/tarkon/engi - gloves = /obj/item/clothing/gloves/combat - l_pocket = /obj/item/tank/internals/emergency_oxygen/engi - r_pocket = /obj/item/stack/cable_coil - -/obj/effect/mob_spawn/ghost_role/human/tarkon/sec - prompt_name = "an abandoned security deputy" - outfit = /datum/outfit/tarkon/sec - -/datum/outfit/tarkon/sec - name = "Port Tarkon Security Outfit" - uniform = /obj/item/clothing/under/rank/security/skyrat/utility/redsec - glasses = /obj/item/clothing/glasses/hud/security/redsec - gloves = /obj/item/clothing/gloves/tackler/combat - id = /obj/item/card/id/away/tarkon/sec - l_pocket = /obj/item/melee/baton/telescopic - r_pocket = /obj/item/grenade/barrier - skillchips = list(/obj/item/skillchip/chameleon/reload) - -/obj/effect/mob_spawn/ghost_role/human/tarkon/ensign - name = "P-T Abandoned Ensign" - prompt_name = "an abandoned ensign" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper-o" - you_are_text = "You were tasked by Tarkon Industries to Port Tarkon as a low-level command member, Holding no actual command, but as just another scapegoat to blame should it failed... And failed it did. Scan were never done when the overseer commanded construction, and you were left, forever branded with a task not possible for you" - flavour_text = "The rest of command bailed, and left as nothing more than a glorified assistant, you are held responsible should you be unable to wrangle what hopes of success Headquarters has. Find the blueprints and keep them close, Lest looters and raiders plan to seize what isn't theirs. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" - important_text = "People aren't obligated to listen to you, and you are, otherwise, just another body with some remnant of control. Make sure important items aren't traded and do your best to survive in the hellscape left for you. Unwelcomed and uninvited guests are not obligated to your kindness." - outfit = /datum/outfit/tarkon/ensign - spawner_job_path = /datum/job/tarkon - -/datum/outfit/tarkon/ensign //jack of all trades, master of none, spent all his credits, every last one - name = "Port Tarkon Ensigns Outfit" - uniform = /obj/item/clothing/under/misc/skyrat/utility - ears = /obj/item/radio/headset/tarkon/ensign - id = /obj/item/card/id/away/tarkon/ensign - neck = /obj/item/clothing/neck/security_cape/armplate - gloves = /obj/item/clothing/gloves/combat - l_pocket = null - r_pocket = null - skillchips = list(/obj/item/skillchip/chameleon/reload) /datum/outfit/proc/handlebank(mob/living/carbon/human/owner) var/datum/bank_account/offstation_bank_account = new(owner.real_name) owner.account_id = offstation_bank_account.account_id offstation_bank_account.replaceable = FALSE - offstation_bank_account.account_job = new /datum/job/ghost_role //note to self: Replace later + offstation_bank_account.account_job = new /datum/job/ghost_role owner.add_mob_memory(/datum/memory/key/account, remembered_id = owner.account_id) if(owner.wear_id) var/obj/item/card/id/id_card = owner.wear_id @@ -591,16 +483,6 @@ desc = "The headset of the boss." command = TRUE -/obj/item/radio/headset/tarkon - name = "tarkon headset" - freerange = TRUE - freqlock = TRUE - keyslot = new /obj/item/encryptionkey/headset_cargo/tarkon - -/obj/item/radio/headset/tarkon/ensign //spoiler for upcoming update - name = "tarkon ensign headset" - desc = "A headset personally handed to trusted crew of Tarkon. It fills you with will to do... Something." - command = TRUE //OBJECTS// /obj/structure/showcase/machinery/oldpod/used @@ -653,59 +535,6 @@ /datum/id_trim/away/hotel/security assignment = "Hotel Security" -/datum/id_trim/away/tarkon - assignment = "P-T Cargo Personnel" - access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) - -/datum/id_trim/away/tarkon/sec - assignment = "P-T Port Guard" - access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) - -/datum/id_trim/away/tarkon/med - assignment = "P-T Trauma Medic" - access = list(ACCESS_MEDICAL, ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) - -/datum/id_trim/away/tarkon/eng - assignment = "P-T Maintenance Crew" - -/datum/id_trim/away/tarkon/sci - assignment = "P-T Field Researcher" - access = list(ACCESS_ROBOTICS, ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) - -/datum/id_trim/away/tarkon/ensign - assignment = "Tarkon Ensign" - access = list(ACCESS_MEDICAL, ACCESS_ROBOTICS, ACCESS_AWAY_GENERAL, ACCESS_TARKON, ACCESS_WEAPONS) - -/obj/item/card/id/away/tarkon/sci //original tarkon ID is defined in fluff - name = "P-T field researcher's access card" - desc = "An access card designated for \"the science team\". You are forgotten basically immediately when it comes to the lab." - trim = /datum/id_trim/away/tarkon/sci - -/obj/item/card/id/away/tarkon/med - name = "P-T trauma medic's access card" - desc = "An access card designated for \"medical staff\". You provide the medic bags." - trim = /datum/id_trim/away/tarkon/med - -/obj/item/card/id/away/tarkon/sec - name = "P-T resident deputy's access card" - desc = "An access card designated for \"security members\". Everyone wants your guns, partner. Yee-haw." - trim = /datum/id_trim/away/tarkon/sec - -/obj/item/card/id/away/tarkon/cargo - name = "P-T cargo hauler's access card" - desc = "An access card designated for \"cargo's finest\". You're also a part time space miner, when cargonia is quiet." - trim = /datum/id_trim/away/tarkon - - -/obj/item/card/id/away/tarkon/engi - name = "P-T maintenance engineer's access card" - desc = "An access card designated for \"engineering staff\". You're going to be the one everyone points at to fix stuff, lets be honest." - trim = /datum/id_trim/away/tarkon/eng - -/obj/item/card/id/away/tarkon/ensign - name = "Tarkon ensign's access card" - desc = "An access card designated for \"Tarkon ensign\". No one has to listen to you... But you're the closest there is for command around here." - trim = /datum/id_trim/away/tarkon/ensign //CRYO CONSOLES /obj/machinery/computer/cryopod/interdyne @@ -715,9 +544,3 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/interdyne, 32) -/obj/machinery/computer/cryopod/tarkon - radio = /obj/item/radio/headset/tarkon - announcement_channel = RADIO_CHANNEL_TARKON - req_one_access = list("tarkon") - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) diff --git a/modular_skyrat/modules/mapping/code/shuttles.dm b/modular_skyrat/modules/mapping/code/shuttles.dm index 1b214fac609..d50ae38bc5c 100644 --- a/modular_skyrat/modules/mapping/code/shuttles.dm +++ b/modular_skyrat/modules/mapping/code/shuttles.dm @@ -160,7 +160,7 @@ /*----- Tarkon Shuttle Datum + related code -----*/ /datum/map_template/shuttle/ruin/tarkon_driver prefix = "_maps/shuttles/skyrat/" - suffix = "tarkon_driverdc54" + suffix = "tarkon_driver" name = "Tarkon Drill Driver" /obj/machinery/computer/shuttle/tarkon_driver @@ -183,9 +183,4 @@ name = "Tarkon Driver Control Console (Computer Board)" build_path = /obj/machinery/computer/shuttle/tarkon_driver -/datum/map_template/shuttle/ruin/tarkon_driver/defcon3 - suffix = "tarkon_driverdc3" - -/datum/map_template/shuttle/ruin/tarkon_driver/defcon2 - suffix = "tarkon_driverdc2" /*----- End of Tarkon Shuttle Code -----*/ diff --git a/modular_skyrat/modules/maturity-prompt/code/client.dm b/modular_skyrat/modules/maturity-prompt/code/client.dm new file mode 100644 index 00000000000..002a22d38e4 --- /dev/null +++ b/modular_skyrat/modules/maturity-prompt/code/client.dm @@ -0,0 +1,2 @@ +/client + var/maturity_prompt_whitelist = FALSE diff --git a/modular_skyrat/modules/maturity-prompt/code/config_entries.dm b/modular_skyrat/modules/maturity-prompt/code/config_entries.dm new file mode 100644 index 00000000000..8c106295183 --- /dev/null +++ b/modular_skyrat/modules/maturity-prompt/code/config_entries.dm @@ -0,0 +1 @@ +/datum/config_entry/flag/age_prompt_system diff --git a/modular_skyrat/modules/maturity-prompt/code/maturity_prompt.dm b/modular_skyrat/modules/maturity-prompt/code/maturity_prompt.dm new file mode 100644 index 00000000000..63c3a12603c --- /dev/null +++ b/modular_skyrat/modules/maturity-prompt/code/maturity_prompt.dm @@ -0,0 +1,72 @@ + + +/datum/maturity_prompt + /// Year of birth listed by the user + var/year + /// Month of birth listed by the user + var/month + /// Day of birth listed by the user + var/day + + /// The time at which the tgui_alert was created, for displaying timeout progress. + var/start_time + /// The lifespan of the tgui_alert, after which the window will close and delete itself. + var/timeout + /// Boolean field describing if the tgui_alert was closed by the user. + var/closed + /// The TGUI UI state that will be returned in ui_state(). Default: always_state + var/datum/ui_state/state + +/datum/maturity_prompt/New(mob/user, timeout, ui_state) + src.state = ui_state + src.timeout = timeout + start_time = world.time + QDEL_IN(src, timeout) + +/datum/maturity_prompt/Destroy(force) + SStgui.close_uis(src) + state = null + return ..() + +/datum/maturity_prompt/proc/wait() + while (!closed && !QDELETED(src)) + stoplag(1) + +/datum/maturity_prompt/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MaturityPrompt") + ui.open() + +/datum/maturity_prompt/ui_close(mob/user) + . = ..() + closed = TRUE + +/datum/maturity_prompt/ui_state(mob/user) + return state + +/datum/maturity_prompt/ui_static_data(mob/user) + var/list/data = list() + return data + +/datum/maturity_prompt/ui_data(mob/user) + var/list/data = list() + data["current_year"] = SSmaturity_guard.current_year ? SSmaturity_guard.current_year : 2020 + data["current_month"] = SSmaturity_guard.current_month ? SSmaturity_guard.current_month : 1 + data["current_day"] = SSmaturity_guard.current_day ? SSmaturity_guard.current_day : 1 + + if(timeout) + data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + return data + +/datum/maturity_prompt/ui_act(action, list/params) + . = ..() + if (.) + return + if(action == "submit") + day = params["day"] + month = params["month"] + year = params["year"] + closed = TRUE + SStgui.close_uis(src) + return TRUE diff --git a/modular_skyrat/modules/maturity-prompt/code/maturity_subsystem.dm b/modular_skyrat/modules/maturity-prompt/code/maturity_subsystem.dm new file mode 100644 index 00000000000..7aff5de5aca --- /dev/null +++ b/modular_skyrat/modules/maturity-prompt/code/maturity_subsystem.dm @@ -0,0 +1,267 @@ +// Might as well go and group it up into a subsystem. + +// Y'know, on a downstream you can go ahead and set it to whatever the fuck you want +#define AGE_TO_PLAY 18 + +#define AGE_CHECK_INVALID 0 +#define AGE_CHECK_UNDERAGE 1 +#define AGE_CHECK_PASSED 2 + +SUBSYSTEM_DEF(maturity_guard) + name = "Maturity guard" + flags = SS_NO_FIRE + init_order = INIT_ORDER_MATURITY_GUARD + /// A list of currently active prompts. + var/list/prompt_cache = list() + /// A list of players that failed the age check this round. Stopgap only used if we don't have a db attached to ban people. + var/list/blacklisted_cache = list() + + /// Current year, stored on the subsystem init + var/current_year + /// Current month of the year, stored on the subsystem init + var/current_month + /// Current day of the month, stored on the subsystem init + var/current_day + + +/datum/controller/subsystem/maturity_guard/Initialize() + var/current_time = world.realtime + current_day = text2num(time2text(current_time, "DD")) + current_month = text2num(time2text(current_time, "MM")) + current_year = text2num(time2text(current_time, "YYYY")) + return SS_INIT_SUCCESS + +/** + * Checks if the player is declared of age. Prompts the player for DoB if necessary. + */ +/datum/controller/subsystem/maturity_guard/proc/age_check(mob/user) + // Well, if there's no checks meant to be made, everyone automatically passes. + if(!CONFIG_GET(flag/age_prompt_system)) + return TRUE + + if(!istype(user) || !user.ckey) + return FALSE + + if(!SSmaturity_guard.initialized) // To prevent false bans, we dont let people use the prompt until the subsystem is initialized. + return FALSE + + if(user.ckey in prompt_cache) + return FALSE + + if(!SSdbcore.Connect() && (user.ckey in blacklisted_cache)) + qdel(user.client) + return FALSE + + var/age_from_db = get_age_from_db(user) + if(age_from_db && validate_dob(age_from_db[1], age_from_db[2], simple_check=TRUE) == AGE_CHECK_PASSED) + user.client.maturity_prompt_whitelist = TRUE + return TRUE + + // Let's not hold up other procs + INVOKE_ASYNC(src, PROC_REF(age_prompt), user) + +/** + * Creates a prompt window for user's date of birth. + */ +/datum/controller/subsystem/maturity_guard/proc/age_prompt(mob/user) + if(IsAdminAdvancedProcCall()) + return FALSE + + if(!SSmaturity_guard.initialized) + return FALSE + + if(!user) + user = usr + + if(!istype(user)) + if(IS_CLIENT_OR_MOCK(user)) + var/client/client = user + user = client.mob + else + return FALSE + + if(isnull(user.client)) + return FALSE + + if(user.ckey in prompt_cache) + return FALSE + + var/user_ckey = user.ckey + + prompt_cache |= user_ckey + + var/datum/maturity_prompt/prompt = new(user, 60 SECONDS, GLOB.always_state) + prompt.ui_interact(user) + prompt.wait() + prompt_cache -= user_ckey + if(prompt) + . = list(prompt.year, prompt.month, prompt.day) + + var/check_result = validate_dob(prompt.year, prompt.month, prompt.day) + switch(check_result) + if(AGE_CHECK_INVALID) + to_chat_immediate(user, span_warning("Invalid information entered. Please try again.")) + if(AGE_CHECK_UNDERAGE) + create_underage_ban(user) + if(AGE_CHECK_PASSED) + add_age_to_db(user, prompt.year, prompt.month) + user.client.maturity_prompt_whitelist = TRUE + qdel(prompt) + + +/datum/controller/subsystem/maturity_guard/proc/get_age_from_db(mob/user) + if(IsAdminAdvancedProcCall()) + return FALSE + + if(!SSdbcore.Connect()) + return FALSE + + if(!istype(user) || !user.ckey) + return FALSE + + var/datum/db_query/query_age_from_db = SSdbcore.NewQuery( + "SELECT dob_year, dob_month FROM [format_table_name("player_dob")] WHERE ckey = :ckey", + list("ckey" = user.ckey), + ) + + if(!query_age_from_db.warn_execute()) + return FALSE + + // There should be only one, we're querying by the primary key; if it returns more than one row something is very wrong + var/result = query_age_from_db.NextRow() + if(result) + return query_age_from_db.item + return FALSE + + +/datum/controller/subsystem/maturity_guard/proc/add_age_to_db(mob/user, year, month) + if(IsAdminAdvancedProcCall()) + return FALSE + + if(!SSdbcore.Connect()) + return FALSE + + if(!istype(user) || !user.ckey) + return FALSE + + if(!isnum(year) || !isnum(month)) + return FALSE + + var/datum/db_query/add_age_to_db = SSdbcore.NewQuery( + "INSERT INTO [format_table_name("player_dob")] (ckey, dob_year, dob_month) VALUES(:ckey, :dob_year, :dob_month) \ + ON DUPLICATE KEY UPDATE dob_year = :dob_year, dob_month = :dob_month", + list("ckey" = user.ckey, "dob_year" = year, "dob_month" = month), + ) + + if(!add_age_to_db.warn_execute()) + return FALSE + + return TRUE + +// Logic inspired by S.P.L.U.R.T age_gate +// https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/blob/6e6bce87726b7a5ac7ebf23bec7b020a004c6e60/code/modules/mob/dead/new_player/new_player.dm +/datum/controller/subsystem/maturity_guard/proc/validate_dob(player_year, player_month, player_day, simple_check = FALSE) + //Rudimentary sanity check + if(player_year >= current_year || player_year <= 1900 || player_month < 1 || player_month > 12) + return AGE_CHECK_INVALID + + var/player_total_months = (player_year * 12) + player_month + var/current_total_months = (current_year * 12) + current_month + var/months_in_required_age = AGE_TO_PLAY * 12 + + var/month_difference = current_total_months - player_total_months + if(month_difference > months_in_required_age) + return AGE_CHECK_PASSED + + if(month_difference < months_in_required_age) + return AGE_CHECK_UNDERAGE + + // We're assuming the data we're operating on has already undergone a more rigorous check + if(simple_check) + return AGE_CHECK_PASSED + + //they could be 17 or 18 depending on the /day/ they were born in + var/days_in_months = list(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) + if((player_year % 4) == 0) // leap year so february actually has 29 days + days_in_months[2] = 29 + var/total_days_in_player_month = days_in_months[player_month] + + if(player_day < 1 || player_day > total_days_in_player_month) + return AGE_CHECK_INVALID + + if(player_day <= current_day) + //their birthday has passed + return AGE_CHECK_PASSED + else + //it has NOT been their 18th birthday yet + return AGE_CHECK_UNDERAGE + +// I hate this abomination +/// Because apparently there's no simple proc for applying bans and admin datums need an actual admin holding them +/datum/controller/subsystem/maturity_guard/proc/create_underage_ban(mob/user) + if(IsAdminAdvancedProcCall()) + return + + var/discord_appeal_text = "" + if(CONFIG_GET(string/discord_link)) + discord_appeal_text = "If you believe this to be a mistake, file an appeal in our community. 0) + if(!do_after(user, ((2 * process_speed SECONDS) * skill_modifier), target = src)) + return + + if(!user.Adjacent(src)) + return + + durability-- + user.apply_damage((4 * skill_modifier), STAMINA) + + if(durability <= 0) + convert_to_ore() + to_chat(user, span_notice("You finish working on \the [src], and it crumbles into ore.")) + playsound(src, 'sound/effects/rock_break.ogg', 50) + user.mind?.adjust_experience(/datum/skill/mining, MINING_SKILL_BOULDER_SIZE_XP * 0.5) + qdel(src) + return + + var/msg = (durability == 1 ? "is crumbling!" : "looks weaker!") + to_chat(user, span_notice("\The [src] [msg]")) + manual_process(weapon, user, override_speed_multiplier, continued = TRUE) diff --git a/modular_skyrat/modules/modular_implants/code/nif_research.dm b/modular_skyrat/modules/modular_implants/code/nif_research.dm index 4e88040cddf..3355a31e0ea 100644 --- a/modular_skyrat/modules/modular_implants/code/nif_research.dm +++ b/modular_skyrat/modules/modular_implants/code/nif_research.dm @@ -4,8 +4,14 @@ id = "nifsoft_remover" build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/nifsoft_remover - materials = list(/datum/material/iron = 200, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 5, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 5) - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SECURITY) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SECURITY, + ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY /datum/design/nifsoft_money_sense @@ -14,8 +20,14 @@ id = "nifsoft_money_sense" build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/disk/nifsoft_uploader/money_sense - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT) - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_CARGO) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_CARGO, + ) departmental_flags = DEPARTMENT_BITFLAG_CARGO /datum/design/soulcatcher_device @@ -24,8 +36,14 @@ id = "soulcatcher_device" build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/handheld_soulcatcher - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/silver = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT) - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL) // look, the anesthetic machine's there too + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, + ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE /datum/design/mini_soulcatcher @@ -34,14 +52,25 @@ id = "mini_soulcatcher" build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/attachable_soulcatcher - materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/iron = SMALL_MATERIAL_AMOUNT * 5) - category = list(RND_CATEGORY_AI + RND_SUBCATEGORY_AI_MISC) // look, the anesthetic machine's there too + materials = list( + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_AI + RND_SUBCATEGORY_AI_MISC, + ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_MEDICAL /datum/design/nifsoft_hud build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT) - category = list(RND_CATEGORY_EQUIPMENT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_EQUIPMENT, + ) /datum/design/nifsoft_hud/medical name = "Medical HUD NIFSoft" @@ -91,11 +120,13 @@ id = "nifsoft_hud_kit" build_type = PROTOLATHE | AWAY_LATHE departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SECURITY - category = list(RND_CATEGORY_EQUIPMENT) materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/plastic = SHEET_MATERIAL_AMOUNT, ) + category = list( + RND_CATEGORY_EQUIPMENT, + ) build_path = /obj/item/nif_hud_adapter diff --git a/modular_skyrat/modules/modular_items/code/designs.dm b/modular_skyrat/modules/modular_items/code/designs.dm index e811691e3b5..c8cd1e71514 100644 --- a/modular_skyrat/modules/modular_items/code/designs.dm +++ b/modular_skyrat/modules/modular_items/code/designs.dm @@ -7,10 +7,14 @@ desc = "A heads-up display that scans the humanoids in view and provides accurate data about their health status. This HUD has been fitted inside of a pair of sunglasses." id = "health_hud_aviator" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/aviator/health category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -19,10 +23,15 @@ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status. This HUD has been fitted inside of a pair of sunglasses." id = "security_hud_aviator" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2,) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/clothing/glasses/hud/ar/aviator/security category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY, ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY @@ -31,10 +40,14 @@ desc = "A heads-up display used to analyze and determine faults within robotic machinery. This HUD has been fitted inside of a pair of sunglasses." id = "diagnostic_hud_aviator" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/aviator/diagnostic category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -43,10 +56,14 @@ desc = "A heads-up display used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition. This HUD has been fitted inside of a pair of sunglasses." id = "meson_hud_aviator" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/aviator/meson category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING @@ -55,10 +72,14 @@ desc = "A pair of tacky purple aviator sunglasses that allow the wearer to recognize various chemical compounds with only a glance." id = "science_hud_aviator" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/aviator/science category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -67,10 +88,14 @@ desc = "A headset equipped with a scanning lens and mounted retinal projector. It doesn't provide any eye protection, but it's less obtrusive than goggles." id = "health_hud_projector" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/projector/health category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL @@ -79,10 +104,15 @@ desc = "A headset equipped with a scanning lens and mounted retinal projector. It doesn't provide any eye protection, but it's less obtrusive than goggles." id = "security_hud_projector" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2,) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/clothing/glasses/hud/ar/projector/security category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SECURITY, ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY @@ -91,10 +121,14 @@ desc = "A headset equipped with a scanning lens and mounted retinal projector. It doesn't provide any eye protection, but it's less obtrusive than goggles." id = "diagnostic_hud_projector" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/projector/diagnostic category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE @@ -103,10 +137,14 @@ desc = "A headset equipped with a scanning lens and mounted retinal projector. It doesn't provide any eye protection, but it's less obtrusive than goggles." id = "meson_hud_projector" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/projector/meson category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING, ) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING @@ -115,9 +153,13 @@ desc = "A headset equipped with a scanning lens and mounted retinal projector. It doesn't provide any eye protection, but it's less obtrusive than goggles." id = "science_hud_projector" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 8, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + ) build_path = /obj/item/clothing/glasses/hud/ar/projector/science category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_MEDICAL diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/camphor.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/camphor.dm index d5542ea5740..8ee5d31d059 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/camphor.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/camphor.dm @@ -84,7 +84,7 @@ // Notify the user that they're overdosing. Doesn't affect their mood. /datum/reagent/drug/aphrodisiac/camphor/overdose_start(mob/living/carbon/human/exposed_mob) to_chat(exposed_mob, span_userdanger("You feel like you took too much [name]!")) - exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/minor_overdose, name) + exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/minor_overdose, 1, name) /datum/chemical_reaction/camphor results = list(/datum/reagent/drug/aphrodisiac/camphor = 6) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/dopamine.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/dopamine.dm index 47d4a8d849b..9726170c5de 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/dopamine.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/dopamine.dm @@ -25,7 +25,7 @@ /datum/reagent/drug/aphrodisiac/dopamine/on_mob_add(mob/living/carbon/human/exposed_mob) if(!(exposed_mob.client?.prefs.read_preference(/datum/preference/toggle/erp/aphro))) return ..() - exposed_mob.add_mood_event("[type]_start", /datum/mood_event/orgasm, name) + exposed_mob.add_mood_event("[type]_start", /datum/mood_event/orgasm, 1, name) return ..() /datum/reagent/drug/aphrodisiac/dopamine/life_effects(mob/living/carbon/human/exposed_mob) @@ -36,7 +36,7 @@ /datum/reagent/drug/aphrodisiac/dopamine/overdose_start(mob/living/carbon/human/exposed_mob) . = ..() to_chat(exposed_mob, span_purple("You feel so happy!")) - exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/overgasm, name) + exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/overgasm, 1, name) /datum/reagent/drug/aphrodisiac/dopamine/overdose_effects(mob/living/carbon/human/exposed_mob) if(!(exposed_mob.get_timed_status_effect_duration(/datum/status_effect/hallucination) / (2 SECONDS) < volume && prob(20))) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/incubus_draft.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/incubus_draft.dm index 6b5f8ee4f57..e2dd1518258 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/incubus_draft.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/incubus_draft.dm @@ -87,13 +87,13 @@ if(exposed_mob.client?.prefs?.read_preference(/datum/preference/toggle/erp/penis_enlargement)) // Attempt to make new male genitals if applicable create_genitals(exposed_mob, suppress_chat, list(GENITAL_PENIS, GENITAL_TESTICLES)) - + // Make the balls bigger if they're small. grow_balls(exposed_mob, suppress_chat) - + // Separates gender change stuff from cock growth, breast shrinkage, and female genitalia removal change_gender(exposed_mob, MALE, suppress_chat) - + // Attempt genital shrinkage where applicable shrink_genitals(exposed_mob, suppress_chat, list(GENITAL_BREASTS, GENITAL_VAGINA, GENITAL_WOMB)) @@ -102,11 +102,11 @@ * * exposed_mob - the mob being affected by the reagent * genital - the genital that is causing the messages -*/ +*/ /datum/reagent/drug/aphrodisiac/incubus_draft/growth_to_chat(mob/living/carbon/human/exposed_mob, obj/item/organ/external/genital/mob_genital, suppress_chat = FALSE) if(!mob_genital) return - + if(istype(mob_genital, /obj/item/organ/external/genital/penis)) penis_growth_to_chat(exposed_mob, mob_genital) else if(istype(mob_genital, /obj/item/organ/external/genital/testicles)) @@ -118,12 +118,12 @@ * exposed_mob - the mob being affected by the reagent * mob_penis - the penis that is causing the message * NOTE: this function doesn't get called often enough to warrant suppressing chat, hence the var's omission -*/ +*/ /datum/reagent/drug/aphrodisiac/incubus_draft/proc/penis_growth_to_chat(mob/living/carbon/human/exposed_mob, obj/item/organ/external/genital/penis/mob_penis) if(!mob_penis) return - + if(mob_penis.visibility_preference == GENITAL_ALWAYS_SHOW || exposed_mob.is_bottomless()) if(mob_penis.genital_size >= (penis_max_length - 2)) if(exposed_mob.dna.features["penis_sheath"] == SHEATH_SLIT) @@ -142,13 +142,13 @@ to_chat(exposed_mob, span_purple("Your [pick(words_for_bigger_cock)] [pick(bigger_cock_text_list)] [pick(cock_action_text_list)]about [mob_penis.genital_size] inches long, and [mob_penis.girth] inches in circumference.")) else to_chat(exposed_mob, span_purple("Your [pick(cock_text_list)] [pick(cock_action_text_list)]about [mob_penis.genital_size] inches long, and [mob_penis.girth] inches in circumference.")) - + /** * Helper function for the helper function used to display the messages that appear in chat while the testicles growth is occurring * * exposed_mob - the mob being affected by the reagent * mob_testicles - the testicles that are causing the message -*/ +*/ /datum/reagent/drug/aphrodisiac/incubus_draft/proc/testicles_growth_to_chat(mob/living/carbon/human/exposed_mob, obj/item/organ/external/genital/testicles/mob_testicles, suppress_chat = FALSE) // So we don't spam chat @@ -157,17 +157,17 @@ if(!mob_testicles) return - + // Display a different message when they reach 'enormous' - if(mob_testicles.genital_size <= balls_big_size) - to_chat(exposed_mob, span_purple("Your balls [pick(ball_action_text_list)]. They are now [mob_testicles.balls_size_to_description(mob_testicles.genital_size)].")) + if(mob_testicles.genital_size <= balls_big_size) + to_chat(exposed_mob, span_purple("Your balls [pick(ball_action_text_list)]. They are now [mob_testicles.balls_size_to_description(mob_testicles.genital_size)].")) else if(mob_testicles.genital_size == balls_max_size) - to_chat(exposed_mob, span_purple("You can feel your heavy balls churn as they swell to enormous proportions!")) - + to_chat(exposed_mob, span_purple("You can feel your heavy balls churn as they swell to enormous proportions!")) + // Notify the user that they're overdosing. Doesn't affect their mood. /datum/reagent/drug/aphrodisiac/incubus_draft/overdose_start(mob/living/carbon/human/exposed_mob) to_chat(exposed_mob, span_userdanger("You feel like you took too much [name]!")) - exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/minor_overdose, name) + exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/minor_overdose, 1, name) /datum/chemical_reaction/incubus_draft results = list(/datum/reagent/drug/aphrodisiac/incubus_draft = 8) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/succubus_milk.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/succubus_milk.dm index 50dd2095f35..a9ee3349bb4 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/succubus_milk.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_chemistry/reagents/succubus_milk.dm @@ -154,7 +154,7 @@ // Notify the user that they're overdosing. Doesn't affect their mood. /datum/reagent/drug/aphrodisiac/succubus_milk/overdose_start(mob/living/carbon/human/exposed_mob) to_chat(exposed_mob, span_userdanger("You feel like you took too much [name]!")) - exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/minor_overdose, name) + exposed_mob.add_mood_event("[type]_overdose", /datum/mood_event/minor_overdose, 1, name) /datum/chemical_reaction/succubus_milk results = list(/datum/reagent/drug/aphrodisiac/succubus_milk = 8) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm index 6a8f8a37c58..913ed0470cb 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm @@ -314,7 +314,10 @@ unique_reskin = list("pink" = "filter_pink", "teal" = "filter_teal") w_class = WEIGHT_CLASS_SMALL - custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/plastic = SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + ) volume = 50 possible_transfer_amounts = list(1, 2, 3, 4, 5, 10, 25, 50) list_reagents = list(/datum/reagent/drug/aphrodisiac/crocin = 50) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm index 63ddfd330ba..6bbe0f729fc 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/shockcollar.dm @@ -10,7 +10,10 @@ w_class = WEIGHT_CLASS_SMALL strip_delay = 60 // equip_delay_other = 60 - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) var/random = TRUE var/freq_in_name = TRUE var/tagname = null @@ -20,8 +23,14 @@ id = "shockcollar" build_type = AUTOLATHE build_path = /obj/item/electropack/shockcollar - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT) - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MISC, + ) /obj/item/electropack/shockcollar/attack_hand(mob/user) if(loc == user && user.get_item_by_slot(ITEM_SLOT_NECK)) diff --git a/modular_skyrat/modules/modular_vending/code/autodrobe.dm b/modular_skyrat/modules/modular_vending/code/autodrobe.dm index f1bc8940cbb..7511a7c3913 100644 --- a/modular_skyrat/modules/modular_vending/code/autodrobe.dm +++ b/modular_skyrat/modules/modular_vending/code/autodrobe.dm @@ -30,6 +30,10 @@ /obj/item/clothing/under/costume/skyrat/yukata = 5, /obj/item/clothing/under/costume/skyrat/kimono = 5, /obj/item/clothing/head/beret/badge = 5, + /obj/item/clothing/mask/masquerade = 5, + /obj/item/clothing/mask/masquerade/two_colors = 5, + /obj/item/clothing/mask/masquerade/feathered = 5, + /obj/item/clothing/mask/masquerade/two_colors/feathered = 5, ), ), list( diff --git a/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm b/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm index 89695235d2b..d91a802fd84 100644 --- a/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm +++ b/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm @@ -6,9 +6,14 @@ name = ".310 Rubber Bullet (Less Lethal)" id = "astrilka310_rubber" build_type = AUTOLATHE - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/ammo_casing/strilka310/rubber - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) // 4.6x30mm - SMG round, used in the WT550 and in numerous modular guns as a weaker alternative to 9mm. @@ -16,17 +21,27 @@ name = "4.6x30mm Bullet" id = "c46x30mm" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, + ) build_path = /obj/item/ammo_casing/c46x30mm - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) /datum/design/c46x30mm_rubber name = "4.6x30mm Rubber Bullet" id = "c46x30mm_rubber" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5 + ) build_path = /obj/item/ammo_casing/c46x30mm/rubber - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) // .45 @@ -34,31 +49,51 @@ name = ".45 Bullet" id = "c45_lethal" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, + ) build_path = /obj/item/ammo_casing/c45 - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) /datum/design/c45_rubber name = ".45 Bouncy Rubber Ball" id = "c45_rubber" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, + ) build_path = /obj/item/ammo_casing/c45/rubber - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) // 10mm /datum/design/c10mm_lethal name = "10mm Bullet" id = "c10mm_lethal" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, + ) build_path = /obj/item/ammo_casing/c10mm - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) /datum/design/c10mm_rubber name = "10mm Rubber Bullet" id = "c10mm_rubber" build_type = AUTOLATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, + ) build_path = /obj/item/ammo_casing/c10mm/rubber - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm index b927e1cd38d..22070f7b9ca 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/grenade_launcher.dm @@ -1,7 +1,7 @@ // Low caliber grenade launcher (fun & games) /obj/item/gun/ballistic/automatic/sol_grenade_launcher - name = "\improper Carwo 'Kiboko' Grenade Launcher" + name = "\improper Kiboko Grenade Launcher" desc = "A unique grenade launcher firing .980 grenades. A laser sight system allows its user to specify a range for the grenades it fires to detonate at." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi' @@ -43,6 +43,10 @@ /obj/item/gun/ballistic/automatic/sol_grenade_launcher/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_CARWO) +/obj/item/gun/ballistic/automatic/sol_grenade_launcher/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/sol_grenade_launcher/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm index fbf5f38b6cf..f40fe03d45b 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/rifle.dm @@ -2,7 +2,7 @@ /obj/item/gun/ballistic/automatic/sol_rifle name = "\improper Carwo-Cawil Battle Rifle" - desc = "A heavy battle rifle commonly seen in the hands of SolFed military types. Accepts any standard SolFed rifle magazine." + desc = "A heavy battle rifle firing .40 Sol. Commonly seen in the hands of SolFed military types. Accepts any standard SolFed rifle magazine." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi' icon_state = "infanterie" @@ -54,6 +54,10 @@ /obj/item/gun/ballistic/automatic/sol_rifle/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_CARWO) +/obj/item/gun/ballistic/automatic/sol_rifle/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/sol_rifle/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm index af5f6131d88..2ba9ecb5fcb 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/shotgun.dm @@ -1,7 +1,7 @@ // SolFed shotgun (this was gonna be in a proprietary shotgun shell type outside of 12ga at some point, wild right?) /obj/item/gun/ballistic/shotgun/riot/sol - name = "\improper Carwo 'Renoster' Shotgun" + name = "\improper Renoster Shotgun" desc = "A twelve gauge shotgun with a six shell capacity underneath. Made for and used by SolFed's various military branches." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns48x.dmi' @@ -32,6 +32,10 @@ /obj/item/gun/ballistic/shotgun/riot/sol/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_CARWO) +/obj/item/gun/ballistic/shotgun/riot/sol/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/shotgun/riot/sol/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm index ab36648abe5..4446ea84ef3 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/submachinegun.dm @@ -1,8 +1,8 @@ // Base Sol SMG /obj/item/gun/ballistic/automatic/sol_smg - name = "\improper Carwo 'Sindano' Submachinegun" - desc = "A small submachinegun commonly seen in the hands of PMCs and other unsavory corpos. Accepts any standard Sol pistol magazine." + name = "\improper Sindano Submachine Gun" + desc = "A small submachine gun firing .35 Sol. Commonly seen in the hands of PMCs and other unsavory corpos. Accepts any standard Sol pistol magazine." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/carwo_defense_systems/guns32x.dmi' icon_state = "sindano" @@ -37,6 +37,10 @@ /obj/item/gun/ballistic/automatic/sol_smg/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_CARWO) +/obj/item/gun/ballistic/automatic/sol_smg/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/sol_smg/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm index c185834aea8..681702fcc7d 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm @@ -2,8 +2,10 @@ // Sprays a wall of plasma that sucks against armor but fucks against unarmored targets /obj/item/gun/ballistic/automatic/pistol/plasma_thrower - name = "\improper Szot 'Słońce' plasma projector" - desc = "An outdated sidearm rarely seen in use by some members of the CIN. Spews an inaccurate stream of searing plasma out the magnetic barrel so long as it has power and the trigger is pulled." + name = "\improper Słońce Plasma Projector" + desc = "An outdated sidearm rarely seen in use by some members of the CIN. \ + Uses plasma power packs. \ + Spews an inaccurate stream of searing plasma out the magnetic barrel so long as it has power and the trigger is pulled." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/szot_dynamica/guns_32.dmi' icon_state = "slonce" @@ -28,6 +30,10 @@ /obj/item/gun/ballistic/automatic/pistol/plasma_thrower/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SZOT) +/obj/item/gun/ballistic/automatic/pistol/plasma_thrower/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/pistol/plasma_thrower/examine_more(mob/user) . = ..() @@ -48,8 +54,10 @@ // Shoots single, strong plasma blasts at a slow rate /obj/item/gun/ballistic/automatic/pistol/plasma_marksman - name = "\improper Szot 'Gwiazda' plasma sharpshooter" - desc = "An outdated sidearm rarely seen in use by some members of the CIN. Fires relatively accurate globs of searing plasma." + name = "\improper Gwiazda Plasma Sharpshooter" + desc = "An outdated sidearm rarely seen in use by some members of the CIN. \ + Uses plasma power packs. \ + Fires relatively accurate globs of searing plasma." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/szot_dynamica/guns_32.dmi' icon_state = "gwiazda" @@ -72,6 +80,10 @@ /obj/item/gun/ballistic/automatic/pistol/plasma_marksman/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SZOT) +/obj/item/gun/ballistic/automatic/pistol/plasma_marksman/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/pistol/plasma_marksman/examine_more(mob/user) . = ..() @@ -89,7 +101,7 @@ // Woe, buckshot be upon ye /obj/item/gun/ballistic/revolver/shotgun_revolver - name = "\improper Szot 'Bóbr' 12 GA revolver" + name = "\improper Bóbr 12 GA revolver" desc = "An outdated sidearm rarely seen in use by some members of the CIN. A revolver type design with a four shell cylinder. That's right, shell, this one shoots twelve guage." accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/rev12ga recoil = SAWN_OFF_RECOIL diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm index f3b16e9ed51..2e906f2cbe3 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/rifle.dm @@ -1,7 +1,7 @@ // Semi-automatic rifle firing .310 with reduced damage compared to a Sakhno /obj/item/gun/ballistic/automatic/lanca - name = "\improper Szot 'Lanca' Battle Rifle" + name = "\improper Lanca Battle Rifle" desc = "A relatively compact, long barreled bullpup battle rifle chambered for .310 Strilka. Has an integrated sight with \ a surprisingly functional amount of magnification, given its place of origin." @@ -50,6 +50,10 @@ /obj/item/gun/ballistic/automatic/lanca/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SZOT) +/obj/item/gun/ballistic/automatic/lanca/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/lanca/examine_more(mob/user) . = ..() @@ -73,7 +77,7 @@ // This sounds a lot scarier than it actually is, you'll just have to trust me here /obj/item/gun/ballistic/automatic/wylom - name = "\improper Szot 'Wyłom' AMR" + name = "\improper Wyłom Anti-Materiel Rifle" desc = "A massive, outdated beast of an anti materiel rifle that was once in use by CIN military forces. Fires the devastating .60 Strela caseless round, \ the massively overperforming penetration of which being the reason this weapon was discontinued." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/szot_dynamica/guns_64.dmi' @@ -109,6 +113,10 @@ /obj/item/gun/ballistic/automatic/wylom/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SZOT) +/obj/item/gun/ballistic/automatic/wylom/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/wylom/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm index 116c47ab3da..8c0645a7045 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/submachinegun.dm @@ -1,8 +1,8 @@ // Rapid firing submachinegun firing .27-54 Cesarzowa /obj/item/gun/ballistic/automatic/miecz - name = "\improper Szot 'Miecz' Submachinegun" - desc = "A short barrel, further compacted conversion of the 'Lanca' rifle to fire pistol caliber cartridges. \ + name = "\improper Miecz Submachine Gun" + desc = "A short barrel, further compacted conversion of the 'Lanca' rifle to fire pistol caliber .27-54 cartridges. \ Due to the intended purpose of the weapon, and less than optimal ranged performance of the projectile, it has \ nothing more than basic glow-sights as opposed to the ranged scope Lanca users might be used to." @@ -44,6 +44,10 @@ /obj/item/gun/ballistic/automatic/miecz/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SZOT) +/obj/item/gun/ballistic/automatic/miecz/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/miecz/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/pistol.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/pistol.dm index 1ae391325d0..3db5e27198b 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/pistol.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/pistol.dm @@ -1,8 +1,8 @@ // .35 Sol pistol /obj/item/gun/ballistic/automatic/pistol/sol - name = "\improper Trappiste 'Wespe' Pistol" - desc = "The standard issue service pistol of SolFed's various military branches. Comes with attached light." + name = "\improper Wespe Pistol" + desc = "The standard issue service pistol of SolFed's various military branches. Uses .35 Sol and comes with an attached light." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi' icon_state = "wespe" @@ -28,6 +28,10 @@ is_light_removable = FALSE, \ ) +/obj/item/gun/ballistic/automatic/pistol/sol/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/pistol/sol/examine_more(mob/user) . = ..() @@ -56,8 +60,9 @@ // Trappiste high caliber pistol in .585 /obj/item/gun/ballistic/automatic/pistol/trappiste - name = "\improper Trappiste 'Skild' Pistol" - desc = "A somewhat rare to see Trappiste pistol firing the high caliber .585 developed by the same company. Sees rare use mainly due to its tendency to cause severe wrist discomfort." + name = "\improper Skild Pistol" + desc = "A somewhat rare to see Trappiste pistol firing the high caliber .585 developed by the same company. \ + Sees rare use mainly due to its tendency to cause severe wrist discomfort." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi' icon_state = "skild" @@ -79,6 +84,10 @@ /obj/item/gun/ballistic/automatic/pistol/trappiste/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_TRAPPISTE) +/obj/item/gun/ballistic/automatic/pistol/sol/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/pistol/trappiste/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/revolver.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/revolver.dm index 22cbb471449..e3244e4234a 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/revolver.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/trappiste_fabriek/revolver.dm @@ -1,7 +1,7 @@ // .35 Sol mini revolver /obj/item/gun/ballistic/revolver/sol - name = "\improper Trappiste 'Eland' Revolver" + name = "\improper Eland Revolver" desc = "A small revolver with a comically short barrel and cylinder space for eight .35 Sol Short rounds." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi' @@ -18,6 +18,10 @@ /obj/item/gun/ballistic/revolver/sol/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_TRAPPISTE) +/obj/item/gun/ballistic/revolver/sol/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/revolver/sol/examine_more(mob/user) . = ..() @@ -39,7 +43,7 @@ // .585 super revolver /obj/item/gun/ballistic/revolver/takbok - name = "\improper Trappiste 'Takbok' Revolver" + name = "\improper Takbok Revolver" desc = "A hefty revolver with an equally large cylinder capable of holding five .585 Trappiste rounds." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi' @@ -60,6 +64,10 @@ /obj/item/gun/ballistic/revolver/takbok/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_TRAPPISTE) +/obj/item/gun/ballistic/revolver/takbok/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/revolver/takbok/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/rifle.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/rifle.dm index ec586d0d35f..5ac6950ad66 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/rifle.dm @@ -3,12 +3,9 @@ */ /obj/item/gun/ballistic/rifle/boltaction/sporterized - name = "\improper Xhihao 'Rengo' precision rifle" - desc = "A Xhihao 'Rengo' conversion rifle. Came as parts sold in a single kit by Xhihao Light Arms, \ - which can be swapped out with many of the outdated or simply old parts on a typical Sakhno rifle. \ - While not necessarily increasing performance in any way, the magazine is slightly longer. The weapon \ - is also overall a bit shorter, making it easier to handle for some people. Cannot be sawn off, cutting \ - really any part of this weapon off would make it non-functional." + name = "\improper Rengo Precision Rifle" + desc = "A heavily modified Sakhno rifle, parts made by Xhihao light arms based around Jupiter herself. \ + Has a higher capacity than standard Sakhno rifles, fitting ten .310 cartridges." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/guns40x.dmi' icon_state = "rengo" worn_icon_state = "enchanted_rifle" // Not actually magical looking, just looks closest to this one @@ -25,6 +22,21 @@ /obj/item/gun/ballistic/rifle/boltaction/sporterized/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_XHIHAO) +/obj/item/gun/ballistic/rifle/boltaction/sporterized/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + +/obj/item/gun/ballistic/rifle/boltaction/sporterized/examine_more(mob/user) + . = ..() + + . += "The Xhihao 'Rengo' conversion rifle. Came as parts sold in a single kit by Xhihao Light Arms, \ + which can be swapped out with many of the outdated or simply old parts on a typical Sakhno rifle. \ + While not necessarily increasing performance in any way, the magazine is slightly longer. The weapon \ + is also overall a bit shorter, making it easier to handle for some people. Cannot be sawn off, cutting \ + really any part of this weapon off would make it non-functional." + + return . + /obj/item/gun/ballistic/rifle/boltaction/sporterized/empty bolt_locked = TRUE // so the bolt starts visibly open accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba/empty diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm index 8ef4e450ec9..29e5dbac767 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/submachinegun.dm @@ -1,7 +1,7 @@ // Evil .585 smg that blueshields spawn with that will throw your screen like hell but itll sure kill whoever threatens a head really good /obj/item/gun/ballistic/automatic/xhihao_smg - name = "\improper Xhihao 'Bogseo' Submachinegun" + name = "\improper Bogseo Submachine Gun" desc = "A weapon that could hardly be called a 'sub' machinegun, firing the monstrous .585 cartridge. \ It provides enough kick to bruise a shoulder pretty bad if used without protection." @@ -43,6 +43,10 @@ AddElement(/datum/element/manufacturer_examine, COMPANY_XHIHAO) AddComponent(/datum/component/automatic_fire, fire_delay) +/obj/item/gun/ballistic/automatic/xhihao_smg/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + /obj/item/gun/ballistic/automatic/xhihao_smg/examine_more(mob/user) . = ..() diff --git a/modular_skyrat/modules/modular_weapons/code/ds2_gunset.dm b/modular_skyrat/modules/modular_weapons/code/ds2_gunset.dm new file mode 100644 index 00000000000..b019cdc9cc9 --- /dev/null +++ b/modular_skyrat/modules/modular_weapons/code/ds2_gunset.dm @@ -0,0 +1,20 @@ +//Gunset for the APS Machine Pistol + +/obj/item/storage/toolbox/guncase/skyrat/pistol + name = "'Makarov pistol' gunset" + + weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol + extra_to_spawn = /obj/item/ammo_box/magazine/m9mm + +/obj/item/storage/toolbox/guncase/skyrat/pistol/aps + name = "'Stechkin APS machine pistol' gunset" + + weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/aps + extra_to_spawn = /obj/item/ammo_box/magazine/m9mm_aps + + +/obj/item/storage/toolbox/guncase/skyrat/c20r + name = "'C-20r SMG' gunset" + + weapon_to_spawn = /obj/item/gun/ballistic/automatic/c20r + extra_to_spawn = /obj/item/ammo_box/magazine/smgm45 diff --git a/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm b/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm index 6b28643245d..990581bfb4a 100644 --- a/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm +++ b/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm @@ -60,9 +60,14 @@ name = "Pepperball Ammo Box" id = "pepperballs" build_type = AUTOLATHE | PROTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + ) build_path = /obj/item/ammo_box/advanced/pepperballs - category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY /obj/item/ammo_box/advanced/pepperballs @@ -70,7 +75,9 @@ icon = 'modular_skyrat/modules/modular_weapons/icons/obj/pepperball/ammoboxes.dmi' icon_state = "box10x24" ammo_type = /obj/item/ammo_casing/pepperball - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3) + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + ) max_ammo = 15 // Gunset for the pepperball pistol diff --git a/modular_skyrat/modules/mold/code/mold_event.dm b/modular_skyrat/modules/mold/code/mold_event.dm index 7c8f32caff0..04ae8cde88f 100644 --- a/modular_skyrat/modules/mold/code/mold_event.dm +++ b/modular_skyrat/modules/mold/code/mold_event.dm @@ -48,17 +48,18 @@ if(!is_type_in_typecache(checked_area, possible_spawn_areas)) continue - for(var/turf/open/floor in checked_area.get_contained_turfs()) - if(isopenspaceturf(floor)) - continue + for (var/list/zlevel_turfs as anything in checked_area.get_zlevel_turf_lists()) + for(var/turf/area_turf as anything in zlevel_turfs) + if(isopenspaceturf(area_turf)) + continue - if(!floor.Enter(test_resin)) - continue + if(!area_turf.Enter(test_resin)) + continue - if(locate(/turf/closed) in range(2, floor)) - continue + if(locate(/turf/closed) in range(2, area_turf)) + continue - turfs += floor + turfs += area_turf qdel(test_resin) diff --git a/modular_skyrat/modules/morenarcotics/code/cocaine.dm b/modular_skyrat/modules/morenarcotics/code/cocaine.dm index 2c819bf469c..174c99425d7 100644 --- a/modular_skyrat/modules/morenarcotics/code/cocaine.dm +++ b/modular_skyrat/modules/morenarcotics/code/cocaine.dm @@ -46,7 +46,7 @@ if(SPT_PROB(2.5, seconds_per_tick)) var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") to_chat(M, span_notice("[high_message]")) - M.add_mood_event("zoinked", /datum/mood_event/stimulant_heavy, name) + M.add_mood_event("zoinked", /datum/mood_event/stimulant_heavy, 1, name) M.AdjustStun(-15 * REM * seconds_per_tick) M.AdjustKnockdown(-15 * REM * seconds_per_tick) M.AdjustUnconscious(-15 * REM * seconds_per_tick) diff --git a/modular_skyrat/modules/morenarcotics/code/opium.dm b/modular_skyrat/modules/morenarcotics/code/opium.dm index 7c49c67ca5d..48e0f91ef81 100644 --- a/modular_skyrat/modules/morenarcotics/code/opium.dm +++ b/modular_skyrat/modules/morenarcotics/code/opium.dm @@ -110,7 +110,7 @@ var/high_message = pick("You feel euphoric.", "You feel on top of the world.") if(SPT_PROB(2.5, seconds_per_tick)) to_chat(M, span_notice("[high_message]")) - M.add_mood_event("smacked out", /datum/mood_event/narcotic_heavy, name) + M.add_mood_event("smacked out", /datum/mood_event/narcotic_heavy, 1, name) M.adjustBruteLoss(-0.1 * REM * seconds_per_tick, 0) //can be used as a (shitty) painkiller M.adjustFireLoss(-0.1 * REM * seconds_per_tick, 0) M.overlay_fullscreen("heroin_euphoria", /atom/movable/screen/fullscreen/color_vision/heroin_color) diff --git a/modular_skyrat/modules/morenarcotics/code/thc.dm b/modular_skyrat/modules/morenarcotics/code/thc.dm index 69d1418a99b..3d46e9be0be 100644 --- a/modular_skyrat/modules/morenarcotics/code/thc.dm +++ b/modular_skyrat/modules/morenarcotics/code/thc.dm @@ -57,7 +57,7 @@ game_plane_master_controller.add_filter("weed_blur", 10, angular_blur_filter(0, 0, 0.45)) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(M, span_notice("[high_message]")) - M.add_mood_event("stoned", /datum/mood_event/stoned, name) + M.add_mood_event("stoned", /datum/mood_event/stoned, 1, name) M.throw_alert("stoned", /atom/movable/screen/alert/stoned) M.sound_environment_override = SOUND_ENVIRONMENT_DRUGGED M.set_dizzy_if_lower(5 * REM * seconds_per_tick * 2 SECONDS) diff --git a/modular_skyrat/modules/moretraitoritems/code/weapons.dm b/modular_skyrat/modules/moretraitoritems/code/weapons.dm index 576bca81f2f..fdcabbf5776 100644 --- a/modular_skyrat/modules/moretraitoritems/code/weapons.dm +++ b/modular_skyrat/modules/moretraitoritems/code/weapons.dm @@ -29,9 +29,14 @@ name = "Speed Loader (.357 Peacemaker)" id = "a357PM" build_type = AUTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/ammo_box/a357/peacemaker - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) /obj/item/ammo_box/a357/peacemaker name = "speed loader (.357 Peacemaker)" diff --git a/modular_skyrat/modules/mutants/code/mutant_cure.dm b/modular_skyrat/modules/mutants/code/mutant_cure.dm index f6c72454c55..ee10bb45f89 100644 --- a/modular_skyrat/modules/mutants/code/mutant_cure.dm +++ b/modular_skyrat/modules/mutants/code/mutant_cure.dm @@ -3,7 +3,12 @@ desc = "A tool used to extract the RNA from viruses. Apply to skin." icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi' icon_state = "extractor" - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) /// Our loaded vial. var/obj/item/rna_vial/loaded_vial @@ -84,7 +89,11 @@ desc = "A glass vial containing raw virus RNA. Slot this into the combinator to upload the sample." icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi' icon_state = "rnavial" - custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) var/contains_rna = FALSE /obj/item/rna_vial/proc/load_rna(mob/living/carbon/human/H) @@ -349,7 +358,9 @@ icon = 'modular_skyrat/modules/mutants/icons/extractor.dmi' icon_state = "tvirus_infector" list_reagents = list(/datum/reagent/hnz = 30) - custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 5) + custom_materials = list( + /datum/material/glass=HALF_SHEET_MATERIAL_AMOUNT, + ) /obj/item/reagent_containers/cup/bottle/hnz/one list_reagents = list(/datum/reagent/hnz = 1) diff --git a/modular_skyrat/modules/mutants/code/mutant_techweb.dm b/modular_skyrat/modules/mutants/code/mutant_techweb.dm index e2570bfd311..8099b4f3b6d 100644 --- a/modular_skyrat/modules/mutants/code/mutant_techweb.dm +++ b/modular_skyrat/modules/mutants/code/mutant_techweb.dm @@ -21,10 +21,14 @@ desc = "An empty RNA vial for storing genetic information." id = "rna_vial" build_type = PROTOLATHE - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT, /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/rna_vial category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_MEDICAL @@ -33,10 +37,15 @@ desc = "An RNA extraction device, use this on any subect you'd like to extract RNA data from, needs RNA vials to work." id = "rna_extractor" build_type = PROTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2, /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/rna_extractor category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_SUBCATEGORY_EQUIPMENT_SCIENCE + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + RND_SUBCATEGORY_EQUIPMENT_SCIENCE, ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_MEDICAL @@ -45,5 +54,7 @@ desc = "The MRNA Recombinator is one of Nanotrasens most advanced technologies and allows the exact recombination of virus RNA." id = "rna_recombinator" build_path = /obj/item/circuitboard/machine/rna_recombinator - category = list(RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH) + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH, + ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_MEDICAL diff --git a/modular_skyrat/modules/novaya_ert/code/police_outfit.dm b/modular_skyrat/modules/novaya_ert/code/police_outfit.dm index c34e390df57..4f5902eff9c 100644 --- a/modular_skyrat/modules/novaya_ert/code/police_outfit.dm +++ b/modular_skyrat/modules/novaya_ert/code/police_outfit.dm @@ -14,6 +14,15 @@ desc = "A cloak made from heavy tarpaulin. Nigh wind- and waterproof thanks to its design. The signature white rectangle of the NRI police covers the garment's back." icon_state = "cloak_police" +// Just some extra police equipment +/obj/item/clothing/neck/cloak/colonial/nri_police/Initialize() + allowed += list( + /obj/item/restraints/handcuffs, + /obj/item/ammo_box, + /obj/item/ammo_casing, + ) + return ..() + /obj/item/clothing/head/hats/colonial/nri_police name = "imperial police cap" desc = "A puffy cap made out of tarpaulin covered by some textile. It is sturdy and comfortable, and seems to retain its form very well.
\ diff --git a/modular_skyrat/modules/novaya_ert/code/shield.dm b/modular_skyrat/modules/novaya_ert/code/shield.dm index b72581d70c3..afe9981305c 100644 --- a/modular_skyrat/modules/novaya_ert/code/shield.dm +++ b/modular_skyrat/modules/novaya_ert/code/shield.dm @@ -7,9 +7,6 @@ righthand_file = 'modular_skyrat/modules/novaya_ert/icons/riot_right.dmi' transparent = FALSE -/obj/item/shield/riot/pointman/nri/shatter(mob/living/carbon/human/owner) - playsound(owner, 'sound/effects/glassbr3.ogg', 100) - new /obj/item/corpsman_broken((get_turf(src))) /obj/item/corpsman_broken diff --git a/modular_skyrat/modules/novaya_ert/code/suit.dm b/modular_skyrat/modules/novaya_ert/code/suit.dm index 4466bd26da4..fa0eccf0bbe 100644 --- a/modular_skyrat/modules/novaya_ert/code/suit.dm +++ b/modular_skyrat/modules/novaya_ert/code/suit.dm @@ -22,7 +22,7 @@ cell = /obj/item/stock_parts/cell/bluespace actions_types = list(/datum/action/item_action/hev_toggle/nri, /datum/action/item_action/hev_toggle_notifs/nri, /datum/action/item_action/toggle_spacesuit) resistance_flags = FIRE_PROOF|UNACIDABLE|ACID_PROOF|FREEZE_PROOF - clothing_flags = STOPSPRESSUREDAMAGE|SNUG_FIT|BLOCKS_SHOVE_KNOCKDOWN + clothing_flags = STOPSPRESSUREDAMAGE|SNUG_FIT activation_song = null //No nice song. diff --git a/modular_skyrat/modules/oversized/code/door.dm b/modular_skyrat/modules/oversized/code/door.dm index e270554369b..af711258d76 100644 --- a/modular_skyrat/modules/oversized/code/door.dm +++ b/modular_skyrat/modules/oversized/code/door.dm @@ -16,7 +16,6 @@ var/affecting = crossing_human.get_bodypart(BODY_ZONE_HEAD) crossing_human.apply_damage(15, BRUTE, affecting) crossing_human.Knockdown(20) - crossing_human.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15) //We do a bit of brain damage crossing_human.visible_message(span_warning("[crossing_human] slams their head into the frame of [src] with a sickening thud!"), \ span_userdanger("You slam your head against [src]!") ) diff --git a/modular_skyrat/modules/oversized/code/oversized_quirk.dm b/modular_skyrat/modules/oversized/code/oversized_quirk.dm index 8892cc1f54f..7be077e53b3 100644 --- a/modular_skyrat/modules/oversized/code/oversized_quirk.dm +++ b/modular_skyrat/modules/oversized/code/oversized_quirk.dm @@ -21,15 +21,12 @@ human_holder.maptext_height = 32 * human_holder.dna.features["body_size"] //Adjust runechat height human_holder.dna.update_body_size() human_holder.mob_size = MOB_SIZE_LARGE - var/obj/item/bodypart/arm/left/left_arm = human_holder.get_bodypart(BODY_ZONE_L_ARM) - if(left_arm) - left_arm.unarmed_damage_low += OVERSIZED_HARM_DAMAGE_BONUS - left_arm.unarmed_damage_high += OVERSIZED_HARM_DAMAGE_BONUS - var/obj/item/bodypart/arm/right/right_arm = human_holder.get_bodypart(BODY_ZONE_R_ARM) - if(right_arm) - right_arm.unarmed_damage_low += OVERSIZED_HARM_DAMAGE_BONUS - right_arm.unarmed_damage_high += OVERSIZED_HARM_DAMAGE_BONUS + RegisterSignal(human_holder, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_gain_limb)) // make sure we handle this when new ones are applied + + // just dummy call our current limbs to have less duplication (by having more duplication ahueheu) + for(var/obj/item/bodypart/bodypart as anything in human_holder.bodyparts) + on_gain_limb(src, bodypart, special = FALSE) human_holder.blood_volume_normal = BLOOD_VOLUME_OVERSIZED human_holder.physiology.hunger_mod *= OVERSIZED_HUNGER_MOD //50% hungrier @@ -57,18 +54,48 @@ var/obj/item/bodypart/arm/left/left_arm = human_holder.get_bodypart(BODY_ZONE_L_ARM) if(left_arm) - left_arm.unarmed_damage_low -= OVERSIZED_HARM_DAMAGE_BONUS - left_arm.unarmed_damage_high -= OVERSIZED_HARM_DAMAGE_BONUS + left_arm.unarmed_damage_high = initial(left_arm.unarmed_damage_high) var/obj/item/bodypart/arm/right/right_arm = human_holder.get_bodypart(BODY_ZONE_R_ARM) if(right_arm) - right_arm.unarmed_damage_low -= OVERSIZED_HARM_DAMAGE_BONUS - right_arm.unarmed_damage_high -= OVERSIZED_HARM_DAMAGE_BONUS + right_arm.unarmed_damage_high = initial(right_arm.unarmed_damage_high) + + var/obj/item/bodypart/leg/left_leg = human_holder.get_bodypart(BODY_ZONE_L_LEG) + if (left_leg) + left_leg.unarmed_effectiveness = initial(left_leg.unarmed_effectiveness) + + var/obj/item/bodypart/leg/right_leg = human_holder.get_bodypart(BODY_ZONE_R_LEG) + if (right_leg) + right_leg.unarmed_effectiveness = initial(right_leg.unarmed_effectiveness) + + for(var/obj/item/bodypart/bodypart as anything in human_holder.bodyparts) + bodypart.name = replacetext(bodypart.name, "oversized ", "") + + UnregisterSignal(human_holder, COMSIG_CARBON_POST_ATTACH_LIMB) human_holder.blood_volume_normal = BLOOD_VOLUME_NORMAL human_holder.physiology.hunger_mod /= OVERSIZED_HUNGER_MOD human_holder.remove_movespeed_modifier(/datum/movespeed_modifier/oversized) +/datum/quirk/oversized/proc/on_gain_limb(datum/source, obj/item/bodypart/gained, special) + SIGNAL_HANDLER + + if(findtext(gained.name, "oversized")) + return + + // Oversized arms have a higher damage maximum. Pretty simple. + if(istype(gained, /obj/item/bodypart/arm)) + var/obj/item/bodypart/arm/new_arm = gained + new_arm.unarmed_damage_high = initial(new_arm.unarmed_damage_high) + OVERSIZED_HARM_DAMAGE_BONUS + + // Before this, we never actually did anything with Oversized legs. + // This brings their unarmed_effectiveness up to 20 from 15, which is on par with mushroom legs. + // Functionally, this makes their prone kicks more accurate and increases the chance of extending prone knockdown... but only while the victim is already prone. + else if(istype(gained, /obj/item/bodypart/leg)) + var/obj/item/bodypart/leg/new_leg = gained + new_leg.unarmed_effectiveness = initial(new_leg.unarmed_effectiveness) + OVERSIZED_KICK_EFFECTIVENESS_BONUS + + gained.name = "oversized " + gained.name /datum/movespeed_modifier/oversized multiplicative_slowdown = OVERSIZED_SPEED_SLOWDOWN diff --git a/modular_skyrat/modules/paycheck_rations/code/reagents.dm b/modular_skyrat/modules/paycheck_rations/code/reagents.dm index eefcce274af..c2649fe289b 100644 --- a/modular_skyrat/modules/paycheck_rations/code/reagents.dm +++ b/modular_skyrat/modules/paycheck_rations/code/reagents.dm @@ -33,6 +33,12 @@ icon = 'modular_skyrat/modules/paycheck_rations/icons/food_containers.dmi' list_reagents = list(/datum/reagent/consumable/soymilk = 15) +/obj/item/reagent_containers/condiment/milk/small_ration + name = "small milk" + desc = "It's milk. White and nutritious goodness! This one is significantly smaller than normal cartons; just enough to make some cheese with." + icon = 'modular_skyrat/modules/paycheck_rations/icons/food_containers.dmi' + list_reagents = list(/datum/reagent/consumable/milk = 15) + /obj/item/reagent_containers/cup/glass/bottle/small/tiny name = "tiny glass bottle" volume = 10 diff --git a/modular_skyrat/modules/paycheck_rations/icons/food_containers.dmi b/modular_skyrat/modules/paycheck_rations/icons/food_containers.dmi index e87a6a9cb58..70bc6082b7a 100644 Binary files a/modular_skyrat/modules/paycheck_rations/icons/food_containers.dmi and b/modular_skyrat/modules/paycheck_rations/icons/food_containers.dmi differ diff --git a/modular_skyrat/modules/polarized_windows/polarizer.dm b/modular_skyrat/modules/polarized_windows/polarizer.dm index 351815dd102..fbfd4ba119e 100644 --- a/modular_skyrat/modules/polarized_windows/polarizer.dm +++ b/modular_skyrat/modules/polarized_windows/polarizer.dm @@ -51,7 +51,10 @@ name = "Window Polarization Remote Controller" id = "polarizer" build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE | COLONY_FABRICATOR - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT, + /datum/material/glass = SMALL_MATERIAL_AMOUNT, + ) build_path = /obj/item/assembly/control/polarizer category = list( RND_CATEGORY_INITIAL, diff --git a/modular_skyrat/modules/power/code/powerator.dm b/modular_skyrat/modules/power/code/powerator.dm new file mode 100644 index 00000000000..4a3badda60f --- /dev/null +++ b/modular_skyrat/modules/power/code/powerator.dm @@ -0,0 +1,187 @@ +/obj/item/circuitboard/machine/powerator + name = "Powerator" + desc = "The powerator is a machine that allows stations to sell their power to other stations that require additional sources." + greyscale_colors = CIRCUIT_COLOR_GENERIC + build_path = /obj/machinery/powerator + req_components = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/stack/ore/bluespace_crystal/refined = 1, + /obj/item/stack/cable_coil = 5, + /datum/stock_part/matter_bin = 2, + /datum/stock_part/micro_laser = 2, + /datum/stock_part/servo = 2, + ) + needs_anchored = TRUE + +/datum/supply_pack/misc/powerator + name = "Powerator" + desc = "We know the feeling of losing power and Central sending power, it is our time to do the same." + cost = CARGO_CRATE_VALUE * 50 // 10,000 + contains = list(/obj/item/circuitboard/machine/powerator) + crate_name = "Powerator Circuitboard Crate" + crate_type = /obj/structure/closet/crate + +/datum/design/board/powerator + name = "Machine Design (Powerator)" + desc = "Allows for the construction of circuit boards used to build a powerator." + id = "powerator" + build_path = /obj/item/circuitboard/machine/powerator + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/techweb_node/powerator + id = "powerator" + display_name = "Powerator" + description = "We've been saved by it in the past, we should send some power ourselves!" + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + hidden = TRUE + experimental = TRUE + prereq_ids = list("base") + design_ids = list( + "powerator", + ) + +/obj/machinery/powerator + name = "powerator" + desc = "Beyond the ridiculous name, it is the standard for transporting and selling energy to power networks that require additional sources!" + icon = 'modular_skyrat/modules/power/icons/machines.dmi' + icon_state = "powerator" + + density = TRUE + circuit = /obj/item/circuitboard/machine/powerator + idle_power_usage = 100 + + /// the current amount of power that we are trying to process + var/current_power = 10000 + /// the max amount of power that can be sent per process, from 100000 (t1) to 10000000 (t4) + var/max_power = 100000 + /// how much the current_power is divided by to determine the profit + var/divide_ratio = 0.00001 + /// the attached cable to the machine + var/obj/structure/cable/attached_cable + /// how many credits this machine has actually made so far + var/credits_made = 0 + +/obj/machinery/powerator/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) + +/obj/machinery/powerator/Destroy() + STOP_PROCESSING(SSobj, src) + attached_cable = null + return ..() + +/obj/machinery/powerator/examine(mob/user) + . = ..() + . += "
" + if(panel_open) + . += span_warning("The maintainence panel is currently open, preventing [src] from working!") + else + . += span_notice("The maintainence panel is closed.") + + if(!anchored) + . += span_warning("The anchors are not bolted to the floor, preventing [src] from working!") + else + . += span_notice("The anchors are bolted to the floor.") + + if(machine_stat & (NOPOWER | BROKEN)) + . += span_warning("There is either damage or no power being supplied, preventing [src] from working!") + else + . += span_notice("There is no damage and power is being supplied.") + + if(!attached_cable) + . += span_warning("There is no power cable underneath, preventing [src] from working!") + else + . += span_notice("There is a power cable underneath.") + + . += span_notice("Current Power: [display_power(current_power)]/[display_power(max_power)]") + . += span_notice("This machine has made [credits_made] credits from selling power so far.") + +/obj/machinery/powerator/RefreshParts() + . = ..() + + var/efficiency = -2 //set to -2 so that tier 1 parts do nothing + max_power = 100000 + for(var/datum/stock_part/micro_laser/laser_part in component_parts) + efficiency += laser_part.tier + max_power += (efficiency * 1650000) + + efficiency = -2 + divide_ratio = 0.00001 + for(var/datum/stock_part/servo/servo_part in component_parts) + efficiency += servo_part.tier + divide_ratio += (efficiency * 0.000005) + +/obj/machinery/powerator/update_overlays() + . = ..() + cut_overlays() + if(panel_open) + add_overlay("panel_open") + + else + add_overlay("panel_close") + + if(machine_stat & (NOPOWER | BROKEN) || !anchored || panel_open) + add_overlay("error") + return + + if(!attached_cable) + add_overlay("cable") + return + + if(!attached_cable.avail(current_power)) + add_overlay("power") + return + + add_overlay("work") + +/obj/machinery/powerator/process() + update_appearance() //lets just update this + var/turf/src_turf = get_turf(src) + attached_cable = locate() in src_turf + if(machine_stat & (NOPOWER | BROKEN) || !anchored || panel_open || !attached_cable) //no power, broken, unanchored, maint panel open, or no cable? lets reset + return + + if(!attached_cable) + return + + if(current_power <= 0) + current_power = 0 //this is just for the fringe case, wouldn't want it to somehow produce power for money! unless... + return + + if(!attached_cable.avail(current_power)) + if(!attached_cable.newavail()) + return + current_power = attached_cable.newavail() + attached_cable.add_delayedload(current_power) + + var/money_ratio = round(current_power * divide_ratio) + var/datum/bank_account/synced_bank_account = SSeconomy.get_dep_account(ACCOUNT_CAR) + synced_bank_account.adjust_money(money_ratio) + credits_made += money_ratio + + update_appearance() //lets just update this + +/obj/machinery/powerator/attack_hand(mob/living/user, list/modifiers) + . = ..() + current_power = tgui_input_number(user, "How much power would you like to draw? Max: [display_power(max_power)]", "Power Draw", current_power, max_power, 0) + if(isnull(current_power)) + current_power = 10000 + return + +/obj/machinery/powerator/screwdriver_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + panel_open = !panel_open + update_appearance() + return ITEM_INTERACT_SUCCESS + +/obj/machinery/powerator/crowbar_act(mob/user, obj/item/tool) + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/powerator/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS diff --git a/modular_skyrat/modules/power/code/teg.dm b/modular_skyrat/modules/power/code/teg.dm new file mode 100644 index 00000000000..3648bf6157a --- /dev/null +++ b/modular_skyrat/modules/power/code/teg.dm @@ -0,0 +1,28 @@ +/datum/design/board/circulator + name = "Machine Design (Circulator Board)" + desc = "The circuit board for a circulator." + id = "circulator" + build_path = /obj/item/circuitboard/machine/circulator + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/board/teg + name = "Machine Design (TEG Board)" + desc = "The circuit board for a TEG." + id = "teg" + build_path = /obj/item/circuitboard/machine/thermoelectric_generator + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/techweb_node/adv_power_skyrat + id = "adv_power_skyrat" + display_name = "Additional Advanced Power Manipulation" + description = "How to get different types of zap." + prereq_ids = list("adv_power") + design_ids = list("teg", "circulator") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier2_capacitors = 500) diff --git a/modular_skyrat/modules/power/icons/machines.dmi b/modular_skyrat/modules/power/icons/machines.dmi new file mode 100644 index 00000000000..6bcf3b9170b Binary files /dev/null and b/modular_skyrat/modules/power/icons/machines.dmi differ diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm b/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm index 0ee1202ef72..4860aed6331 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm @@ -11,7 +11,9 @@ max_integrity = 100 pass_flags = PASSTABLE resistance_flags = FLAMMABLE - custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10) + custom_materials = list( + /datum/material/wood = SHEET_MATERIAL_AMOUNT * 10, + ) /// The maximum number of items this structure can store var/maximum_contained_items = 10 diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm b/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm index 70404fadbb1..9a028936f1e 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm @@ -10,7 +10,9 @@ anchored = TRUE max_integrity = 200 pass_flags = PASSTABLE - custom_materials = list(/datum/material/stone = SHEET_MATERIAL_AMOUNT * 6) + custom_materials = list( + /datum/material/stone = SHEET_MATERIAL_AMOUNT * 6, + ) drag_slowdown = 2 /// The maximum number of items this structure can store var/maximum_contained_items = 10 diff --git a/modular_skyrat/modules/primitive_production/code/glassblowing.dm b/modular_skyrat/modules/primitive_production/code/glassblowing.dm index 3898b4f25de..8dcc4f3cd3a 100644 --- a/modular_skyrat/modules/primitive_production/code/glassblowing.dm +++ b/modular_skyrat/modules/primitive_production/code/glassblowing.dm @@ -13,7 +13,9 @@ desc = "A glass bowl that is capable of carrying things." icon_state = "glass_globe" material_flags = MATERIAL_COLOR - custom_materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list( + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + ) /datum/export/glassblowing cost = CARGO_CRATE_VALUE * 5 diff --git a/modular_skyrat/modules/primitive_structures/code/storage_structures.dm b/modular_skyrat/modules/primitive_structures/code/storage_structures.dm index 1788109b6c2..0a3aaa0db60 100644 --- a/modular_skyrat/modules/primitive_structures/code/storage_structures.dm +++ b/modular_skyrat/modules/primitive_structures/code/storage_structures.dm @@ -58,7 +58,7 @@ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi' resistance_flags = FLAMMABLE base_build_path = /obj/machinery/smartfridge/producebin - contents_icon_state = "produce" + base_icon_state = "produce" use_power = NO_POWER_USE light_power = 0 idle_power_usage = 0 @@ -89,7 +89,7 @@ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi' resistance_flags = FLAMMABLE base_build_path = /obj/machinery/smartfridge/seedshelf - contents_icon_state = "seed" + base_icon_state = "seed" use_power = NO_POWER_USE light_power = 0 idle_power_usage = 0 @@ -119,7 +119,7 @@ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi' resistance_flags = FLAMMABLE base_build_path = /obj/machinery/smartfridge/rationshelf - contents_icon_state = "ration" + base_icon_state = "ration" use_power = NO_POWER_USE light_power = 0 idle_power_usage = 0 @@ -149,7 +149,7 @@ icon = 'modular_skyrat/modules/primitive_structures/icons/storage.dmi' resistance_flags = FLAMMABLE base_build_path = /obj/machinery/smartfridge/producedisplay - contents_icon_state = "nonfood" + base_icon_state = "nonfood" use_power = NO_POWER_USE light_power = 0 idle_power_usage = 0 diff --git a/modular_skyrat/modules/radiosound/code/headset.dm b/modular_skyrat/modules/radiosound/code/headset.dm index 321fb9e40a0..b27e550f1ef 100644 --- a/modular_skyrat/modules/radiosound/code/headset.dm +++ b/modular_skyrat/modules/radiosound/code/headset.dm @@ -1,5 +1,8 @@ /obj/item/radio/headset + /// The sound that plays when someone uses the headset var/radiosound = 'modular_skyrat/modules/radiosound/sound/radio/common.ogg' + /// The volume of the radio sound we make + var/radio_sound_volume = 25 /obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops radiosound = 'modular_skyrat/modules/radiosound/sound/radio/syndie.ogg' @@ -7,7 +10,7 @@ /obj/item/radio/headset/headset_sec radiosound = 'modular_skyrat/modules/radiosound/sound/radio/security.ogg' -/obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans, datum/language/language, list/message_mods, direct = TRUE) +/obj/item/radio/headset/talk_into(mob/living/mob_in_question, message, channel, list/spans, datum/language/language, list/message_mods, direct = TRUE) if(radiosound && listening) - playsound(M, radiosound, rand(20, 30), 0, 0, SOUND_FALLOFF_EXPONENT) + playsound(mob_in_question, radiosound, radio_sound_volume, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, SOUND_FALLOFF_EXPONENT) . = ..() diff --git a/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm b/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm index 268c4acdfa1..54678a1c6fb 100644 --- a/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm +++ b/modular_skyrat/modules/reagent_forging/code/crafting_bench.dm @@ -108,6 +108,13 @@ /obj/structure/reagent_crafting_bench/attack_hand(mob/living/user, list/modifiers) . = ..() + select_recipe(user) + +/obj/structure/reagent_crafting_bench/attack_robot(mob/living/user) + . = ..() + select_recipe(user) + +/obj/structure/reagent_crafting_bench/proc/select_recipe(mob/living/user) update_appearance() if(length(contents)) @@ -142,17 +149,32 @@ /obj/structure/reagent_crafting_bench/attackby(obj/item/attacking_item, mob/user, params) if(istype(attacking_item, /obj/item/forging/complete)) - if(length(contents)) - balloon_alert(user, "already full") - return TRUE - - attacking_item.forceMove(src) - balloon_alert_to_viewers("placed [attacking_item]") - update_appearance() + attempt_place(attacking_item, user) return TRUE return ..() +/obj/structure/reagent_crafting_bench/MouseDrop_T(obj/item/attacking_item, mob/living/user) + . = ..() + if(!isliving(user)) + return + + if(!isobj(attacking_item)) + return + + if(istype(attacking_item, /obj/item/forging/complete)) + attempt_place(attacking_item, user) + +/obj/structure/reagent_crafting_bench/proc/attempt_place(obj/item/attacking_item, mob/user) + if(length(contents)) + balloon_alert(user, "already full") + return + + attacking_item.forceMove(src) + balloon_alert_to_viewers("placed [attacking_item]") + update_appearance() + return + /obj/structure/reagent_crafting_bench/wrench_act(mob/living/user, obj/item/tool) tool.play_tool_sound(src) deconstruct(disassembled = TRUE) diff --git a/modular_skyrat/modules/reagent_forging/code/forge.dm b/modular_skyrat/modules/reagent_forging/code/forge.dm index cf0d05656cc..4ecd4351573 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge.dm @@ -334,6 +334,10 @@ upgrade_forge(user) +/obj/structure/reagent_forge/attack_robot(mob/living/user) + . = ..() + upgrade_forge(user) + /obj/structure/reagent_forge/proc/upgrade_forge(mob/living/user, forced = FALSE) var/level_to_upgrade_to @@ -395,6 +399,35 @@ playsound(src, 'sound/weapons/parry.ogg', 50, TRUE) // Play a feedback sound to really let players know we just did an upgrade +//this will allow click dragging certain items +/obj/structure/reagent_forge/MouseDrop_T(obj/attacking_item, mob/living/user) + . = ..() + if(!isliving(user)) + return + + if(!isobj(attacking_item)) + return + + if(istype(attacking_item, /obj/item/stack/sheet/mineral/wood)) // Wood is a weak fuel, and will only get the forge up to 50 temperature + refuel(attacking_item, user) + return + + if(istype(attacking_item, /obj/item/stack/sheet/mineral/coal)) // Coal is a strong fuel that doesn't need bellows to heat up properly + refuel(attacking_item, user, TRUE) + return + + if(istype(attacking_item, /obj/item/stack/ore)) + smelt_ore(attacking_item, user) + return + + if(attacking_item.GetComponent(/datum/component/reagent_weapon)) + handle_weapon_imbue(attacking_item, user) + return + + if(attacking_item.GetComponent(/datum/component/reagent_clothing)) + handle_clothing_imbue(attacking_item, user) + return + /obj/structure/reagent_forge/attackby(obj/item/attacking_item, mob/living/user, params) if(!used_tray && istype(attacking_item, /obj/item/plate/oven_tray)) add_tray_to_forge(user, attacking_item) diff --git a/modular_skyrat/modules/reagent_forging/code/water_basin.dm b/modular_skyrat/modules/reagent_forging/code/water_basin.dm index 895dc3f77b1..ebae1336cf5 100644 --- a/modular_skyrat/modules/reagent_forging/code/water_basin.dm +++ b/modular_skyrat/modules/reagent_forging/code/water_basin.dm @@ -26,6 +26,13 @@ /obj/structure/reagent_water_basin/attack_hand(mob/living/user, list/modifiers) . = ..() + attempt_upgrade(user) + +/obj/structure/reagent_water_basin/attack_robot(mob/living/user) + . = ..() + attempt_upgrade(user) + +/obj/structure/reagent_water_basin/proc/attempt_upgrade(mob/living/user) var/smithing_skill = user.mind.get_skill_level(/datum/skill/smithing) if(smithing_skill < SKILL_LEVEL_JOURNEYMAN || fishable) return diff --git a/modular_skyrat/modules/resleeving/code/research/resleeving_research.dm b/modular_skyrat/modules/resleeving/code/research/resleeving_research.dm index 4dcd00cc73e..9579341947d 100644 --- a/modular_skyrat/modules/resleeving/code/research/resleeving_research.dm +++ b/modular_skyrat/modules/resleeving/code/research/resleeving_research.dm @@ -4,7 +4,9 @@ id = "rsd_interface" build_type = PROTOLATHE | AWAY_LATHE departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE - category = list(RND_CATEGORY_EQUIPMENT) + category = list( + RND_CATEGORY_EQUIPMENT, + ) materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT, diff --git a/modular_skyrat/modules/salon/code/hair_tie.dm b/modular_skyrat/modules/salon/code/hair_tie.dm index 7276071e4eb..2b490ec749b 100644 --- a/modular_skyrat/modules/salon/code/hair_tie.dm +++ b/modular_skyrat/modules/salon/code/hair_tie.dm @@ -30,7 +30,7 @@ name = "colorful hair tie" desc = "An elastic hair tie, adornished with colorful plastic beads." icon_state = "hairtie_beads" - custom_materials = (list(/datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5)) + custom_materials = (list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT)) /obj/item/clothing/head/hair_tie/syndicate name = "\improper Syndicate hair tie" @@ -138,10 +138,12 @@ name = "Plastic Hair Tie" id = "plastic_hair_tie" build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE | COLONY_FABRICATOR - materials = list(/datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/clothing/head/hair_tie/plastic_beads category = list( - RND_CATEGORY_INITIAL, + RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE, ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE diff --git a/modular_skyrat/modules/shotgunrebalance/code/ammobox.dm b/modular_skyrat/modules/shotgunrebalance/code/ammobox.dm index c2d98779313..63011a1e622 100644 --- a/modular_skyrat/modules/shotgunrebalance/code/ammobox.dm +++ b/modular_skyrat/modules/shotgunrebalance/code/ammobox.dm @@ -77,9 +77,9 @@ ammo_type = /obj/item/ammo_casing/shotgun/incendiary max_ammo = 15 -/obj/item/ammo_box/advanced/s12gauge/honk - name = "Confetti ammo box" - desc = "A box of 35 shotgun shells. These ones contain harmless confetti, yippie!" +/obj/item/ammo_box/advanced/s12gauge/honkshot + name = "Confetti Honkshot ammo box" + desc = "A box of 35 shotgun shells." icon_state = "honk" - ammo_type = /obj/item/ammo_casing/shotgun/honk + ammo_type = /obj/item/ammo_casing/shotgun/honkshot max_ammo = 35 diff --git a/modular_skyrat/modules/shotgunrebalance/code/autolathe_design.dm b/modular_skyrat/modules/shotgunrebalance/code/autolathe_design.dm index a45c5df389d..3d097fe6f97 100644 --- a/modular_skyrat/modules/shotgunrebalance/code/autolathe_design.dm +++ b/modular_skyrat/modules/shotgunrebalance/code/autolathe_design.dm @@ -3,15 +3,23 @@ name = "Shotgun Slug" id = "shotgun_slug" build_type = AUTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/ammo_casing/shotgun - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) /datum/design/shotgun_slug/sec id = "sec_shotgun_slug" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) - category = list(RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY autolathe_exportable = FALSE @@ -19,40 +27,64 @@ name = "Buckshot Shell" id = "buckshot_shell" build_type = AUTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) build_path = /obj/item/ammo_casing/shotgun/buckshot - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + category = list( + RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) /datum/design/buckshot_shell/sec id = "sec_buckshot_shell" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) - category = list(RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY autolathe_exportable = FALSE //Existing Designs Discounting /datum/design/rubbershot - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) /datum/design/rubbershot/sec - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) /datum/design/beanbag_slug - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) /datum/design/beanbag_slug/sec - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) /datum/design/shotgun_dart - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) /datum/design/shotgun_dart/sec - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) /datum/design/incendiary_slug - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + ) /datum/design/incendiary_slug/sec - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm index c1ad1e6c082..a4e237b0f11 100644 --- a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm +++ b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm @@ -255,35 +255,33 @@ /obj/projectile/bullet/pellet/shotgun_improvised weak_against_armour = TRUE // We will not have Improvised are Better 2.0 -/obj/item/ammo_casing/shotgun/honk +/obj/item/ammo_casing/shotgun/honkshot name = "confetti shell" - desc = "A 12 gauge buckshot shell thats been filled to the brim with confetti. Who is making all these?" + desc = "A 12 gauge buckshot shell thats been filled to the brim with confetti, yippie!" icon_state = "honkshell" - projectile_type = /obj/projectile/bullet/pellet/shotgun_buckshot/honk + projectile_type = /obj/projectile/bullet/honkshot pellets = 12 variance = 35 fire_sound = 'sound/items/bikehorn.ogg' harmful = FALSE -/obj/projectile/bullet/pellet/shotgun_buckshot/honk +/obj/projectile/bullet/honkshot name = "confetti" damage = 0 - stamina = 1 - stamina_falloff_tile = 0 - wound_bonus = 0 - bare_wound_bonus = 0 + sharpness = NONE + shrapnel_type = NONE + impact_effect_type = null + ricochet_chance = 0 jitter = 1 SECONDS eyeblur = 1 SECONDS - sharpness = NONE hitsound = SFX_CLOWN_STEP - range = 12 + range = 4 icon_state = "guardian" - embedding = null -/obj/projectile/bullet/pellet/shotgun_buckshot/honk/Initialize(mapload) +/obj/projectile/bullet/honkshot/Initialize(mapload) . = ..() SpinAnimation() - range = rand(6, 12) + range = rand(1, 4) color = pick( COLOR_PRIDE_RED, COLOR_PRIDE_ORANGE, @@ -293,6 +291,19 @@ COLOR_PRIDE_PURPLE, ) -/obj/projectile/bullet/pellet/shotgun_buckshot/honk/on_range() +// This proc addition will spawn a decal on each tile the projectile travels over +/obj/projectile/bullet/honkshot/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + new /obj/effect/decal/cleanable/confetti(get_turf(old_loc)) + return ..() + +// This proc addition will make living humanoids do a flip animation when hit by the projectile +/obj/projectile/bullet/honkshot/on_hit(atom/target, blocked, pierce_hit) + if(!isliving(target)) + return ..() + target.SpinAnimation(7,1) + return ..() + +// This proc addition adds a spark effect when the projectile expires/hits +/obj/projectile/bullet/honkshot/on_range() do_sparks(1, TRUE, src) - ..() + return ..() diff --git a/modular_skyrat/modules/space_vines/scythes.dm b/modular_skyrat/modules/space_vines/scythes.dm index 3fe17ad3bae..a5011fdc6b0 100644 --- a/modular_skyrat/modules/space_vines/scythes.dm +++ b/modular_skyrat/modules/space_vines/scythes.dm @@ -63,15 +63,23 @@ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow." id = "scythet1" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/scythe/tier1 - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_BOTANY) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_BOTANY, + ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE /datum/design/scythe/tier2 name = "Scythe (Tier 2)" id = "scythet2" - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + ) build_path = /obj/item/scythe/tier2 /datum/techweb_node/scythe_t1 diff --git a/modular_skyrat/modules/stasisrework/code/medical_designs.dm b/modular_skyrat/modules/stasisrework/code/medical_designs.dm index 7ced4d0daf4..322af325716 100644 --- a/modular_skyrat/modules/stasisrework/code/medical_designs.dm +++ b/modular_skyrat/modules/stasisrework/code/medical_designs.dm @@ -3,9 +3,15 @@ desc = "A stasis body bag, powered by cryogenic stasis technology. It can hold only one body, but it prevents decay." id = "stasisbag" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/plasma = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT) build_path = /obj/item/bodybag/stasis - category = list(RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL) + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, + ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE /datum/design/board/stasissleeper @@ -13,5 +19,7 @@ desc = "The circuit board for a Stasis Unit" id = "stasissleeper" build_path = /obj/item/circuitboard/machine/stasissleeper - category = list(RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL) + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL, + ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/modular_skyrat/modules/stasisrework/code/stasissleeper.dm b/modular_skyrat/modules/stasisrework/code/stasissleeper.dm index dde2910bf04..be21887eed6 100644 --- a/modular_skyrat/modules/stasisrework/code/stasissleeper.dm +++ b/modular_skyrat/modules/stasisrework/code/stasissleeper.dm @@ -1,4 +1,3 @@ -#define SCANNER_VERBOSE 1 /obj/machinery/stasissleeper name = "lifeform stasis unit" desc = "A somewhat comfortable looking bed with a cover over it. It will keep someone in stasis." @@ -177,5 +176,3 @@ /obj/machinery/stasissleeper/attack_ai_secondary(mob/user) // this works for borgs and ais shrug attack_hand_secondary(user) - -#undef SCANNER_VERBOSE diff --git a/modular_skyrat/modules/stone/code/stone.dm b/modular_skyrat/modules/stone/code/stone.dm index 60b18ad1f44..21fb7c952b8 100644 --- a/modular_skyrat/modules/stone/code/stone.dm +++ b/modular_skyrat/modules/stone/code/stone.dm @@ -79,7 +79,7 @@ GLOBAL_LIST_INIT(stone_recipes, list ( \ inhand_icon_state = "tile" turf_type = /turf/open/floor/stone mineralType = "stone" - mats_per_unit = list(/datum/material/stone= SMALL_MATERIAL_AMOUNT * 5) + mats_per_unit = list(/datum/material/stone= HALF_SHEET_MATERIAL_AMOUNT) merge_type = /obj/item/stack/tile/mineral/stone /turf/open/floor/stone @@ -96,7 +96,9 @@ GLOBAL_LIST_INIT(stone_recipes, list ( \ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_STONE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS canSmoothWith = SMOOTH_GROUP_STONE_WALLS - custom_materials = list(/datum/material/stone = SHEET_MATERIAL_AMOUNT * 2) + custom_materials = list( + /datum/material/stone = SHEET_MATERIAL_AMOUNT * 2, + ) /turf/closed/wall/mineral/stone/try_decon(obj/item/item_used, mob/user) // Lets you break down stone walls with stone breaking tools if(item_used.tool_behaviour != TOOL_MINING) @@ -121,7 +123,9 @@ GLOBAL_LIST_INIT(stone_recipes, list ( \ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_STONE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS canSmoothWith = SMOOTH_GROUP_STONE_WALLS - custom_materials = list(/datum/material/stone = SHEET_MATERIAL_AMOUNT * 2) // Does this even need materials? + custom_materials = list( + /datum/material/stone = SHEET_MATERIAL_AMOUNT * 2, + ) /obj/structure/falsewall/stone name = "stone wall" diff --git a/modular_skyrat/modules/synths/code/bodyparts/ears.dm b/modular_skyrat/modules/synths/code/bodyparts/ears.dm index 841a69f9d58..904c103c392 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/ears.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/ears.dm @@ -38,8 +38,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/ears/synth category = list( diff --git a/modular_skyrat/modules/synths/code/bodyparts/eyes.dm b/modular_skyrat/modules/synths/code/bodyparts/eyes.dm index 82e32b918f6..afa938dfdd8 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/eyes.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/eyes.dm @@ -26,8 +26,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/eyes/synth category = list( diff --git a/modular_skyrat/modules/synths/code/bodyparts/heart.dm b/modular_skyrat/modules/synths/code/bodyparts/heart.dm index a17d99be2d7..f7c50fe602c 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/heart.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/heart.dm @@ -34,8 +34,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/heart/synth category = list( diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm index e28f7d7dd87..7b1fc4d7c3c 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm @@ -9,7 +9,7 @@ max_idle_programs = 3 - max_capacity = 32 + max_capacity = 64 /obj/item/modular_computer/pda/synth/Initialize(mapload) . = ..() @@ -114,3 +114,25 @@ Attacking a synth with an id loads it into its slot.. pain and probably shitcode robotbrain.internal_computer.interact(user) return return ..() + +/obj/item/modular_computer/pda/synth/get_header_data() + var/list/data = ..() + var/obj/item/organ/internal/brain/synth/brain_loc = loc + // Battery level is now according to the synth charge + if(istype(brain_loc)) + var/charge_level = (brain_loc.owner.nutrition / NUTRITION_LEVEL_ALMOST_FULL) * 100 + switch(charge_level) + if(80 to 110) + data["PC_batteryicon"] = "batt_100.gif" + if(60 to 80) + data["PC_batteryicon"] = "batt_80.gif" + if(40 to 60) + data["PC_batteryicon"] = "batt_60.gif" + if(20 to 40) + data["PC_batteryicon"] = "batt_40.gif" + if(5 to 20) + data["PC_batteryicon"] = "batt_20.gif" + else + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "[round(charge_level)]%" + return data diff --git a/modular_skyrat/modules/synths/code/bodyparts/liver.dm b/modular_skyrat/modules/synths/code/bodyparts/liver.dm index cd0f6bae037..5affa0f6ad6 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/liver.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/liver.dm @@ -34,8 +34,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/liver/synth category = list( diff --git a/modular_skyrat/modules/synths/code/bodyparts/lungs.dm b/modular_skyrat/modules/synths/code/bodyparts/lungs.dm index 69ff9d0dfcf..f972480f712 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/lungs.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/lungs.dm @@ -39,8 +39,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/lungs/synth category = list( diff --git a/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm b/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm index d3eec79e91b..c8ff5bb58f6 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/power_cord.dm @@ -38,7 +38,7 @@ to_chat(user, span_warning("There is no charge to draw from that APC.")) return - if(ipc.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) // BUBBER EDIT - original NUTRITION_LEVEL_WELL_FED + if(ipc.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) to_chat(user, span_warning("You are already fully charged!")) return @@ -62,7 +62,7 @@ user.visible_message(span_notice("[user] inserts a power connector into the [target_apc]."), span_notice("You begin to draw power from the [target_apc].")) while(TRUE) - var/power_needed = NUTRITION_LEVEL_ALMOST_FULL - user.nutrition // How much charge do we need in total? // BUBBER EDIT - original NUTRITION_LEVEL_WELL_FED - user.nutrition + var/power_needed = NUTRITION_LEVEL_ALMOST_FULL - user.nutrition // How much charge do we need in total? // Do we even need anything? if(power_needed <= SYNTH_CHARGE_MIN * 2) // Times two to make sure minimum draw is always lower than this margin to prevent potential needless loops. to_chat(user, span_notice("You are fully charged.")) diff --git a/modular_skyrat/modules/synths/code/bodyparts/stomach.dm b/modular_skyrat/modules/synths/code/bodyparts/stomach.dm index a8dfb30521e..80ba4fa5223 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/stomach.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/stomach.dm @@ -38,8 +38,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/stomach/synth category = list( diff --git a/modular_skyrat/modules/synths/code/bodyparts/tongue.dm b/modular_skyrat/modules/synths/code/bodyparts/tongue.dm index 1d64febe161..f181b07e284 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/tongue.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/tongue.dm @@ -28,8 +28,8 @@ 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/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/organ/internal/tongue/synth category = list( diff --git a/modular_skyrat/modules/tagline/code/world.dm b/modular_skyrat/modules/tagline/code/world.dm index f158b310640..1e3e74c783e 100644 --- a/modular_skyrat/modules/tagline/code/world.dm +++ b/modular_skyrat/modules/tagline/code/world.dm @@ -2,39 +2,33 @@ var/list/features = list() - var/s = "" + var/new_status = "" var/hostedby if(config) var/server_name = CONFIG_GET(string/servername) if (server_name) - s += "[server_name] — " + new_status += "[server_name] — " hostedby = CONFIG_GET(string/hostedby) - s += " (" - s += "
" - s += "Discord" - s += ")\]" - s += "
[CONFIG_GET(string/servertagline)]
" + new_status += " (" + new_status += "
" + new_status += "Discord" + new_status += ")\]" + new_status += "
[CONFIG_GET(string/servertagline)]
" - var/n = 0 - for (var/mob/M in GLOB.player_list) - if (M.client) - n++ + var/players = GLOB.clients.len if(SSmapping.config) features += "[SSmapping.config.map_name]" - if (n > 1) - features += "~[n] players" - else if (n > 0) - features += "~[n] player" + features += "~[players] player[players == 1 ? "": "s"]" if (!host && hostedby) features += "hosted by [hostedby]" - if (features) - s += "\[[jointext(features, ", ")]" + if(length(features)) + new_status += "\[[jointext(features, ", ")]" - status = s + status = new_status diff --git a/modular_skyrat/modules/tarkon/code/clothing/head.dm b/modular_skyrat/modules/tarkon/code/clothing/head.dm new file mode 100644 index 00000000000..c090d239a4d --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/clothing/head.dm @@ -0,0 +1,20 @@ +/obj/item/clothing/head/utility/welding/hat + name = "welder's hat" + desc = "A snug fitting flatcap with a wide welding visor" + worn_icon = 'modular_skyrat/modules/tarkon/icons/mob/clothing/head.dmi' + icon = 'modular_skyrat/modules/tarkon/icons/obj/clothing/head.dmi' + icon_state = "welderhat" + inhand_icon_state = "" //no unique inhands + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + custom_materials = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT*1.75, /datum/material/glass=SMALL_MATERIAL_AMOUNT * 4) + flash_protect = FLASH_PROTECTION_WELDER + tint = 2 + armor_type = /datum/armor/utility_welding + flags_inv = HIDEEARS|HIDEEYES + actions_types = list(/datum/action/item_action/toggle) + visor_flags_inv = HIDEEARS|HIDEEYES + visor_flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/utility/welding/hat/Initialize(mapload) + . = ..() + visor_toggling() diff --git a/modular_skyrat/modules/tarkon/code/clothing/mod.dm b/modular_skyrat/modules/tarkon/code/clothing/mod.dm new file mode 100644 index 00000000000..4da9d029bbe --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/clothing/mod.dm @@ -0,0 +1,111 @@ +/datum/mod_theme/tarkon + name = "tarkon" + desc = "A Tarkon Industries general protection suit, designed for port security and general EVA situations." + extended_desc = "A fourth-generational modular protection suit outfitted by Tarkon Industries, This suit is a safety standard for employees undertaking atmos-sensitive protection on jobs. Offering enough protection from impacts to combat most damage from cave-ins, its design has already been debted for saving dozens of employees from hazardous and unpredictable situations in both organic and inorganic forms." + default_skin = "tarkon" + armor_type = /datum/armor/mod_theme_tarkon + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + charge_drain = DEFAULT_CHARGE_DRAIN * 1.5 + inbuilt_modules = list(/obj/item/mod/module/magboot/advanced) + allowed_suit_storage = list( + /obj/item/flashlight, + /obj/item/tank/internals, + /obj/item/ammo_box, + /obj/item/ammo_casing, + /obj/item/restraints/handcuffs, + /obj/item/assembly/flash, + /obj/item/melee/baton, + /obj/item/knife/combat, + /obj/item/shield/riot, + /obj/item/gun, + ) + skins = list( + "tarkon" = list( + MOD_ICON_OVERRIDE = 'modular_skyrat/modules/tarkon/icons/obj/clothing/mod.dmi', + MOD_WORN_ICON_OVERRIDE = 'modular_skyrat/modules/tarkon/icons/mob/clothing/mod.dmi', + HELMET_FLAGS = list( + UNSEALED_LAYER = HEAD_LAYER, + UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_INVISIBILITY = HIDEHAIR|HIDEEYES|HIDESNOUT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDETAIL, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + ) + +/obj/item/mod/construction/plating/tarkon + theme = /datum/mod_theme/tarkon + icon = 'modular_skyrat/modules/tarkon/icons/obj/mod_construct.dmi' + icon_state = "tarkon-plating" + +/datum/armor/mod_theme_tarkon + melee = 25 + bullet = 15 + laser = 20 + energy = 15 + bomb = 10 + bio = 100 + fire = 100 + acid = 25 + wound = 10 + + +/obj/item/mod/control/pre_equipped/tarkon + theme = /datum/mod_theme/tarkon + applied_modules = list( + /obj/item/mod/module/storage/large_capacity, + /obj/item/mod/module/welding, + /obj/item/mod/module/clamp, + /obj/item/mod/module/tether, + ) + default_pins = list( + /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/clamp, + /obj/item/mod/module/tether, + ) + +/obj/machinery/suit_storage_unit/industrial/tarkon + mod_type = /obj/item/mod/control/pre_equipped/tarkon + +/////////// Prototype Hauler Suit + + +/datum/mod_theme/prototype/hauler + name = "Prototype: Hauler" + desc = "Bulky and quite heavy, This prototype modular suit has seemed to be modified quite a bit with additional supports to distribute its weight. The servos there within have been modified to handle the additional stress, but the loose wiring required an internal lining of rubberized insulation" + inbuilt_modules = list() + charge_drain = DEFAULT_CHARGE_DRAIN * 3 + siemens_coefficient = 0 + slowdown_active = 1 + +/obj/item/mod/control/pre_equipped/prototype/hauler + theme = /datum/mod_theme/prototype/hauler + req_access = list(ACCESS_TARKON) + applied_cell = /obj/item/stock_parts/cell/high + applied_modules = list( + /obj/item/mod/module/storage/large_capacity, + /obj/item/mod/module/welding, + /obj/item/mod/module/clamp, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/tether, + ) + +/obj/machinery/suit_storage_unit/industrial/hauler + mod_type = /obj/item/mod/control/pre_equipped/prototype/hauler diff --git a/modular_skyrat/modules/tarkon/code/clothing/neck.dm b/modular_skyrat/modules/tarkon/code/clothing/neck.dm new file mode 100644 index 00000000000..acb0dc8b31b --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/clothing/neck.dm @@ -0,0 +1,17 @@ +/obj/item/clothing/neck/security_cape/tarkon + name = "tarkon protection gauntlet" + desc = "A full-arm gauntlet used by Tarkon Industries to protect the main tool-arm of its employee's. Not that useful in a real fight, however." + worn_icon = 'modular_skyrat/modules/tarkon/icons/mob/clothing/neck.dmi' + icon = 'modular_skyrat/modules/tarkon/icons/obj/clothing/neck.dmi' + icon_state = "armplate_shemaugh" + uses_advanced_reskins = TRUE + unique_reskin = list( + "Caped Variant" = list( + RESKIN_ICON_STATE = "armplate_shemaugh", + RESKIN_WORN_ICON_STATE = "armplate_shemaugh" + ), + "Capeless Variant" = list( + RESKIN_ICON_STATE = "armplate", + RESKIN_WORN_ICON_STATE = "armplate" + ), + ) diff --git a/modular_skyrat/modules/tarkon/code/clothing/uniform.dm b/modular_skyrat/modules/tarkon/code/clothing/uniform.dm new file mode 100644 index 00000000000..73055103c2a --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/clothing/uniform.dm @@ -0,0 +1,47 @@ +/obj/item/clothing/under/tarkon + name = "tarkon general uniform" + desc = "A uniform worn by civilian-ranked crew, provided by Tarkon Industries." + icon = 'modular_skyrat/modules/tarkon/icons/obj/clothing/uniform.dmi' + worn_icon = 'modular_skyrat/modules/tarkon/icons/mob/clothing/uniform.dmi' + worn_icon_digi = 'modular_skyrat/modules/tarkon/icons/mob/clothing/uniform_digi.dmi' + icon_state = "tarkon" + body_parts_covered = CHEST|ARMS|GROIN|LEGS + armor_type = /datum/armor/clothing_under/tarkon + +/obj/item/clothing/under/tarkon/cargo + name = "tarkon cargo uniform" + desc = "A uniform worn by cargo-ranked crew, provided by Tarkon Industries." + icon_state = "tarkon_cargo" + +/obj/item/clothing/under/tarkon/sci + name = "tarkon research uniform" + desc = "A uniform worn by research-ranked crew, provided by Tarkon Industries." + icon_state = "tarkon_sci" + +/obj/item/clothing/under/tarkon/sec + name = "tarkon guard uniform" + desc = "A uniform worn by security-ranked crew, provided by Tarkon Industries." + icon_state = "tarkon_sec" + armor_type = /datum/armor/clothing_under/tarkon + +/obj/item/clothing/under/tarkon/med + name = "tarkon medical uniform" + desc = "A uniform worn by medical-ranked crew, provided by Tarkon Industries." + icon_state = "tarkon_med" + +/obj/item/clothing/under/tarkon/eng + name = "tarkon maintenance uniform" + desc = "A uniform worn by maintenance-ranked crew, provided by Tarkon Industries." + icon_state = "tarkon_engi" + +/obj/item/clothing/under/tarkon/com + name = "tarkon command uniform" + desc = "A uniform worn by command-ranked crew, provided by Tarkon Industries." + icon_state = "tarkon_com" + armor_type = /datum/armor/clothing_under/tarkon + +/datum/armor/clothing_under/tarkon + melee = 10 + fire = 50 + acid = 50 + wound = 10 diff --git a/modular_skyrat/modules/projectiles/code/guns/misc/m6pdw.dm b/modular_skyrat/modules/tarkon/code/guns/m6pdw.dm similarity index 77% rename from modular_skyrat/modules/projectiles/code/guns/misc/m6pdw.dm rename to modular_skyrat/modules/tarkon/code/guns/m6pdw.dm index d4c367bafdf..d9dfccd1df1 100644 --- a/modular_skyrat/modules/projectiles/code/guns/misc/m6pdw.dm +++ b/modular_skyrat/modules/tarkon/code/guns/m6pdw.dm @@ -3,11 +3,11 @@ /obj/item/gun/ballistic/automatic/m6pdw name = "\improper M6 Personal Defense Weapon" desc = "A PDW designed to be used within close to medium range. Its slide seems to stick a bit, having years of dust accumulation, And its manufacturer stamp and symbols have been scratched out." - icon = 'modular_skyrat/modules/projectiles/icons/m6pdw.dmi' + icon = 'modular_skyrat/modules/tarkon/icons/obj/guns/m6pdw.dmi' icon_state = "m6_pdw" inhand_icon_state = "m6_pdw" - righthand_file = 'modular_skyrat/modules/projectiles/icons/inhands/righthand.dmi' - lefthand_file = 'modular_skyrat/modules/projectiles/icons/inhands/lefthand.dmi' + righthand_file = 'modular_skyrat/modules/tarkon/icons/mob/guns/m6pdw/righthand.dmi' + lefthand_file = 'modular_skyrat/modules/tarkon/icons/mob/guns/m6pdw/lefthand.dmi' w_class = WEIGHT_CLASS_NORMAL spawnwithmagazine = FALSE accepted_magazine_type = /obj/item/ammo_box/magazine/c35sol_pistol diff --git a/modular_skyrat/modules/tarkon/code/guns/resonance_disruptor.dm b/modular_skyrat/modules/tarkon/code/guns/resonance_disruptor.dm new file mode 100644 index 00000000000..dad9ad4bc1f --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/guns/resonance_disruptor.dm @@ -0,0 +1,163 @@ +/// Yes. This is a lot of code frankensteining. I am not proud of my work but damned am i proud it works... Atleast if you're seeing this it works. + +/obj/item/gun/energy/recharge/resonant_system + name = "A.R.C.S Resonator" + desc = "The \"Advanced Resonance Control System\" or \"A.R.C.S\" is an advanced, ranged version of a mining resonator. While its main case looks nothing more fancy than a modified proto-kinetic accelerator... One could guess thats not far off the truth. The lugs for a bayonette are missing, but atleast you can play with the new adjustment dial on the side." + icon = 'modular_skyrat/modules/tarkon/icons/misc/ARCS.dmi' + righthand_file = 'modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/righthand.dmi' + lefthand_file = 'modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/lefthand.dmi' + icon_state = "arcs" + base_icon_state = "arcs" + inhand_icon_state = "arcs" + ammo_type = list(/obj/item/ammo_casing/energy/resonance) + item_flags = NONE + obj_flags = UNIQUE_RENAME + weapon_weight = WEAPON_LIGHT + gun_flags = NOT_A_REAL_GUN + /// the mode of the resonator; has three modes: auto (1), manual (2), and matrix (3) + var/mode = RESONATOR_MODE_AUTO + /// How devestating it is in manual mode. Yes, this is all copied from the resonator item + var/quick_burst_mod = 1.3 + /// the number of fields the resonator is allowed to have at once + var/fieldlimit = 5 + /// the list of currently active fields from this resonator + var/list/fields = list() + /// the number that is added to the failure_prob, which is the probability of whether it will spread or not + var/adding_failure = 30 + +/obj/item/gun/energy/recharge/resonant_system/attack_self(mob/user) + if(mode == RESONATOR_MODE_AUTO) + to_chat(user, span_info("You set the resonator's fields to detonate only after you hit one with it.")) + mode = RESONATOR_MODE_MANUAL + else + to_chat(user, span_info("You set the resonator's fields to automatically detonate after 2 seconds.")) + mode = RESONATOR_MODE_AUTO + +/obj/item/gun/energy/recharge/resonant_system/proc/modify_projectile(obj/projectile/resonant_bolt/bolt) + bolt.firing_gun = src //do something special on-hit, easy! + +/obj/item/ammo_casing/energy/resonance + projectile_type = /obj/projectile/resonant_bolt + select_name = "kinetic" + e_cost = LASER_SHOTS(1, STANDARD_CELL_CHARGE * 0.5) + fire_sound = 'sound/weapons/kinetic_accel.ogg' + +/obj/item/ammo_casing/energy/resonance/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + ..() + if(loc && istype(loc, /obj/item/gun/energy/recharge/resonant_system)) + var/obj/item/gun/energy/recharge/resonant_system/firer = loc + firer.modify_projectile(loaded_projectile) + +/obj/projectile/resonant_bolt + name = "resonating pulse" + icon_state = "pulse1" + damage = 0 //Damage will be done via delayed blast + damage_type = BRUTE + armor_flag = BOMB //Shockwave as opposed to physical mass + range = 6 + log_override = TRUE + var/obj/item/gun/energy/recharge/resonant_system/firing_gun = null + +/obj/projectile/resonant_bolt/on_hit(atom/target, blocked = 0, pierce_hit) + var/hit_target = FALSE + if(isliving(target)) + var/mob/living/idiot = target + if(idiot.has_status_effect(/datum/status_effect/resonant_link)) + var/datum/status_effect/resonant_link/blaster = idiot.has_status_effect(/datum/status_effect/resonant_link) + blaster.detonate() + blaster.Destroy() + else + var/datum/status_effect/resonant_link/connection = idiot.apply_status_effect(/datum/status_effect/resonant_link, firing_gun) + if(firing_gun) + connection.mode = firing_gun.mode + connection.quick_burst_mod = firing_gun.quick_burst_mod + connection.creator = firer + if(firing_gun.mode == RESONATOR_MODE_AUTO) + connection.duration = world.time + 20 + connection.autodet = TRUE + hit_target = TRUE + var/target_turf = get_turf(target) + var/obj/effect/temp_visual/resonance/resonance_field = locate(/obj/effect/temp_visual/resonance) in target_turf + if(resonance_field) + if(!hit_target) + resonance_field.damage_multiplier = firing_gun.quick_burst_mod + resonance_field.burst() + hit_target = TRUE + return + if(LAZYLEN(firing_gun.fields) < firing_gun.fieldlimit) + if(!hit_target) + new /obj/effect/temp_visual/resonance(target_turf, firer, firing_gun, firing_gun.mode, firing_gun.adding_failure) + ..() + +/datum/status_effect/resonant_link + id = "resonant_link" + duration = 300 //Resonance can only stay for so long, if it doesn't break from activation + status_type = STATUS_EFFECT_UNIQUE + alert_type = null //Visual cue + general context is enough + processing_speed = STATUS_EFFECT_NORMAL_PROCESS + var/mutable_appearance/marked_underlay + var/obj/item/gun/energy/recharge/resonant_system/firing_gun = null + var/damage_name = "resonant_force" + var/mode = null + var/quick_burst_mod = null + var/resonance_damage = 15 + var/damage_multiplier = 1 + var/mob/creator + var/autodet = FALSE + +/datum/status_effect/resonant_link/on_creation(mob/living/new_owner, obj/item/gun/energy/recharge/resonant_system/new_firing_gun) + . = ..() + if(.) + firing_gun = new_firing_gun + +/datum/status_effect/resonant_link/on_apply() + if(owner.mob_size >= MOB_SIZE_SMALL) // needs a minimal mass to resonate with. + if(autodet) + marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") + else + marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield1") + marked_underlay.pixel_x = -owner.pixel_x + marked_underlay.pixel_y = -owner.pixel_y + owner.underlays += marked_underlay + return TRUE + return FALSE + +/datum/status_effect/resonant_link/on_remove() + . = ..() + if(autodet) + detonate() + +/datum/status_effect/resonant_link/proc/check_pressure(turf/proj_turf) + if(!proj_turf) + proj_turf = get_turf(owner.loc) + resonance_damage = initial(resonance_damage) + if(lavaland_equipment_pressure_check(proj_turf)) + damage_name = "strong [initial(damage_name)]" + resonance_damage *= 3 + else + damage_name = initial(damage_name) + resonance_damage *= damage_multiplier + +/datum/status_effect/resonant_link/proc/detonate() + SIGNAL_HANDLER + var/turf/src_turf = get_turf(src) + playsound(src_turf, 'sound/weapons/resonator_blast.ogg', 50, TRUE) + check_pressure(src_turf) + if(creator) + log_combat(creator, owner, "used a resonator field on", "resonator") + SEND_SIGNAL(creator, COMSIG_LIVING_RESONATOR_BURST, creator, owner) + to_chat(owner, span_userdanger("[src] detonated with you in it!")) + owner.apply_damage(resonance_damage, BRUTE) + owner.add_movespeed_modifier(/datum/movespeed_modifier/resonance) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/resonance), 10 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + +/datum/status_effect/resonant_link/Destroy() + firing_gun = null + if(owner) + owner.underlays -= marked_underlay + QDEL_NULL(marked_underlay) + return ..() + +/datum/status_effect/resonant_link/be_replaced() + owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point + ..() diff --git a/modular_skyrat/modules/mapping/code/tarkon_atmos_control.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/atmos_control.dm similarity index 100% rename from modular_skyrat/modules/mapping/code/tarkon_atmos_control.dm rename to modular_skyrat/modules/tarkon/code/misc-fluff/atmos_control.dm diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm new file mode 100644 index 00000000000..aa47c9787b4 --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm @@ -0,0 +1,112 @@ +/datum/id_trim/away/tarkon + assignment = "P-T Deck Worker" + access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) + department_color = COLOR_WHITE + department_state = "department" + subdepartment_color = COLOR_DARK_CYAN + sechud_icon_state = SECHUD_UNKNOWN + trim_state = "trim_unknown" + +/obj/item/card/id/advanced/tarkon + name = "Tarkon deck access pass" + desc = "A dust-collected visitors pass, A small tagline reading \"Port Tarkon, The first step to Civilian Partnership in Space Homesteading\"." + icon = 'modular_skyrat/modules/tarkon/icons/misc/card.dmi' + icon_state = "tarkon" + trim = /datum/id_trim/away/tarkon + assigned_icon_state = "assigned_tarkon" + +/datum/id_trim/away/tarkon/cargo + assignment = "P-T Cargo Personnel" + access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) + department_color = COLOR_DARK_BROWN + department_state = "department" + sechud_icon_state = SECHUD_CARGO_TECHNICIAN + trim_state = "trim_cargotechnician" + +/obj/item/card/id/advanced/tarkon/cargo + name = "P-T cargo hauler's access card" + desc = "An access card designated for \"cargo's finest\". You're also a part time space miner, when cargonia is quiet." + trim = /datum/id_trim/away/tarkon/cargo + +/datum/id_trim/away/tarkon/sec + assignment = "P-T Port Guard" + access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) + department_color = COLOR_DARK_RED + sechud_icon_state = SECHUD_SECURITY_OFFICER + trim_state = "trim_securityofficer" + +/obj/item/card/id/advanced/tarkon/sec + name = "P-T resident deputy's access card" + desc = "An access card designated for \"security members\". Everyone wants your guns, partner. Yee-haw." + trim = /datum/id_trim/away/tarkon/sec + + +/datum/id_trim/away/tarkon/med + assignment = "P-T Trauma Medic" + access = list(ACCESS_MEDICAL, ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) + department_color = COLOR_MEDICAL_BLUE + sechud_icon_state = SECHUD_MEDICAL_DOCTOR + trim_state = "trim_medicaldoctor" + +/obj/item/card/id/advanced/tarkon/med + name = "P-T trauma medic's access card" + desc = "An access card designated for \"medical staff\". You provide the medic bags." + trim = /datum/id_trim/away/tarkon/med + +/datum/id_trim/away/tarkon/eng + assignment = "P-T Maintenance Crew" + department_color = COLOR_ENGINEERING_ORANGE + sechud_icon_state = SECHUD_STATION_ENGINEER + trim_state = "trim_stationengineer" + +/obj/item/card/id/advanced/tarkon/engi + name = "P-T maintenance engineer's access card" + desc = "An access card designated for \"engineering staff\". You're going to be the one everyone points at to fix stuff, lets be honest." + trim = /datum/id_trim/away/tarkon/eng + +/datum/id_trim/away/tarkon/sci + assignment = "P-T Field Researcher" + access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) + department_color = COLOR_SCIENCE_PINK + sechud_icon_state = SECHUD_SCIENTIST + trim_state = "trim_scientist" + +/obj/item/card/id/advanced/tarkon/sci + name = "P-T field researcher's access card" + desc = "An access card designated for \"the science team\". You are forgotten basically immediately when it comes to the lab." + trim = /datum/id_trim/away/tarkon/sci + +/datum/id_trim/away/tarkon/robo + access = list(ACCESS_ROBOTICS) + +/obj/item/card/id/away/tarkonrobo + name = "Tarkon Robotics Card" + desc = "An access card designed to access robot's access ports, provided by Tarkon Industries." + icon = 'modular_skyrat/modules/tarkon/icons/misc/card.dmi' + icon_state = "robotics" + trim = /datum/id_trim/away/tarkon/robo + +/datum/id_trim/away/tarkon/ensign + assignment = "Tarkon Ensign" + access = list(ACCESS_MEDICAL, ACCESS_ROBOTICS, ACCESS_AWAY_GENERAL, ACCESS_TARKON, ACCESS_WEAPONS) + department_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_BLUESHIELD + trim_icon = 'modular_skyrat/master_files/icons/obj/card.dmi' + trim_state = "trim_blueshield" + +/obj/item/card/id/advanced/tarkon/ensign + name = "Tarkon ensign's access card" + desc = "An access card designated for \"Tarkon ensign\". No one has to listen to you... But you're the closest there is for command around here." + trim = /datum/id_trim/away/tarkon/ensign + +/datum/id_trim/away/tarkon/director + assignment = "Port Tarkon Director" + access = list(ACCESS_MEDICAL, ACCESS_ROBOTICS, ACCESS_AWAY_GENERAL, ACCESS_TARKON, ACCESS_WEAPONS) + department_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_CAPTAIN + trim_state = "trim_captain" + +/obj/item/card/id/advanced/tarkon/director + name = "Tarkon port director's access card" + desc = "An access card designated for \"Tarkon's Port Director\". Its no longer hesitation, only consideration." + trim = /datum/id_trim/away/tarkon/director diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/fluff.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/fluff.dm new file mode 100644 index 00000000000..f72fc0a99d3 --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/fluff.dm @@ -0,0 +1,128 @@ +/obj/item/tape/ruins/tarkon //A passing message from the late officer. + name = "dusty tape" + icon_state = "tape_greyscale" + desc = "An old, dusty tape with a small, faded stamp, reading \"Cleanup Chatter.\"... Should definitely be flipped if not being read when played." + + used_capacity = 380 + storedinfo = list( + 1 = "The universal recorder says, \"Recording started.\"", + 2 = "Officer ??? says, \"... Yeesh... Its good we got here when we did...\"", + 3 = "Janitor ??? sighs, \"Could have done sooner... Bloke got at me while i went to repaint the stripe on the floor\"", + 4 = "Officer ??? sighs, \"I still need to talk to the Site Director about getting the safe moved... Its better than the cell, And the shutters are nice...\"", + 5 = "Janitor ??? scoffs, \"Yeah, Another set of shutter tracks i'll have to clean out so they dont jam up...\"", + 6 = "Officer ??? grumbles, \"If you dont like bucket work, You could go with the mining crew\"", + 7 = "Janitor ??? groans, \"... Atleast it wouldn't be one of the directors cleansing squads. Those bugs... They've been active recently, can hear them under the halls.\"", + 8 = "The universal recorder says, \"Recording stopped.\"" + ) + timestamp = list( + 1 = 0, + 2 = 30, + 3 = 130, + 4 = 180, + 5 = 230, + 6 = 280, + 7 = 330, + 8 = 380 + ) + +/obj/item/tape/ruins/tarkon/safe //A tape recorded by the foreman. + icon_state = "tape_greyscale" + desc = "An old tape with a label, \"Exchange with the Science Leader\"... Should definitely be flipped if not being read when played." + + used_capacity = 380 + storedinfo = list( + 1 = "The universal recorder says, \"Recording started.\"", + 2 = "Foreman ??? sighs, \"Right... Research near finish? Need to stash this back between the solar batteries before I sleep..\"", + 3 = "Science Lead ??? says, \"We're getting the atmospheric scans done... Its definitely an odd find.\"", + 4 = "Foreman ??? grumbles, \"We've been finding some weird stuff in those tunnels.. Its a shame the machines framing was broken.\"", + 5 = "Science Lead ??? pauses then sighs out, \"Yeah... Best we could figure from the wreckage was some sort of focusing device for a crystal..?\"", + 6 = "Foreman ??? scoffs, \"... A crystal?\"", + 7 = "Foreman ??? quips, \"Yes... We have some possible- Ah... The scan finished.. I'm sure you'd rather get to rest than listen to my ramble, so just go.\"", + 8 = "The universal recorder says, \"Recording stopped.\"" + ) + timestamp = list( + 1 = 0, + 2 = 30, + 3 = 130, + 4 = 180, + 5 = 230, + 6 = 280, + 7 = 330, + 8 = 380 + ) + +/obj/item/tape/ruins/tarkon/celebration //A tape recorded by the ensign during the mid-construction celebration. + icon_state = "tape_greyscale" + desc = "An old tape with a label, \"Celebrations were a mistake\", writen shakily in red pen.. Should definitely be flipped if not being read when played." + + used_capacity = 380 + storedinfo = list( + 1 = "The universal recorder says, \"Recording started.\"", + 2 = "Drinks can be heard clinking together, busy chatter of a party drowning out most noises", + 3 = "Ensign ??? says, \"Hey, HEY! Everyone! Shut up for a toast!\"", + 4 = "The boistrous cheering can be heard slowly calming down to an eerie silence.", + 5 = "Ensign ??? clears their throat then starts to announce, \"As you've all known.. Its been years since this project started... Bright minds and talented engineers hand in hand working on this project...\"", + 6 = "Ensign ??? says pointedly, \"And after five long years, Tarkon Industries has had its first success. The driver finding a suitable asteroid, And making its mark known by carving out the current docking bay for our transport.\"", + 7 = "Ensign ??? announces, \"Yesterday, We've worked, Toiled in the rock and sand of what is our new home... But today! We celebrate, For Tarkons first success, And for a bright future in the next century! The Twenty-Sixth century is looking bright for us!\"", + 8 = "The universal recorder says, \"Recording stopped.\"" + ) + timestamp = list( + 1 = 0, + 2 = 30, + 3 = 130, + 4 = 180, + 5 = 230, + 6 = 280, + 7 = 330, + 8 = 380 + ) + +/* ----------------- Fluff/Paper ----------------- */ + +/obj/item/paper/fluff/ruins/tarkon + name = "paper - 'Engineering Report'" + default_raw_text = "Void Damn the last crew

Everything was a fucking mess- There was a FUCKING HOLE through the haul to science!

THANKFULLY, The new RCD design came in handy... I swear- They might have taken that artifact and gave me something thats arguably worse... But, Science reassured that they can replace it if i break it... And they gave me that circuitboard they've been stashing, Set it with the blueprints in the solar SMES safe... Felt like a good spot." + +/obj/item/paper/fluff/ruins/tarkon/goals + name = "paper - 'Tarkon Industries'" + default_raw_text = "

Tarkon Industries Informative Guide



We at Tarkon Industries hope to create a long guided future for the average homesteader, creating a living space for the average spacer to settle down in, create future investments for traders, or even up to get people to make large communities among asteroid belts.

Our greatest engineers have been working day, night, morning and evenings to create a stable, structurally sound system to start implanting stations, living areas and ports upon asteroids and planetoids too small to sustain life on the same level that of a goldie-lock planet.

Having great pride in our heritage we have taken our industrious, communicative past to create a future for our kin, Inspiring better feats, further research and larger projects upon future generations.

Looking to help? Then you can visit us at the Tarkon Industries Headquarters, The active co-ordinants can be detected starting around the Orion Belt, and we are actively accepting bright minds and great workers to help us.


Tarkon Industries: Building the future, nail by nail, asteroid by asteroid. 2456-2500(c)" + +/obj/item/paper/fluff/ruins/tarkon/vaulter + name = "paper - 'Tarkon Vaulter'" + default_raw_text = "

Tarkon Industries Designs:


Tarkon Vaulter Prototype



Designed HEAVILY after the Driver, The vaulter is of a similar concept, but at a much larger scale. Designed to work on larger planetoids and even moon and similar planetary satellites, The Tarkon Vaulter is another step towards Space Homesteading. Where the Driver and Vaulter split, however, is where the construction system lies. With the Vaulter, The construction is much more vertical in construction, starting by usually creating a cavern underneath its landing where a main room is constructed, and shortly after an elevator is deployed.

Where the Driver relies on early construction of an additional power system, The vaulter is planned to have a much higher RTG count so that it may power the initial base construction, But the cost of which being making it much larger and with a much higher material storage needed so it can construct a decent area of operation on its first trip. With the Driver in its early testing phase, We are hoping to better tune its designs before shifting attention towards the driver, which have high hopes to enter testing in the early twenty-sixth century" + +/obj/item/paper/fluff/ruins/tarkon/driverpitch + name = "paper - 'Tarkon Driver'" + default_raw_text = "

Tarkon Industries Designs:


Tarkon Driver Prototype



Seeing the success of space-based mining, We at Tarkon Industries wish to expand on the thought of a drill to a much larger goal, By mounting a drill and several cams to secur it in place, The Driver is designed to implant itself within the side of a large asteroid or small planetoid, Drilling out an area before the drill can be expanded out and slowly recycled to start construction of an operation base.

With the first area dug the first priority should be an additional energy-producing area, or a portable generator to help fuel energy for future mining, Which should be done to slowly hollow out the planetoid and constructing walls, floors and ceilings. After the driver is properly cammed in place, the back part of it can be unhitched, allowing it to act as a ferry shuttle for materials, workforce or tools.

With our first Tarkon Driver being ready to test in 2479, We have found a suitable asteroid, and hope to make connection to it by the start of 2480." + +/obj/item/paper/fluff/ruins/tarkon/detain + name = "paper - 'Tarkon Detainment Record'" + default_raw_text = "

Tarkon Industries Detainment Record:



Detainee:Arcus Vilkov
Rank/Occupation:Junior Scientist
Reason: Attemptive sabotage of a working generator

Detainee:Tilber Sinns
Rank/Occupation:Apprentice Miner
Reason:Detonated a volatile rock cluster close to a wall, Causing 3 hours of reconstruction.

Detainee:Gearalt Antonov
Rank/Occupation:Engineer Specialist
Reason:Public Intoxication

Detainee:Minke Arntz
Rank/Occupation:Field Researcher
Reason:Deconstructed an M6 to study the effects of space dust on ballistic firearms.

Detainee:Renanta McCrory
Rank/Occupation:Medical Surgeon
Reason:Medical Malpractice, Swapped the thumbs of a patient with their big toes. Removed from Premises." + +/obj/item/paper/fluff/ruins/tarkon/scisafe + name = "paper - 'Science safe notice'" + default_raw_text = "Until further notice, we are not handing out the code to the safe.

Whoever took the research item is getting their ass thrown to the next cleansing squad.

Yes, Its still in the surgery room.
Yes, its code has been reset." + +/obj/item/paper/fluff/ruins/tarkon/cargosafe + name = "paper - 'Cargo safe note'" + default_raw_text = "Hey... Director wasn't happy about bumping their head on the table trying to check funding, so we moved it into the warehouse.
Check in the owlcove by the air alarm, make sure to paint the tiling when you're finished.
P.S: 50 credits if you can write the code down" + +/obj/item/paper/fluff/ruins/tarkon/sop + name = "paper - 'Tarkon Security S.O.P'" + default_raw_text = "Hey there, lawman. As you might be aware, We dont have full faculties to hold prisoners for long-term storage... Atleast not without some governments throwing a shit-fit. So, Here's what we do.

If someone is tresspassing, We ask where they come from. Apparently there's a nearby station, So... Chances are they're from there. Aslong as you dont have to shoot them, You only hold them for questioning.

If its one of our own, Well... You'll officially be on Warden duty and have to feed them. Tough shit. You can always ask them if they want thrown to the void with whatever they're offered, Just be warned you're on note for anything of major importance.

Lastly, You aren't to hold people that aren't wanting to be on the port. You may take any and every measure to make sure they dont come back if they are let out, Including dropping them in space or at the nearest station." + +/obj/item/paper/fluff/ruins/tarkon/arcs + name = "paper - 'Tarkon Industries' Advanced Resonance Control System'" + default_raw_text = "

Tarkon Industries Designs:


Advanced Resonance Control System



Having used and seen fault with standard 'Resonators' We at Tarkon Industries took a look at it and bog-standard mining equipment of the modern day. Having come acrossed a so called \"Proto-kinetic Accelerator\", Our engineers got to work deconstructing, reconstructing, modifying and ultimately creating a system we are proud of.

Capable of switching between self-activating and twin-cycle activation, we've made a system that compresses the silicate dusts with-in space to a thin shard capable of transfering vast amounts of energy through \"Piezoelectric Resonance\", imbuing the crystal with enough energy that it vibrates at such a briefly stable magnitude, being capable of switching between a self-tearing frequency, or a more destructive frequency that requires a second trigger.

As a safety note: We request that any miners turn the safety on while coming in the station, As the brief stability of the shards are capable of transfering their resonant energy to organics." + +/obj/item/paper/fluff/ruins/tarkon/trcd + name = "paper - 'Tarkon Industries' Engineered RCD'" + default_raw_text = "

Tarkon Industries Designs:


Advanced R.C.D Design Upgrade



Being an Industry that deals with Architectural Engineering, Station construction, and Port maintenance We at Tarkon Industries took a look at the tooks we provide, and found them wanting. A standard RCD is capable of not much, And while we couldn't manage to expand their designs to make stronger walls (Yet. We strive to improve), We have made a breakthrough with the recent discovery of \"Bluespace Quantum Entanglement.\"

Using bluespace as a vessel for quantum-entangling the RCD's constructing-mechanism, we've designed a tool that allows our engineers to construct port additions, fix breaches, or even construct airlocks beyond arms length.

While we're not able to re-create the efficiency or material space of the \"artifact\" we were given, We have returned it to the cargo hold of the port that has let us analyze it, along with an updated RCD model so that they may put the artifact on display rahter than to use." + +/obj/item/paper/fluff/ruins/tarkon/comsafe + name = "paper - 'Command Safe Note'" + default_raw_text = "Heh... I couldn't handle letting those older papers go, something about them reminded me about why I jumped on this job. The \"Safety of the future\" spiels... Now? Any dingbat can buy their own little constructor in a box... Fancy that we got one ourself, Thing has some handy designs..

Well- That asside, we did get some new updated circuit boards. Industry standard gave us two sets of research constructor boards for redundancy, So we set the spare set in the special safe within the comms room." + +/obj/item/areaeditor/blueprints/tarkon + desc = "Blueprints of the Tarkon surface breaching drill and several Tarkon base designs. Red, stamped text reads \"Confidential\" on the backside of it." + name = "Tarkon Design Prints" diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/radio.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/radio.dm new file mode 100644 index 00000000000..cfd8a34e5ae --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/radio.dm @@ -0,0 +1,10 @@ +/obj/item/radio/headset/tarkon + name = "tarkon headset" + freerange = TRUE + freqlock = TRUE + keyslot = new /obj/item/encryptionkey/headset_cargo/tarkon + +/obj/item/radio/headset/tarkon/command //spoiler for upcoming update + name = "tarkon command headset" + desc = "A headset personally handed to trusted crew of Tarkon. It fills you with will to do... Something." + command = TRUE diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm new file mode 100644 index 00000000000..27a997f19ce --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/research.dm @@ -0,0 +1,120 @@ +///// First we enstate a techweb so we can add the node. ///// + +/datum/techweb/tarkon + id = "TARKON" + organization = "Tarkon Industries" + should_generate_points = TRUE + +/datum/techweb/tarkon/New() + . = ..() + research_node_id("oldstation_surgery", TRUE, TRUE, FALSE) + research_node_id("tarkontech", TRUE, TRUE, FALSE) + +/datum/techweb_node/tarkon + id = "tarkontech" + display_name = "Tarkon Industries Technology" + description = "Tools used by Tarkon Industries." + required_items_to_unlock = list( + /obj/item/mod/construction/plating/tarkon, + /obj/item/construction/rcd/arcd/tarkon, + /obj/item/gun/energy/recharge/resonant_system, + ) + design_ids = list( + "mod_plating_tarkon", + "arcs", + "rcd_tarkon" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) + hidden = TRUE + +/datum/design/mod_plating/tarkon + name = "MOD Tarkon Plating" + id = "mod_plating_tarkon" + build_path = /obj/item/mod/construction/plating/tarkon + materials = list( + /datum/material/iron =SHEET_MATERIAL_AMOUNT*3, + /datum/material/uranium =SHEET_MATERIAL_AMOUNT, + /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT, + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + research_icon_state = "tarkon-plating" + research_icon = 'modular_skyrat/modules/tarkon/icons/obj/mod_construct.dmi' + +/datum/design/arcs + name = "A.R.C.S Resonator" + id = "arcs" + build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT*5, + /datum/material/glass =SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver =SHEET_MATERIAL_AMOUNT * 2, + /datum/material/uranium =SHEET_MATERIAL_AMOUNT * 2, + /datum/material/diamond =SHEET_MATERIAL_AMOUNT + ) + build_path = /obj/item/gun/energy/recharge/resonant_system + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MINING + ) + departmental_flags = DEPARTMENT_BITFLAG_CARGO + +/datum/design/tarkonrcd + name = "Tarkon R.C.D" + desc = "A Rapid Construction Device made by Tarkon Industries. Capable of ranged construction." + id = "rcd_tarkon" + build_type = PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/iron =SHEET_MATERIAL_AMOUNT*30, + /datum/material/glass =SHEET_MATERIAL_AMOUNT * 10, + /datum/material/uranium =SHEET_MATERIAL_AMOUNT * 4, + /datum/material/diamond =SHEET_MATERIAL_AMOUNT * 2, + /datum/material/bluespace = SHEET_MATERIAL_AMOUNT * 3 + ) + build_path = /obj/item/construction/rcd/arcd/tarkon + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING_ADVANCED + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +///// Now we make the physical server ///// + +/obj/item/circuitboard/machine/rdserver/tarkon + name = "Tarkon Industries R&D Server" + build_path = /obj/machinery/rnd/server/tarkon + +/obj/machinery/rnd/server/tarkon + name = "\improper Tarkon Industries R&D Server" + circuit = /obj/item/circuitboard/machine/rdserver/tarkon + req_access = list(ACCESS_AWAY_SCIENCE) + +/obj/machinery/rnd/server/tarkon/Initialize(mapload) + register_context() + var/datum/techweb/tarkon_techweb = locate(/datum/techweb/tarkon) in SSresearch.techwebs + stored_research = tarkon_techweb + return ..() + +/obj/machinery/rnd/server/tarkon/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(held_item && istype(held_item, /obj/item/research_notes)) + context[SCREENTIP_CONTEXT_LMB] = "Generate research points" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/rnd/server/tarkon/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/research_notes) && stored_research) + var/obj/item/research_notes/research_notes = attacking_item + stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = research_notes.value)) + playsound(src, 'sound/machines/copier.ogg', 50, TRUE) + qdel(research_notes) + return + return ..() + +/obj/machinery/rnd/production/protolathe/tarkon + name = "Tarkon Industries Protolathe" + desc = "Converts raw materials into useful objects. Refurbished and updated from its previous, limited capabilities." + circuit = /obj/item/circuitboard/machine/protolathe/tarkon + stripe_color = "#350f04" + charges_tax = FALSE + +/obj/item/circuitboard/machine/protolathe/tarkon + name = "Tarkon Industries Protolathe" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/rnd/production/protolathe/tarkon diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm new file mode 100644 index 00000000000..81a48274483 --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm @@ -0,0 +1,278 @@ +//Port Tarkon, 8 people trapped in a revamped charlie-station like ghost role. Survive the aliens and threats, Fix the port and/or finish construction + +/obj/effect/mob_spawn/ghost_role/human/tarkon + name = "Port Tarkon Crew Member" + prompt_name = "a port deck worker" + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + you_are_text = "You are a member of Tarkon Industries, recently assigned to a recently recovered asset known as Port Tarkon. Your supervisors are the Ensign and Site Director." + flavour_text = "On the recently reclaimed Port Tarkon, You are tasked to help finish construction and carry on any tasks given by the site director. It may be best to look at your departmental noteboard. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" + important_text = "You are not to abandon Port Tarkon. Check other sleepers for alternative jobs. Listen to the Site Director and Ensign." + outfit = /datum/outfit/tarkon + spawner_job_path = /datum/job/tarkon + loadout_enabled = TRUE + quirks_enabled = TRUE + random_appearance = FALSE + computer_area = /area/ruin/space/has_grav/port_tarkon + +/datum/outfit/tarkon + name = "default port tarkon outfit" + uniform = /obj/item/clothing/under/tarkon + head = /obj/item/clothing/head/utility/welding/hat + back = /obj/item/storage/backpack + backpack_contents = list( + /obj/item/crowbar = 1, + ) + shoes = /obj/item/clothing/shoes/winterboots + gloves = /obj/item/clothing/gloves/combat + id = /obj/item/card/id/advanced/tarkon + id_trim = /datum/id_trim/away/tarkon + ears = /obj/item/radio/headset/tarkon + +/datum/outfit/tarkon/post_equip(mob/living/carbon/human/tarkon, visualsOnly = FALSE) + var/obj/item/card/id/id_card = tarkon.wear_id + if(istype(id_card)) + id_card.registered_name = tarkon.real_name + id_card.update_label() + id_card.update_icon() + var/obj/item/radio/target_radio = tarkon.ears + target_radio.set_frequency(FREQ_TARKON) + target_radio.recalculateChannels() + + handlebank(tarkon) + return ..() + +/obj/effect/mob_spawn/ghost_role/human/tarkon/cargo + prompt_name = "a port salvage tech" + outfit = /datum/outfit/tarkon/cargo + +/datum/outfit/tarkon/cargo + name = "Port Tarkon Cargo Outfit" + uniform = /obj/item/clothing/under/tarkon/cargo + glasses = /obj/item/clothing/glasses/sunglasses + id = /obj/item/card/id/advanced/tarkon/cargo + id_trim = /datum/id_trim/away/tarkon/cargo + l_pocket = /obj/item/mining_voucher + +/obj/effect/mob_spawn/ghost_role/human/tarkon/sci + prompt_name = "a port researcher" + outfit = /datum/outfit/tarkon/sci + +/datum/outfit/tarkon/sci + name = "Port Tarkon Science Outfit" + uniform = /obj/item/clothing/under/tarkon/sci + glasses = /obj/item/clothing/glasses/hud/diagnostic + id = /obj/item/card/id/advanced/tarkon/sci + id_trim = /datum/id_trim/away/tarkon/sci + r_pocket = /obj/item/stock_parts/cell/high + l_pocket = /obj/item/card/id/away/tarkonrobo + +/obj/effect/mob_spawn/ghost_role/human/tarkon/med + prompt_name = "a port trauma medic" + outfit = /datum/outfit/tarkon/med + +/datum/outfit/tarkon/med + name = "Port Tarkon Medical Outfit" + uniform = /obj/item/clothing/under/tarkon/med + glasses = /obj/item/clothing/glasses/hud/health + id = /obj/item/card/id/advanced/tarkon/med + id_trim = /datum/id_trim/away/tarkon/med + neck = /obj/item/clothing/neck/stethoscope + l_pocket = /obj/item/healthanalyzer + r_pocket = /obj/item/stack/medical/suture/medicated + +/obj/effect/mob_spawn/ghost_role/human/tarkon/engi + prompt_name = "a port maintenance engineer" + outfit = /datum/outfit/tarkon/engi + +/datum/outfit/tarkon/engi + name = "Port Tarkon Engineering Outfit" + uniform = /obj/item/clothing/under/tarkon/eng + glasses = /obj/item/clothing/glasses/meson/engine/tray + id = /obj/item/card/id/advanced/tarkon/engi + id_trim = /datum/id_trim/away/tarkon/eng + neck = /obj/item/clothing/neck/security_cape/tarkon + l_hand = /obj/item/inducer + l_pocket = /obj/item/tank/internals/emergency_oxygen/engi + r_pocket = /obj/item/stack/cable_coil + +/obj/effect/mob_spawn/ghost_role/human/tarkon/sec + prompt_name = "a port security member" + outfit = /datum/outfit/tarkon/sec + +/datum/outfit/tarkon/sec + name = "Port Tarkon Security Outfit" + uniform = /obj/item/clothing/under/tarkon/sec + glasses = /obj/item/clothing/glasses/hud/security/redsec + gloves = /obj/item/clothing/gloves/tackler/combat + neck = /obj/item/clothing/neck/security_cape/tarkon + id = /obj/item/card/id/advanced/tarkon/sec + id_trim = /datum/id_trim/away/tarkon/sec + l_pocket = /obj/item/melee/baton/telescopic + r_pocket = /obj/item/grenade/barrier + skillchips = list(/obj/item/skillchip/chameleon/reload) + +/obj/effect/mob_spawn/ghost_role/human/tarkon/ensign + name = "Port Tarkon Ensign" + prompt_name = "an abandoned ensign" + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper-o" + you_are_text = "You were tasked by Tarkon Industries to Port Tarkon as a low-level command member. Your superior is the site director." + flavour_text = "Second in command, you are usually tasked with outward missions with other tarkon members while the site director stays at the port. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" + important_text = "You are not to abandon Port Tarkon without reason. You are allowed to travel within available Z-levels and to the station, and are allowed to hold exploration parties." + outfit = /datum/outfit/tarkon/ensign + spawner_job_path = /datum/job/tarkon + +/datum/outfit/tarkon/ensign //jack of all trades, master of none, spent all his credits, every last one + name = "Port Tarkon Ensigns Outfit" + uniform = /obj/item/clothing/under/tarkon/com + ears = /obj/item/radio/headset/tarkon/command + id = /obj/item/card/id/advanced/tarkon/ensign + id_trim = /datum/id_trim/away/tarkon/ensign + neck = /obj/item/clothing/neck/security_cape/tarkon + skillchips = list(/obj/item/skillchip/chameleon/reload) + +/obj/effect/mob_spawn/ghost_role/human/tarkon/director + name = "Port Tarkon Site Director" + prompt_name = "a port site director" + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + you_are_text = "You are a newly assigned Site Director for Port Tarkon. Your superiors are none except the will of yourself and Tarkon Industries." + flavour_text = "On the recently reclaimed Port Tarkon, You are tasked with overlooking your crew and keeping the port up and running. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" + important_text = "You are not to abandon Port Tarkon. Check other sleepers for alternative jobs." + outfit = /datum/outfit/tarkon/director + spawner_job_path = /datum/job/tarkon + loadout_enabled = TRUE + quirks_enabled = TRUE + random_appearance = FALSE + computer_area = /area/ruin/space/has_grav/port_tarkon + +/datum/outfit/tarkon/director //Look at me, I'm the director now. + name = "Port Tarkon Ensigns Outfit" + uniform = /obj/item/clothing/under/tarkon/com + ears = /obj/item/radio/headset/tarkon/command + id = /obj/item/card/id/advanced/tarkon/director + id_trim = /datum/id_trim/away/tarkon/director + neck = /obj/item/clothing/neck/security_cape/tarkon + r_pocket = /obj/item/card/id/away/tarkonrobo + skillchips = list(/obj/item/skillchip/chameleon/reload) + +/obj/machinery/computer/cryopod/tarkon + radio = /obj/item/radio/headset/tarkon + announcement_channel = RADIO_CHANNEL_TARKON + req_one_access = list("tarkon") + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) + +////////////////////// Corpse/Mob Spawners Below + +/datum/outfit/tarkon/loot + name = "Dead Tarkon Ensigns Outfit" + uniform = /obj/item/clothing/under/tarkon/com + ears = /obj/item/radio/headset/tarkon/command + id = /obj/item/card/id/advanced/tarkon/ensign + id_trim = /datum/id_trim/away/tarkon/ensign + neck = /obj/item/clothing/neck/security_cape/tarkon + gloves = /obj/item/clothing/gloves/combat + back = /obj/item/mod/control/pre_equipped/tarkon + backpack_contents = list(/obj/item/trench_tool) + +/obj/effect/mob_spawn/corpse/human/tarkon + icon_state = "corpseminer" + outfit = /datum/outfit/tarkon/loot + +/obj/structure/spawner/tarkon_xenos + name = "infested warren" + desc = "A deep tunnel that goes deeper than any light can reach. A distant roaring could be heard within..." + icon_state = "hole" + icon = 'icons/mob/simple/lavaland/nest.dmi' + pressure_resistance = 200 //No more pressure cheating. Burn it and its reward or fight. + max_integrity = 500 + max_mobs = 7 + spawn_time = 20 SECONDS + mob_types = list( + /mob/living/simple_animal/hostile/alien, + /mob/living/simple_animal/hostile/alien/drone, + /mob/living/simple_animal/hostile/alien/sentinel + ) + spawn_text = "crawls out of" + faction = list(ROLE_ALIEN) + var/boss_mob = /mob/living/simple_animal/hostile/alien/queen/large + var/loot_drop = /obj/effect/mob_spawn/corpse/human/tarkon + +/obj/structure/spawner/tarkon_xenos/deconstruct(disassembled) + var/obj/effect/nest_break/nest = new /obj/effect/nest_break(loc) + nest.loot_drop = loot_drop + nest.boss_mob = boss_mob + return ..() + +/obj/effect/nest_break + name = "collapsing infested nest" + desc = "Stop standing and get clear!" + layer = TABLE_LAYER + icon = 'icons/mob/simple/lavaland/nest.dmi' + icon_state = "hole" + anchored = TRUE + density = TRUE + var/boss_mob = null + var/loot_drop = null + +/obj/effect/nest_break/proc/rustle() + for(var/mob/M in range(7,src)) + shake_camera(M, 15, 1) + playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, TRUE) + visible_message(span_boldannounce("The nest's entrance starts to crumble before something charges forth!")) + new boss_mob(loc) + new loot_drop(loc) + qdel(src) + +/obj/effect/nest_break/Initialize(mapload) + . = ..() + visible_message(span_boldannounce("The nest rumbles violently as the entrance begins to crack and break apart!")) + playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) + addtimer(CALLBACK(src, PROC_REF(rustle)), 50) + do_jiggle() + +/obj/structure/spawner/tarkon_xenos/common + name = "infested nest" + desc = "A deep tunnel lined with weeds, something can be heard stirring within..." + icon_state = "hole" + icon = 'icons/mob/simple/lavaland/nest.dmi' + max_integrity = 300 + max_mobs = 4 + spawn_time = 30 SECONDS + boss_mob = /mob/living/simple_animal/hostile/alien/queen + loot_drop = /obj/effect/spawner/random/astrum/sci_loot/tarkon + +/obj/structure/spawner/tarkon_xenos/minor + name = "infested tunnel" + desc = "A tunnel lined with weeds, something can be heard clicking deep within..." + icon_state = "hole" + icon = 'icons/mob/simple/lavaland/nest.dmi' + max_integrity = 150 + max_mobs = 2 + spawn_time = 30 SECONDS + mob_types = list( + /mob/living/simple_animal/hostile/alien, + /mob/living/simple_animal/hostile/alien/drone + ) + boss_mob = /mob/living/simple_animal/hostile/alien/sentinel + loot_drop = /obj/effect/spawner/random/exotic/technology/tarkon + +/obj/effect/spawner/random/astrum/sci_loot/tarkon + name = "abductor scientist loot" + loot = list(/obj/item/circular_saw/alien = 10, + /obj/item/retractor/alien = 10, + /obj/item/scalpel/alien = 10, + /obj/item/hemostat/alien = 10, + /obj/item/crowbar/abductor = 10, + /obj/item/screwdriver/abductor = 10, + /obj/item/wrench/abductor = 10, + /obj/item/weldingtool/abductor = 10, + /obj/item/crowbar/abductor = 10, + /obj/item/wirecutters/abductor = 10, + /obj/item/multitool/abductor = 10, + ) + +/obj/effect/spawner/random/exotic/technology/tarkon + spawn_loot_count = 1 //we just need one. diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/tools.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/tools.dm new file mode 100644 index 00000000000..970d026536b --- /dev/null +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/tools.dm @@ -0,0 +1,10 @@ +/obj/item/construction/rcd/arcd/tarkon + name = "Tarkon Industries RCD" + desc = "An RCD of an alternative design with a \"Tarkon Industries\" logo on it, capable of working at range. Reload using metal, glass, or plasteel." + icon = 'modular_skyrat/modules/tarkon/icons/misc/tools.dmi' + icon_state = "trcd" + ranged = TRUE + canRturf = FALSE + max_matter = 300 + matter = 300 + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS diff --git a/modular_skyrat/modules/tarkon/icons/misc/ARCS.dmi b/modular_skyrat/modules/tarkon/icons/misc/ARCS.dmi new file mode 100644 index 00000000000..86d40aa75f1 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/misc/ARCS.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/misc/card.dmi b/modular_skyrat/modules/tarkon/icons/misc/card.dmi new file mode 100644 index 00000000000..c55ee6f1b2d Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/misc/card.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/misc/tools.dmi b/modular_skyrat/modules/tarkon/icons/misc/tools.dmi new file mode 100644 index 00000000000..dba6330373a Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/misc/tools.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/clothing/head.dmi b/modular_skyrat/modules/tarkon/icons/mob/clothing/head.dmi new file mode 100644 index 00000000000..feddf7b3dc8 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/clothing/head.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/clothing/mod.dmi b/modular_skyrat/modules/tarkon/icons/mob/clothing/mod.dmi new file mode 100644 index 00000000000..0daf7041e8e Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/clothing/mod.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/clothing/neck.dmi b/modular_skyrat/modules/tarkon/icons/mob/clothing/neck.dmi new file mode 100644 index 00000000000..2a830277fdb Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/clothing/neck.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/clothing/uniform.dmi b/modular_skyrat/modules/tarkon/icons/mob/clothing/uniform.dmi new file mode 100644 index 00000000000..b3b644d2151 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/clothing/uniform.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/clothing/uniform_digi.dmi b/modular_skyrat/modules/tarkon/icons/mob/clothing/uniform_digi.dmi new file mode 100644 index 00000000000..4044f793dc2 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/clothing/uniform_digi.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/lefthand.dmi b/modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/lefthand.dmi new file mode 100644 index 00000000000..726ae6cfca5 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/lefthand.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/righthand.dmi b/modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/righthand.dmi new file mode 100644 index 00000000000..74769523705 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/mob/guns/ARCS/righthand.dmi differ diff --git a/modular_skyrat/modules/projectiles/icons/inhands/lefthand.dmi b/modular_skyrat/modules/tarkon/icons/mob/guns/m6pdw/lefthand.dmi similarity index 100% rename from modular_skyrat/modules/projectiles/icons/inhands/lefthand.dmi rename to modular_skyrat/modules/tarkon/icons/mob/guns/m6pdw/lefthand.dmi diff --git a/modular_skyrat/modules/projectiles/icons/inhands/righthand.dmi b/modular_skyrat/modules/tarkon/icons/mob/guns/m6pdw/righthand.dmi similarity index 100% rename from modular_skyrat/modules/projectiles/icons/inhands/righthand.dmi rename to modular_skyrat/modules/tarkon/icons/mob/guns/m6pdw/righthand.dmi diff --git a/modular_skyrat/modules/tarkon/icons/obj/clothing/head.dmi b/modular_skyrat/modules/tarkon/icons/obj/clothing/head.dmi new file mode 100644 index 00000000000..08e158dfb93 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/obj/clothing/head.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/obj/clothing/mod.dmi b/modular_skyrat/modules/tarkon/icons/obj/clothing/mod.dmi new file mode 100644 index 00000000000..dc06a1bffbc Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/obj/clothing/mod.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/obj/clothing/neck.dmi b/modular_skyrat/modules/tarkon/icons/obj/clothing/neck.dmi new file mode 100644 index 00000000000..6e461555956 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/obj/clothing/neck.dmi differ diff --git a/modular_skyrat/modules/tarkon/icons/obj/clothing/uniform.dmi b/modular_skyrat/modules/tarkon/icons/obj/clothing/uniform.dmi new file mode 100644 index 00000000000..8ca1c8162bb Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/obj/clothing/uniform.dmi differ diff --git a/modular_skyrat/modules/projectiles/icons/m6pdw.dmi b/modular_skyrat/modules/tarkon/icons/obj/guns/m6pdw.dmi similarity index 100% rename from modular_skyrat/modules/projectiles/icons/m6pdw.dmi rename to modular_skyrat/modules/tarkon/icons/obj/guns/m6pdw.dmi diff --git a/modular_skyrat/modules/tarkon/icons/obj/mod_construct.dmi b/modular_skyrat/modules/tarkon/icons/obj/mod_construct.dmi new file mode 100644 index 00000000000..904849927b0 Binary files /dev/null and b/modular_skyrat/modules/tarkon/icons/obj/mod_construct.dmi differ diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm index 1b09214e5f7..3a7b8e0ee79 100644 --- a/modular_skyrat/modules/teshari/code/_teshari.dm +++ b/modular_skyrat/modules/teshari/code/_teshari.dm @@ -47,6 +47,7 @@ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/teshari, BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/teshari, ) + meat = /obj/item/food/meat/slab/chicken/human /datum/species/teshari/get_default_mutant_bodyparts() return list( diff --git a/modular_skyrat/modules/teshari/code/birdman_food.dm b/modular_skyrat/modules/teshari/code/birdman_food.dm new file mode 100644 index 00000000000..aba9342a0a5 --- /dev/null +++ b/modular_skyrat/modules/teshari/code/birdman_food.dm @@ -0,0 +1,107 @@ +/obj/item/food/meat/slab/chicken/human + name = "meat" + tastes = list("tender meat" = 1) + foodtypes = MEAT | RAW | GORE + venue_value = FOOD_MEAT_HUMAN + +/obj/item/food/meat/slab/chicken/human/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken/human, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) + +/obj/item/food/meat/steak/chicken/human/on_microwave_cooked(datum/source, atom/source_item, cooking_efficiency = 1) + . = ..() + if(!istype(source_item, /obj/item/food/meat)) + return + + var/obj/item/food/meat/origin_meat = source_item + subjectname = origin_meat.subjectname + subjectjob = origin_meat.subjectjob + if(subjectname) + name = "[origin_meat.subjectname] meatsteak" + else if(subjectjob) + name = "[origin_meat.subjectjob] meatsteak" + +/obj/item/food/meat/slab/chicken/human/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken/human, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/meat/steak/chicken/human + tastes = list("tender meat" = 1) + foodtypes = MEAT | GORE + +/obj/item/food/meat/rawcutlet/chicken/human + tastes = list("tender meat" = 1) + foodtypes = MEAT | RAW | GORE + +/obj/item/food/meat/cutlet/chicken/human + tastes = list("tender meat" = 1) + foodtypes = MEAT | GORE + +/obj/item/food/meat/cutlet/chicken/human/on_microwave_cooked(datum/source, atom/source_item, cooking_efficiency) + . = ..() + if(!istype(source_item, /obj/item/food/meat)) + return + + var/obj/item/food/meat/origin_meat = source_item + if(subjectname) + name = "[origin_meat.subjectname] [initial(name)]" + else if(subjectjob) + name = "[origin_meat.subjectjob] [initial(name)]" + +/obj/item/food/raw_meatball/chicken/human + name = "strange raw chicken meatball" + meatball_type = /obj/item/food/meatball/chicken/human + patty_type = /obj/item/food/raw_patty/chicken/human + +/obj/item/food/meatball/chicken/human + name = "strange chicken meatball" + +/obj/item/food/raw_patty/chicken/human + name = "strange raw chicken patty" + patty_type = /obj/item/food/patty/human/chicken + +/obj/item/food/patty/human/chicken + name = "strange chicken patty" + tastes = list("chikun" = 1) + icon_state = "chicken_patty" + +/datum/food_processor_process/meat/chicken + blacklist = list(/obj/item/food/meat/slab/chicken) + +/datum/food_processor_process/meat/chicken/human + input = /obj/item/food/meat/slab/chicken/human + output = /obj/item/food/raw_meatball/chicken/human + blacklist = null + +/obj/item/food/burger/human/chicken + name = "birdman sandwich" + desc = "You're pretty sure this sandwich doesn't fund a good cause..." + icon_state = "chickenburger" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/mayonnaise = 3, + /datum/reagent/consumable/nutriment/protein = 7, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/nutriment/fat/oil = 2, + ) + tastes = list("bun" = 2, "chikun" = 4, "Against God and Nature" = 1) + foodtypes = GRAIN | MEAT | FRIED | GORE + crafting_complexity = FOOD_COMPLEXITY_3 + venue_value = FOOD_PRICE_CHEAP + +/obj/item/food/burger/human/chicken/CheckParts(list/parts_list) + ..() + var/obj/item/food/patty/human/human_patty = locate(/obj/item/food/patty/human/chicken) in contents + for(var/datum/material/meat/mob_meat/mob_meat_material in human_patty.custom_materials) + if(mob_meat_material.subjectname) + name = "[mob_meat_material.subjectname] burger" + else if(mob_meat_material.subjectjob) + name = "[mob_meat_material.subjectjob] burger" + +/datum/crafting_recipe/food/chickenburger/human + name = "Birdman Sandwich" + reqs = list( + /obj/item/food/patty/human/chicken = 1, + /datum/reagent/consumable/mayonnaise = 5, + /obj/item/food/bun = 1 + ) + result = /obj/item/food/burger/human/chicken + category = CAT_BURGER diff --git a/modular_skyrat/modules/time_clock/code/console.dm b/modular_skyrat/modules/time_clock/code/console.dm index 0305045c511..2d4891366a1 100644 --- a/modular_skyrat/modules/time_clock/code/console.dm +++ b/modular_skyrat/modules/time_clock/code/console.dm @@ -202,6 +202,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/time_clock, 28) icon_state = "unanchoredstatusdisplay" result_path = /obj/machinery/time_clock pixel_shift = 28 - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2) + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + ) #undef CLOCK_IN_COOLDOWN diff --git a/modular_skyrat/modules/title_screen/code/new_player.dm b/modular_skyrat/modules/title_screen/code/new_player.dm index da595f3ca27..9f9c098b4bf 100644 --- a/modular_skyrat/modules/title_screen/code/new_player.dm +++ b/modular_skyrat/modules/title_screen/code/new_player.dm @@ -12,6 +12,9 @@ if(client.interviewee) return FALSE + if(!client.maturity_prompt_whitelist && !SSmaturity_guard.age_check(src)) + return + if(href_list["observe"]) play_lobby_button_sound() make_me_an_observer() diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/designs_and_tech.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/designs_and_tech.dm index 9147ecec1e4..fb9b5d14399 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/designs_and_tech.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/designs_and_tech.dm @@ -6,10 +6,15 @@ /datum/design/xenoarch build_type = PROTOLATHE | AWAY_LATHE departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) /datum/design/xenoarch/tool - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_XENOARCH) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_XENOARCH, + ) /datum/design/xenoarch/tool/hammer desc = "A hammer that can slowly remove debris on strange rocks." @@ -68,8 +73,15 @@ build_path = /obj/item/xenoarch/handheld_scanner /datum/design/xenoarch/tool/advanced - category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_XENOARCH_ADVANCED) - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_XENOARCH_ADVANCED, + ) + /datum/design/xenoarch/tool/advanced/scanner name = "Xenoarch Advanced Handheld Scanner" @@ -80,7 +92,10 @@ name = "Xenoarch Handheld Recoverer" desc = "A device with the capabilities to recover items lost due to time." id = "xenoarch_handrecoverer" - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + ) // rebalance material req after first repath/categorization? build_path = /obj/item/xenoarch/handheld_recoverer @@ -99,7 +114,9 @@ /datum/design/xenoarch/equipment // everything under this except the adv bag feels redundant because cloth/leather are there too // but i guess we'll burn that bridge another time - category = list(RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_XENOARCH) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_XENOARCH, + ) /datum/design/xenoarch/equipment/bag name = "Xenoarchaeology Bag" @@ -117,12 +134,18 @@ name = "Advanced Xenoarch Bag" desc = "A bag that can hold about fifty strange rocks." id = "xenoarch_bag_adv" - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 5, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5) + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, + ) // i kinda hate how this requires diamond, but this is supposed to be a fix pr, burn the gbp on it later build_path = /obj/item/storage/bag/xenoarch/adv /datum/design/board/xenoarch - category = list(RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_XENOARCH) + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_XENOARCH, + ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE /datum/design/board/xenoarch/researcher diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm index 191837a837f..fdb1f2cb7b9 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_machine.dm @@ -1,3 +1,5 @@ +// Researcher, Scanner, Recoverer, and Digger + /obj/machinery/xenoarch icon = 'modular_skyrat/modules/xenoarch/icons/xenoarch_machines.dmi' density = TRUE @@ -5,124 +7,158 @@ use_power = IDLE_POWER_USE idle_power_usage = 100 pass_flags = PASSTABLE - ///The speed in which the machine will process each item - var/process_speed = 20 SECONDS - ///The efficacy that affects the process_speed. Start at -1 so tier 1 parts are efficacy of 0 - var/efficiency = -1 - ///The holding storage for the items inserted into the machines - var/obj/item/holding_storage - ///The time comparison, to make sure the machine doesn't perform faster than it should - var/world_compare = 0 - -/obj/machinery/xenoarch/RefreshParts() - . = ..() - efficiency = -1 - for(var/datum/stock_part/micro_laser/laser_part in component_parts) - efficiency += laser_part.tier - process_speed = initial(process_speed) - (6 SECONDS * efficiency) + /// the item that holds everything + var/obj/item/storage_unit + ///how long between each process + var/process_speed = 10 SECONDS + COOLDOWN_DECLARE(process_delay) /obj/machinery/xenoarch/Initialize(mapload) . = ..() - holding_storage = new /obj/item(src) + storage_unit = new /obj/item(src) /obj/machinery/xenoarch/Destroy() - qdel(holding_storage) - . = ..() + QDEL_NULL(storage_unit) + return ..() -/obj/machinery/xenoarch/proc/do_machine_process() +/obj/machinery/xenoarch/RefreshParts() + . = ..() + var/efficiency = -2 //to allow t1 parts to not change the base speed + for(var/datum/stock_part/stockpart in component_parts) + efficiency += stockpart.tier + + process_speed = initial(process_speed) - (efficiency) + +/obj/machinery/xenoarch/process() + if(machine_stat & (NOPOWER|BROKEN) || !anchored) + COOLDOWN_RESET(src, process_delay) //if you are broken or no power (or not anchored), you aren't allowed to progress! + return + + if(!COOLDOWN_FINISHED(src, process_delay)) + return + + COOLDOWN_START(src, process_delay, process_speed) + xenoarch_process() + +/obj/machinery/xenoarch/proc/xenoarch_process() return -/obj/machinery/xenoarch/proc/insert_xeno_item(obj/item/insert_item, mob/living/user) - insert_item.forceMove(holding_storage) - playsound(src, 'sound/machines/click.ogg', 50, TRUE) - to_chat(user, span_notice("The [insert_item] has been inserted into [src].")) - world_compare = world.time + process_speed - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), process_speed) - -/obj/machinery/xenoarch/attack_hand(mob/living/user, list/modifiers) +/obj/machinery/xenoarch/wrench_act(mob/living/user, obj/item/tool) . = ..() - var/src_turf = get_turf(src) - var/user_choice = tgui_alert(user, "Are you sure you want to remove all the items?", "Remove Items?", list("Yes", "No")) - if(user_choice != "Yes") - return - for(var/move_out_item in holding_storage.contents) - if(!isobj(move_out_item)) - continue - var/obj/move_out_obj = move_out_item - move_out_obj.forceMove(src_turf) -/obj/machinery/xenoarch/examine(mob/user) + if(default_unfasten_wrench(user, tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/xenoarch/screwdriver_act(mob/living/user, obj/item/tool) . = ..() - if(holding_storage?.contents.len) - var/is_singular = holding_storage.contents.len == 1 ? TRUE : FALSE - . += span_notice("There [is_singular ? "is" : "are"] [holding_storage.contents.len] [is_singular ? "item" : "items"] currently in the buffer.") - . += span_warning("You can remove the contents, but the machine is currently trying to process the items!") + + toggle_panel_open() + to_chat(user, span_notice("You [panel_open ? "open":"close"] the maintenance panel of [src].")) + tool.play_tool_sound(src) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/xenoarch/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS /obj/machinery/xenoarch/researcher name = "xenoarch researcher" desc = "A machine that is used to condense strange rocks, useless relics, and broken objects into bigger artifacts." icon_state = "researcher" circuit = /obj/item/circuitboard/machine/xenoarch_machine/xenoarch_researcher - ///A variable that goes from 0 to 150. Depending on what is processed, increases the value. Once at or above 150, spawns an anomalous crystal. + /// the amount of research that is currently done var/current_research = 0 + /// the max amount of value we can have + var/max_research = 300 + /// the value of each accepted item + var/list/accepted_types = list( + /obj/item/xenoarch/strange_rock = 1, + /obj/item/xenoarch/useless_relic = 5, + /obj/item/xenoarch/useless_relic/magnified = 10, + /obj/item/xenoarch/broken_item = 10, + ) /obj/machinery/xenoarch/researcher/examine(mob/user) . = ..() - . += span_notice("[current_research]/150 research points. Research more xenoarchaeological items.") + + . += span_notice("
[current_research]/[max_research] research available.") + . += span_notice("L-Click to insert items or take out all the strange rocks. R-Click to use research points.") /obj/machinery/xenoarch/researcher/attackby(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/storage/bag/xenoarch)) - var/obj/item/storage/bag/xenoarch/xenoarch_bag = weapon - for(var/check_item in xenoarch_bag.contents) - if(!istype(check_item, /obj/item/xenoarch/strange_rock)) - continue - var/obj/item/xenoarch/strange_rock/strange_rock = check_item - if(!do_after(user, xenoarch_bag.insert_speed, target = src)) - world_compare = world.time + process_speed - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), process_speed) - return - strange_rock.forceMove(holding_storage) - to_chat(user, span_notice("The strange rock has been inserted into [src].")) - world_compare = world.time + process_speed - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), process_speed) + for(var/obj/strange_rocks in weapon.contents) + strange_rocks.forceMove(storage_unit) + + balloon_alert(user, "rocks inserted!") return - if(istype(weapon, /obj/item/xenoarch/strange_rock)) - insert_xeno_item(weapon, user) - return - if(istype(weapon, /obj/item/xenoarch/useless_relic)) - insert_xeno_item(weapon, user) - return - if(istype(weapon, /obj/item/xenoarch/broken_item)) - insert_xeno_item(weapon, user) + + if(is_type_in_list(weapon, accepted_types)) + weapon.forceMove(storage_unit) + balloon_alert(user, "item inserted!") return + return ..() -/obj/machinery/xenoarch/researcher/do_machine_process() - if(!holding_storage.contents.len) +/obj/machinery/xenoarch/researcher/attack_hand(mob/living/user, list/modifiers) + . = ..() + var/choice = tgui_input_list(user, "Remove the rocks from [src]?", "Rock Removal", list("Yes", "No")) + if(choice != "Yes") return - if(world_compare > world.time) + var/turf/src_turf = get_turf(src) + for(var/obj/item/removed_item in storage_unit.contents) + removed_item.forceMove(src_turf) + + balloon_alert(user, "items removed!") + +/obj/machinery/xenoarch/researcher/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + var/turf/src_turf = get_turf(src) + var/choice = tgui_input_list(user, "Choose which reward you would like!", "Reward Choice", list("Lavaland Chest (150)", "Anomalous Crystal (150)", "Bepis Tech (100)")) + if(!choice) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + switch(choice) + if("Lavaland Chest (150)") + if(current_research < 150) + balloon_alert(user, "insufficient research!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + current_research -= 150 + new /obj/structure/closet/crate/necropolis/tendril(src_turf) + + if("Anomalous Crystal (150)") + if(current_research < 150) + balloon_alert(user, "insufficient research!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + current_research -= 150 + var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) + var/random_crystal = pick(choices) + new random_crystal(src_turf) + + if("Bepis Tech (100)") + if(current_research < 100) + balloon_alert(user, "insufficient research!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + current_research -= 100 + new /obj/item/disk/design_disk/bepis/remove_tech(src_turf) + + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/xenoarch/researcher/xenoarch_process() + if(length(storage_unit.contents) <= 0) return - var/obj/item/remove_item = holding_storage.contents[1] - if(!remove_item) + + if(current_research >= max_research) return - if(!istype(remove_item, /obj/item/xenoarch/strange_rock) && !istype(remove_item, /obj/item/xenoarch/useless_relic) && !istype(remove_item, /obj/item/xenoarch/broken_item)) - qdel(remove_item) - return - if(istype(remove_item, /obj/item/xenoarch/strange_rock)) - current_research += 1 - if(istype(remove_item, /obj/item/xenoarch/useless_relic)) - current_research += 5 - if(istype(remove_item, /obj/item/xenoarch/broken_item)) - current_research += 10 - if(current_research >= 150) - current_research -= 150 - var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) - var/random_crystal = pick(choices) - new random_crystal(get_turf(src)) - qdel(remove_item) - playsound(src, 'sound/machines/click.ogg', 50, TRUE) - world_compare = world.time + process_speed - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), process_speed) + + var/obj/item/first_item = storage_unit.contents[1] + var/reward_attempt = accepted_types[first_item.type] + current_research = min(current_research + reward_attempt, 300) + qdel(first_item) /obj/machinery/xenoarch/scanner name = "xenoarch scanner" @@ -131,17 +167,22 @@ circuit = /obj/item/circuitboard/machine/xenoarch_machine/xenoarch_scanner /obj/machinery/xenoarch/scanner/attackby(obj/item/weapon, mob/user, params) - var/scan_speed = 4 SECONDS - (1 SECONDS * efficiency) - if(istype(weapon, /obj/item/xenoarch/strange_rock)) - var/obj/item/xenoarch/strange_rock/strange_rock = weapon - if(!do_after(user, scan_speed, target = src)) - to_chat(user, span_warning("You interrupt the scanning process, aborting process.")) - return - if(strange_rock.get_scanned()) - to_chat(user, span_notice("You successfully scan the strange rock. It will now report its depth in real time!")) - return - to_chat(user, span_warning("The strange rock was unable to be scanned, perhaps it has already been scanned?")) + if(istype(weapon, /obj/item/storage/bag/xenoarch)) + for(var/obj/item/xenoarch/strange_rock/chosen_rocks in weapon.contents) + chosen_rocks.get_scanned() + + balloon_alert(user, "scan complete!") return + + if(istype(weapon, /obj/item/xenoarch/strange_rock)) + var/obj/item/xenoarch/strange_rock/chosen_rock + if(chosen_rock.get_scanned()) + balloon_alert(user, "scan complete!") + return + + to_chat(user, span_warning("[chosen_rock] was unable to be scanned, perhaps it was already scanned?")) + return + return ..() /obj/machinery/xenoarch/recoverer @@ -150,63 +191,83 @@ icon_state = "recoverer" circuit = /obj/item/circuitboard/machine/xenoarch_machine/xenoarch_recoverer +/obj/machinery/xenoarch/recoverer/examine(mob/user) + . = ..() + . += span_notice("
L-Click to remove all items inside [src].") + /obj/machinery/xenoarch/recoverer/attackby(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/xenoarch/broken_item)) - insert_xeno_item(weapon, user) + weapon.forceMove(storage_unit) + balloon_alert(user, "item inserted!") return + return ..() +/obj/machinery/xenoarch/recoverer/attack_hand(mob/living/user, list/modifiers) + var/choice = tgui_input_list(user, "Remove the broken items from [src]?", "Item Removal", list("Yes", "No")) + if(choice != "Yes") + return + + var/turf/src_turf = get_turf(src) + for(var/obj/item/removed_item in storage_unit.contents) + removed_item.forceMove(src_turf) + + balloon_alert(user, "items removed!") + +/obj/machinery/xenoarch/recoverer/xenoarch_process() + var/turf/src_turf = get_turf(src) + if(length(storage_unit.contents) <= 0) + return + + var/obj/item/content_obj = storage_unit.contents[1] + if(!istype(content_obj, /obj/item/xenoarch/broken_item)) + qdel(content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/tech)) + var/spawn_item = pick_weight(GLOB.tech_reward) + recover_item(spawn_item, content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/weapon)) + var/spawn_item = pick_weight(GLOB.weapon_reward) + recover_item(spawn_item, content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/illegal)) + var/spawn_item = pick_weight(GLOB.illegal_reward) + recover_item(spawn_item, content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/alien)) + var/spawn_item = pick_weight(GLOB.alien_reward) + recover_item(spawn_item, content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/plant)) + var/spawn_item = pick_weight(GLOB.plant_reward) + recover_item(spawn_item, content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/clothing)) + var/spawn_item = pick_weight(GLOB.clothing_reward) + recover_item(spawn_item, content_obj) + return + + if(istype(content_obj, /obj/item/xenoarch/broken_item/animal)) + var/spawn_item + for(var/looptime in 1 to rand(1,4)) + spawn_item = pick_weight(GLOB.animal_reward) + new spawn_item(src_turf) + + recover_item(spawn_item, content_obj) + return + /obj/machinery/xenoarch/recoverer/proc/recover_item(obj/insert_obj, obj/delete_obj) var/src_turf = get_turf(src) new insert_obj(src_turf) playsound(src, 'sound/machines/click.ogg', 50, TRUE) qdel(delete_obj) - world_compare = world.time + process_speed - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), process_speed) - -/obj/machinery/xenoarch/recoverer/do_machine_process() - if(!holding_storage.contents.len) - return - if(world_compare > world.time) - return - var/obj/item/content_obj = holding_storage.contents[1] - if(!content_obj) - return - if(!istype(content_obj, /obj/item/xenoarch/broken_item)) - qdel(content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/tech)) - var/spawn_item = pick_weight(GLOB.tech_reward) - recover_item(spawn_item, content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/weapon)) - var/spawn_item = pick_weight(GLOB.weapon_reward) - recover_item(spawn_item, content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/illegal)) - var/spawn_item = pick_weight(GLOB.illegal_reward) - recover_item(spawn_item, content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/alien)) - var/spawn_item = pick_weight(GLOB.alien_reward) - recover_item(spawn_item, content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/plant)) - var/spawn_item = pick_weight(GLOB.plant_reward) - recover_item(spawn_item, content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/clothing)) - var/spawn_item = pick_weight(GLOB.clothing_reward) - recover_item(spawn_item, content_obj) - return - if(istype(content_obj, /obj/item/xenoarch/broken_item/animal)) - var/spawn_item - var/turf/src_turf = get_turf(src) - for(var/looptime in 1 to rand(1,4)) - spawn_item = pick_weight(GLOB.animal_reward) - new spawn_item(src_turf) - recover_item(spawn_item, content_obj) - return /obj/machinery/xenoarch/digger name = "xenoarch digger" @@ -214,42 +275,39 @@ icon_state = "digger" circuit = /obj/item/circuitboard/machine/xenoarch_machine/xenoarch_digger +/obj/machinery/xenoarch/digger/examine(mob/user) + . = ..() + . += span_notice("
L-Click to remove all items inside [src].") + /obj/machinery/xenoarch/digger/attackby(obj/item/weapon, mob/user, params) if(istype(weapon, /obj/item/storage/bag/xenoarch)) - var/obj/item/storage/bag/xenoarch/xenoarch_bag = weapon - for(var/check_item in xenoarch_bag.contents) - if(!istype(check_item, /obj/item/xenoarch/strange_rock)) - continue - var/obj/item/xenoarch/strange_rock/strange_rock = check_item - if(!do_after(user, 1 SECONDS, target = src)) - world_compare = world.time + (process_speed * 4) - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), (process_speed * 4)) - return - strange_rock.forceMove(holding_storage) - to_chat(user, span_notice("The strange rock has been inserted into [src].")) - world_compare = world.time + (process_speed * 4) - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), (process_speed * 4)) - return - else if(istype(weapon, /obj/item/xenoarch/strange_rock)) - insert_xeno_item(weapon, user) - return - return ..() + for(var/obj/strange_rocks in weapon.contents) + strange_rocks.forceMove(storage_unit) -/obj/machinery/xenoarch/digger/do_machine_process() - if(!holding_storage.contents.len) + balloon_alert(user, "rocks inserted!") return - if(world_compare > world.time) + + if(istype(weapon, /obj/item/xenoarch/strange_rock)) + weapon.forceMove(src) + balloon_alert(user, "rock inserted!") return + +/obj/machinery/xenoarch/digger/attack_hand(mob/living/user, list/modifiers) + var/choice = tgui_input_list(user, "Remove the rocks from [src]?", "Rock Removal", list("Yes", "No")) + if(choice != "Yes") + return + var/turf/src_turf = get_turf(src) - var/obj/item/content_obj = holding_storage.contents[1] - if(!content_obj) + for(var/obj/item/removed_item in storage_unit.contents) + removed_item.forceMove(src_turf) + + balloon_alert(user, "items removed!") + +/obj/machinery/xenoarch/digger/xenoarch_process() + var/turf/src_turf = get_turf(src) + if(length(storage_unit.contents) <= 0) return - if(!istype(content_obj, /obj/item/xenoarch/strange_rock)) - qdel(content_obj) - return - var/obj/item/xenoarch/strange_rock/strange_rock = content_obj - new strange_rock.hidden_item(src_turf) - playsound(src, 'sound/machines/click.ogg', 50, TRUE) - qdel(strange_rock) - world_compare = world.time + (process_speed * 4) - addtimer(CALLBACK(src, PROC_REF(do_machine_process)), (process_speed * 4)) + + var/obj/item/xenoarch/strange_rock/first_item = storage_unit.contents[1] + new first_item.hidden_item(src_turf) + qdel(first_item) diff --git a/modular_skyrat/modules/xenoarch/icons/xenoarch_items.dmi b/modular_skyrat/modules/xenoarch/icons/xenoarch_items.dmi index 99d8b2bf76b..125fe0bb45e 100644 Binary files a/modular_skyrat/modules/xenoarch/icons/xenoarch_items.dmi and b/modular_skyrat/modules/xenoarch/icons/xenoarch_items.dmi differ diff --git a/modular_zubbers/code/_globalvars/lists/maintenance_loot_rare.dm b/modular_zubbers/code/_globalvars/lists/maintenance_loot_rare.dm index 0b277a6873d..e040ff8611c 100644 --- a/modular_zubbers/code/_globalvars/lists/maintenance_loot_rare.dm +++ b/modular_zubbers/code/_globalvars/lists/maintenance_loot_rare.dm @@ -1,4 +1,4 @@ -GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items +GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items - TODO: FIND THE NEW PATHS FROM THE COMMENTED PARTS /obj/item/aicard/aitater = 10, /obj/item/ammo_box/foambox/riot = 50, list( @@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/ammo_casing/shotgun/express = 1, /obj/item/ammo_casing/shotgun/flechette = 1, /obj/item/ammo_casing/shotgun/frag12 = 1, - /obj/item/ammo_casing/shotgun/honk = 25, +// /obj/item/ammo_casing/shotgun/honk = 25, // /obj/item/ammo_casing/shotgun/hp = 1, /obj/item/ammo_casing/shotgun/hunter = 1, // /obj/item/ammo_casing/shotgun/iceblox = 1, diff --git a/modular_zubbers/code/_globalvars/lists/text.dm b/modular_zubbers/code/_globalvars/lists/text.dm index a7c8efec5f4..46a86830ca8 100644 --- a/modular_zubbers/code/_globalvars/lists/text.dm +++ b/modular_zubbers/code/_globalvars/lists/text.dm @@ -1,8 +1,10 @@ /// Ensures sentences end in appropriate punctuation (a period if none exist) /// and that all whitespace-bounded 'i' characters are capitalized. -/proc/autopunct_bare(input_text) +/* /proc/autopunct_bare(input_text) if (findtext(input_text, GLOB.has_no_eol_punctuation)) input_text += "." input_text = replacetext(input_text, GLOB.noncapital_i, "I") return input_text + */ +// TODO: REMOVE FILE IF UN-NEEDED. UNTICKED AS OF FEB 3RD 2023. NEW VERSION IN MODULAR SKYRAT FILES. diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/powers/targeted/lunge.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/powers/targeted/lunge.dm index 4e4730866b3..20b5e93ff4d 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/powers/targeted/lunge.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/powers/targeted/lunge.dm @@ -137,7 +137,7 @@ user.spin(10) return // Is my target a Monster hunter? - if(target.is_shove_knockdown_blocked()) + if(HAS_TRAIT(target, TRAIT_SHOVE_KNOCKDOWN_BLOCKED)) owner.balloon_alert(owner, "pushed away!") target.grabbedby(owner) return diff --git a/rust_g.dll b/rust_g.dll index cfb52ffc65a..30f63e72f4b 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/attributions.txt b/sound/attributions.txt index e7ceb44f08b..82486a5735d 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -113,3 +113,27 @@ laser2.ogg is adapted with 3 SFX made by junggle (CC 4), inferno (CC Sampling+), https://freesound.org/people/junggle/sounds/28917/ https://freesound.org/people/inferno/sounds/18397/ https://freesound.org/people/humanoide9000/sounds/330293/ + +reel1.ogg, reel2.ogg, reel3.ogg, reel4.ogg and reel5.ogg adapted from pixabay. Free for use under the Pixabay Content License (https://pixabay.com/service/license-summary/): +https://pixabay.com/sound-effects/reel-78063/ + +throw.ogg, throwhard.ogg and throwsoft.ogg (Royalty-Free and Copyright-Free) are adapted from Jam FX, SmartSound FX and Epic Stock Media in : +https://uppbeat.io/sfx/whoosh-swift-cut/7727/23617 +https://uppbeat.io/sfx/whoosh-air-punch/114/1168 +https://uppbeat.io/sfx/throwing-item-swing/9430/25267 + +rock_break.ogg is taken from Bertsz's Rock Destroy from Freesound.org, CC0: +https://freesound.org/people/Bertsz/sounds/524312/ + +sonar-ping.ogg and radar-ping is taken and modified from SamsterBirdies' Sonar Ping from Freesound.org, CC0: +https://freesound.org/people/SamsterBirdies/sounds/539957/ + +manual_teleport.ogg is taken from Quetzakol's teleport from Freesound.org, CC0: +https://freesound.org/people/Quetzakol/sounds/520743/ + +auto_teleport.ogg is taken from Steaq's A teleportation from Freesound.org, CC0: +https://freesound.org/people/steaq/sounds/560124/ + +refinery.ogg, smelter.ogg, and wooping_teleport.ogg are all original works by ArcaneMusic, +with smelter.ogg using samples from rock_break alongside original sound effects from a warrior electric drill, +where refinery and wooping_teleport are modifications of that same electric drill recording. diff --git a/sound/effects/moon_parade.ogg b/sound/effects/moon_parade.ogg new file mode 100644 index 00000000000..2b18ce32952 Binary files /dev/null and b/sound/effects/moon_parade.ogg differ diff --git a/sound/effects/moon_parade_soundloop.ogg b/sound/effects/moon_parade_soundloop.ogg new file mode 100644 index 00000000000..c7879b6488c Binary files /dev/null and b/sound/effects/moon_parade_soundloop.ogg differ diff --git a/sound/effects/rock_break.ogg b/sound/effects/rock_break.ogg new file mode 100644 index 00000000000..09f6b1d5d33 Binary files /dev/null and b/sound/effects/rock_break.ogg differ diff --git a/sound/items/reel1.ogg b/sound/items/reel1.ogg new file mode 100644 index 00000000000..0bd2cda89b9 Binary files /dev/null and b/sound/items/reel1.ogg differ diff --git a/sound/items/reel2.ogg b/sound/items/reel2.ogg new file mode 100644 index 00000000000..64d2bc1adb4 Binary files /dev/null and b/sound/items/reel2.ogg differ diff --git a/sound/items/reel3.ogg b/sound/items/reel3.ogg new file mode 100644 index 00000000000..a1d89779ec1 Binary files /dev/null and b/sound/items/reel3.ogg differ diff --git a/sound/items/reel4.ogg b/sound/items/reel4.ogg new file mode 100644 index 00000000000..ae9bdb2f5e3 Binary files /dev/null and b/sound/items/reel4.ogg differ diff --git a/sound/items/reel5.ogg b/sound/items/reel5.ogg new file mode 100644 index 00000000000..6c979754a5f Binary files /dev/null and b/sound/items/reel5.ogg differ diff --git a/sound/machines/mining/auto_teleport.ogg b/sound/machines/mining/auto_teleport.ogg new file mode 100644 index 00000000000..a8fe669e865 Binary files /dev/null and b/sound/machines/mining/auto_teleport.ogg differ diff --git a/sound/machines/mining/manual_teleport.ogg b/sound/machines/mining/manual_teleport.ogg new file mode 100644 index 00000000000..b011ef91e65 Binary files /dev/null and b/sound/machines/mining/manual_teleport.ogg differ diff --git a/sound/machines/mining/refinery.ogg b/sound/machines/mining/refinery.ogg new file mode 100644 index 00000000000..fdae21f9a30 Binary files /dev/null and b/sound/machines/mining/refinery.ogg differ diff --git a/sound/machines/mining/smelter.ogg b/sound/machines/mining/smelter.ogg new file mode 100644 index 00000000000..b1d65f3bd20 Binary files /dev/null and b/sound/machines/mining/smelter.ogg differ diff --git a/sound/machines/mining/wooping_teleport.ogg b/sound/machines/mining/wooping_teleport.ogg new file mode 100644 index 00000000000..edf5eb57b43 Binary files /dev/null and b/sound/machines/mining/wooping_teleport.ogg differ diff --git a/sound/machines/radar-ping.ogg b/sound/machines/radar-ping.ogg new file mode 100644 index 00000000000..d6fd0000d1a Binary files /dev/null and b/sound/machines/radar-ping.ogg differ diff --git a/sound/machines/sonar-ping.ogg b/sound/machines/sonar-ping.ogg new file mode 100644 index 00000000000..c69d4352095 Binary files /dev/null and b/sound/machines/sonar-ping.ogg differ diff --git a/sound/weapons/kenetic_accel.ogg b/sound/weapons/kinetic_accel.ogg similarity index 100% rename from sound/weapons/kenetic_accel.ogg rename to sound/weapons/kinetic_accel.ogg diff --git a/sound/weapons/kenetic_reload.ogg b/sound/weapons/kinetic_reload.ogg similarity index 100% rename from sound/weapons/kenetic_reload.ogg rename to sound/weapons/kinetic_reload.ogg diff --git a/sound/weapons/throw.ogg b/sound/weapons/throw.ogg new file mode 100644 index 00000000000..e9e282ae3b1 Binary files /dev/null and b/sound/weapons/throw.ogg differ diff --git a/sound/weapons/throwhard.ogg b/sound/weapons/throwhard.ogg new file mode 100644 index 00000000000..b628c534b88 Binary files /dev/null and b/sound/weapons/throwhard.ogg differ diff --git a/sound/weapons/throwsoft.ogg b/sound/weapons/throwsoft.ogg new file mode 100644 index 00000000000..6b6f4f9346e Binary files /dev/null and b/sound/weapons/throwsoft.ogg differ diff --git a/strings/antagonist_flavor/traitor_flavor.json b/strings/antagonist_flavor/traitor_flavor.json index 93da8d01374..773d2f55370 100644 --- a/strings/antagonist_flavor/traitor_flavor.json +++ b/strings/antagonist_flavor/traitor_flavor.json @@ -111,5 +111,13 @@ "roundend_report": "was a terrorist from Waffle Corporation.", "ui_theme": "syndicate", "uplink": "You have been provided with a standard uplink to accomplish your task." + }, + "Contractor Support Unit": { + "allies": "You are being sent to help your designated agent. Their allegiences are above all others.", + "goal": "Help your designated agent to the furtest extent you can, their life is above your own.", + "introduction": "You are the Contractor Support Agent.", + "roundend_report": "was a contractor support agent.", + "ui_theme": "syndicate", + "uplink": "You do not come with your own uplink, defer to your agent." } } diff --git a/strings/modular_maps/skyrat/PortTarkon.toml b/strings/modular_maps/skyrat/PortTarkon.toml index f581f30522f..b407b5254c5 100644 --- a/strings/modular_maps/skyrat/PortTarkon.toml +++ b/strings/modular_maps/skyrat/PortTarkon.toml @@ -1,4 +1,10 @@ directory = "_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/" -[rooms.port] -modules = ["defcon5.dmm", "defcon4.dmm", "defcon3.dmm", "defcon2.dmm"] +[rooms.xeno] +modules = ["xeno_safe.dmm", "xeno_dead.dmm", "xeno_nest.dmm"] + +[rooms.cargo] +modules = ["cargo_stock.dmm", "cargo_warehouse.dmm", "cargo_secure.dmm"] + +[rooms.dorm] +modules = ["dorm_classic.dmm", "dorm_cabin.dmm", "dorm_party.dmm"] diff --git a/strings/tips.txt b/strings/tips.txt index 69128714f1f..31ae19a1cad 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -271,3 +271,4 @@ You can use a machine in the vault to deposit cash or rob Cargo's department fun You can use an upgraded microwave to charge your PDA! You'll quickly lose your interest in the game if you play to win and kill. If you find yourself doing this, take a step back and talk to people - it's a much better experience! Some areas of the station use simple nautical directions to indicate their respective locations, like Fore (Front of the ship), Aft (Back), Port (Left side), Starboard (Right), Quarter and Bow (Either sides of Aft and Fore, respectively). You can review these terms on the Notepad App of your PDA. +Modular computers are compatible with integrated circuits, but most of the program-dependent circuits require them to be open/backgrounded to work. To install circuits on stationary consoles, you need to toggle interaction with the frame with right-click first. diff --git a/tgstation.dme b/tgstation.dme index 8a031dcdbb6..19da4e39a2b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -130,6 +130,7 @@ #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\magic.dm" +#include "code\__DEFINES\map_exporter.dm" #include "code\__DEFINES\maintenance_loot.dm" #include "code\__DEFINES\map_switch.dm" #include "code\__DEFINES\mapping.dm" @@ -143,6 +144,7 @@ #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\memory_defines.dm" #include "code\__DEFINES\mergers.dm" +#include "code\__DEFINES\mining.dm" #include "code\__DEFINES\mob_spawn.dm" #include "code\__DEFINES\mobfactions.dm" #include "code\__DEFINES\mobs.dm" @@ -252,6 +254,7 @@ #include "code\__DEFINES\wires.dm" #include "code\__DEFINES\wounds.dm" #include "code\__DEFINES\xenobiology.dm" +#include "code\__DEFINES\zoom.dm" #include "code\__DEFINES\ai\ai.dm" #include "code\__DEFINES\ai\ai_blackboard.dm" #include "code\__DEFINES\ai\bot_keys.dm" @@ -612,6 +615,7 @@ #include "code\_globalvars\phobias.dm" #include "code\_globalvars\rcd.dm" #include "code\_globalvars\religion.dm" +#include "code\_globalvars\silo.dm" #include "code\_globalvars\tgui.dm" #include "code\_globalvars\time_vars.dm" #include "code\_globalvars\lists\achievements.dm" @@ -635,6 +639,7 @@ #include "code\_globalvars\lists\rcd.dm" #include "code\_globalvars\lists\reagents.dm" #include "code\_globalvars\lists\rtd.dm" +#include "code\_globalvars\lists\silo.dm" #include "code\_globalvars\lists\typecache.dm" #include "code\_globalvars\lists\wiremod.dm" #include "code\_globalvars\lists\xenobiology.dm" @@ -753,6 +758,7 @@ #include "code\controllers\subsystem\mouse_entered.dm" #include "code\controllers\subsystem\nightshift.dm" #include "code\controllers\subsystem\npcpool.dm" +#include "code\controllers\subsystem\ore_generation.dm" #include "code\controllers\subsystem\overlays.dm" #include "code\controllers\subsystem\pai.dm" #include "code\controllers\subsystem\parallax.dm" @@ -882,7 +888,6 @@ #include "code\datums\position_point_vector.dm" #include "code\datums\profiling.dm" #include "code\datums\progressbar.dm" -#include "code\datums\recipe.dm" #include "code\datums\request_message.dm" #include "code\datums\ruins.dm" #include "code\datums\saymode.dm" @@ -891,6 +896,7 @@ #include "code\datums\sprite_accessories.dm" #include "code\datums\station_alert.dm" #include "code\datums\station_integrity.dm" +#include "code\datums\stock_market_events.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\verb_callbacks.dm" #include "code\datums\verbs.dm" @@ -931,7 +937,10 @@ #include "code\datums\actions\mobs\blood_warp.dm" #include "code\datums\actions\mobs\charge.dm" #include "code\datums\actions\mobs\charge_apc.dm" +#include "code\datums\actions\mobs\chase_target.dm" #include "code\datums\actions\mobs\conjure_foamwall.dm" +#include "code\datums\actions\mobs\create_legion_skull.dm" +#include "code\datums\actions\mobs\create_legion_turrets.dm" #include "code\datums\actions\mobs\dash.dm" #include "code\datums\actions\mobs\defensive_mode.dm" #include "code\datums\actions\mobs\fire_breath.dm" @@ -1485,6 +1494,7 @@ #include "code\datums\elements\dextrous.dm" #include "code\datums\elements\diggable.dm" #include "code\datums\elements\digitalcamo.dm" +#include "code\datums\elements\disarm_attack.dm" #include "code\datums\elements\door_pryer.dm" #include "code\datums\elements\drag_pickup.dm" #include "code\datums\elements\dryable.dm" @@ -1648,6 +1658,7 @@ #include "code\datums\looping_sounds\item_sounds.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" #include "code\datums\looping_sounds\music.dm" +#include "code\datums\looping_sounds\projectiles.dm" #include "code\datums\looping_sounds\vents.dm" #include "code\datums\looping_sounds\weather.dm" #include "code\datums\mapgen\CaveGenerator.dm" @@ -1658,7 +1669,6 @@ #include "code\datums\martial\_martial.dm" #include "code\datums\martial\boxing.dm" #include "code\datums\martial\cqc.dm" -#include "code\datums\martial\hugs_of_the_gondola.dm" #include "code\datums\martial\krav_maga.dm" #include "code\datums\martial\mushpunch.dm" #include "code\datums\martial\plasma_fist.dm" @@ -1687,6 +1697,7 @@ #include "code\datums\mood_events\dna_infuser_events.dm" #include "code\datums\mood_events\drink_events.dm" #include "code\datums\mood_events\drug_events.dm" +#include "code\datums\mood_events\eldritch_painting_events.dm" #include "code\datums\mood_events\food_events.dm" #include "code\datums\mood_events\generic_negative_events.dm" #include "code\datums\mood_events\generic_positive_events.dm" @@ -1877,6 +1888,7 @@ #include "code\datums\status_effects\debuffs\fire_stacks.dm" #include "code\datums\status_effects\debuffs\genetic_damage.dm" #include "code\datums\status_effects\debuffs\hallucination.dm" +#include "code\datums\status_effects\debuffs\hooked.dm" #include "code\datums\status_effects\debuffs\jitteriness.dm" #include "code\datums\status_effects\debuffs\pacifism.dm" #include "code\datums\status_effects\debuffs\screen_blur.dm" @@ -1919,6 +1931,7 @@ #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\brm.dm" #include "code\datums\wires\conveyor.dm" #include "code\datums\wires\ecto_sniffer.dm" #include "code\datums\wires\emitter.dm" @@ -1944,6 +1957,7 @@ #include "code\datums\wounds\blunt.dm" #include "code\datums\wounds\bones.dm" #include "code\datums\wounds\burns.dm" +#include "code\datums\wounds\cranial_fissure.dm" #include "code\datums\wounds\loss.dm" #include "code\datums\wounds\pierce.dm" #include "code\datums\wounds\slash.dm" @@ -2750,6 +2764,7 @@ #include "code\game\objects\structures\icemoon\cave_entrance.dm" #include "code\game\objects\structures\lavaland\geyser.dm" #include "code\game\objects\structures\lavaland\necropolis_tendril.dm" +#include "code\game\objects\structures\lavaland\ore_vent.dm" #include "code\game\objects\structures\plaques\_plaques.dm" #include "code\game\objects\structures\plaques\static_plaques.dm" #include "code\game\objects\structures\signs\_signs.dm" @@ -2916,6 +2931,7 @@ #include "code\modules\admin\verbs\list_exposer.dm" #include "code\modules\admin\verbs\machine_upgrade.dm" #include "code\modules\admin\verbs\manipulate_organs.dm" +#include "code\modules\admin\verbs\map_export.dm" #include "code\modules\admin\verbs\map_template_loadverb.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\maprotation.dm" @@ -3093,9 +3109,11 @@ #include "code\modules\antagonists\heretic\heretic_monsters.dm" #include "code\modules\antagonists\heretic\influences.dm" #include "code\modules\antagonists\heretic\knife_effect.dm" +#include "code\modules\antagonists\heretic\moon_lunatic.dm" #include "code\modules\antagonists\heretic\rust_effect.dm" #include "code\modules\antagonists\heretic\transmutation_rune.dm" #include "code\modules\antagonists\heretic\items\eldritch_flask.dm" +#include "code\modules\antagonists\heretic\items\eldritch_painting.dm" #include "code\modules\antagonists\heretic\items\forbidden_book.dm" #include "code\modules\antagonists\heretic\items\heretic_armor.dm" #include "code\modules\antagonists\heretic\items\heretic_blades.dm" @@ -3104,18 +3122,21 @@ #include "code\modules\antagonists\heretic\items\keyring.dm" #include "code\modules\antagonists\heretic\items\labyrinth_handbook.dm" #include "code\modules\antagonists\heretic\items\madness_mask.dm" +#include "code\modules\antagonists\heretic\items\unfathomable_curio.dm" #include "code\modules\antagonists\heretic\knowledge\ash_lore.dm" #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\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_flesh.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" @@ -3144,10 +3165,15 @@ #include "code\modules\antagonists\heretic\magic\flesh_ascension.dm" #include "code\modules\antagonists\heretic\magic\flesh_surgery.dm" #include "code\modules\antagonists\heretic\magic\furious_steel.dm" +#include "code\modules\antagonists\heretic\magic\lunatic_track.dm" #include "code\modules\antagonists\heretic\magic\madness_touch.dm" #include "code\modules\antagonists\heretic\magic\manse_link.dm" #include "code\modules\antagonists\heretic\magic\mansus_grasp.dm" +#include "code\modules\antagonists\heretic\magic\mind_gate.dm" #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" @@ -3292,7 +3318,6 @@ #include "code\modules\art\paintings.dm" #include "code\modules\art\statues.dm" #include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\doorcontrol.dm" #include "code\modules\assembly\flash.dm" #include "code\modules\assembly\health.dm" @@ -3352,6 +3377,7 @@ #include "code\modules\asset_cache\assets\seeds.dm" #include "code\modules\asset_cache\assets\sheetmaterials.dm" #include "code\modules\asset_cache\assets\supplypods.dm" +#include "code\modules\asset_cache\assets\tcomms.dm" #include "code\modules\asset_cache\assets\tgfont.dm" #include "code\modules\asset_cache\assets\tgui.dm" #include "code\modules\asset_cache\assets\uplink.dm" @@ -3536,6 +3562,7 @@ #include "code\modules\buildmode\submodes\copy.dm" #include "code\modules\buildmode\submodes\delete.dm" #include "code\modules\buildmode\submodes\fill.dm" +#include "code\modules\buildmode\submodes\map_export.dm" #include "code\modules\buildmode\submodes\mapgen.dm" #include "code\modules\buildmode\submodes\outfit.dm" #include "code\modules\buildmode\submodes\proccall.dm" @@ -4223,7 +4250,6 @@ #include "code\modules\jobs\departments\departments.dm" #include "code\modules\jobs\job_types\_job.dm" #include "code\modules\jobs\job_types\ai.dm" -#include "code\modules\jobs\job_types\assistant.dm" #include "code\modules\jobs\job_types\atmospheric_technician.dm" #include "code\modules\jobs\job_types\bartender.dm" #include "code\modules\jobs\job_types\botanist.dm" @@ -4276,6 +4302,9 @@ #include "code\modules\jobs\job_types\antagonists\space_wizard.dm" #include "code\modules\jobs\job_types\antagonists\wizard_apprentice.dm" #include "code\modules\jobs\job_types\antagonists\xenomorph.dm" +#include "code\modules\jobs\job_types\assistant\assistant.dm" +#include "code\modules\jobs\job_types\assistant\colorful_assistants.dm" +#include "code\modules\jobs\job_types\assistant\gimmick_assistants.dm" #include "code\modules\jobs\job_types\chaplain\chaplain.dm" #include "code\modules\jobs\job_types\chaplain\chaplain_costumes.dm" #include "code\modules\jobs\job_types\chaplain\chaplain_divine_archer.dm" @@ -4500,9 +4529,13 @@ #include "code\modules\mining\mine_items.dm" #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" -#include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mining\satchel_ore_box.dm" #include "code\modules\mining\shelters.dm" #include "code\modules\mining\voucher_sets.dm" +#include "code\modules\mining\boulder_processing\_boulder_processing.dm" +#include "code\modules\mining\boulder_processing\boulder.dm" +#include "code\modules\mining\boulder_processing\brm.dm" +#include "code\modules\mining\boulder_processing\refinery.dm" #include "code\modules\mining\equipment\explorer_gear.dm" #include "code\modules\mining\equipment\kheiral_cuffs.dm" #include "code\modules\mining\equipment\kinetic_crusher.dm" @@ -4718,6 +4751,7 @@ #include "code\modules\mob\living\basic\lavaland\mook\mook_abilities.dm" #include "code\modules\mob\living\basic\lavaland\mook\mook_ai.dm" #include "code\modules\mob\living\basic\lavaland\mook\mook_village.dm" +#include "code\modules\mob\living\basic\lavaland\node_drone\node_drone.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher_ai.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher_gaze.dm" @@ -5044,7 +5078,9 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\slime\ai.dm" #include "code\modules\mob\living\simple_animal\slime\death.dm" +#include "code\modules\mob\living\simple_animal\slime\defense.dm" #include "code\modules\mob\living\simple_animal\slime\emote.dm" #include "code\modules\mob\living\simple_animal\slime\life.dm" #include "code\modules\mob\living\simple_animal\slime\powers.dm" @@ -5095,6 +5131,7 @@ #include "code\modules\mod\modules\modules_timeline.dm" #include "code\modules\mod\modules\modules_visor.dm" #include "code\modules\modular_computers\computers\item\computer.dm" +#include "code\modules\modular_computers\computers\item\computer_circuit.dm" #include "code\modules\modular_computers\computers\item\computer_files.dm" #include "code\modules\modular_computers\computers\item\computer_power.dm" #include "code\modules\modular_computers\computers\item\computer_ui.dm" @@ -5114,6 +5151,7 @@ #include "code\modules\modular_computers\file_system\data.dm" #include "code\modules\modular_computers\file_system\picture_file.dm" #include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_circuit.dm" #include "code\modules\modular_computers\file_system\programs\airestorer.dm" #include "code\modules\modular_computers\file_system\programs\alarm.dm" #include "code\modules\modular_computers\file_system\programs\arcade.dm" @@ -5159,6 +5197,7 @@ #include "code\modules\modular_computers\file_system\programs\maintenance\phys_scanner.dm" #include "code\modules\modular_computers\file_system\programs\maintenance\spectre_meter.dm" #include "code\modules\modular_computers\file_system\programs\maintenance\themes.dm" +#include "code\modules\modular_computers\file_system\programs\messenger\messenger_circuit.dm" #include "code\modules\modular_computers\file_system\programs\messenger\messenger_data.dm" #include "code\modules\modular_computers\file_system\programs\messenger\messenger_program.dm" #include "code\modules\movespeed\_movespeed_modifier.dm" @@ -5237,7 +5276,6 @@ #include "code\modules\power\cell.dm" #include "code\modules\power\energy_accumulator.dm" #include "code\modules\power\floodlight.dm" -#include "code\modules\power\generator.dm" #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\monitor.dm" #include "code\modules\power\multiz.dm" @@ -5249,6 +5287,7 @@ #include "code\modules\power\smes.dm" #include "code\modules\power\solar.dm" #include "code\modules\power\terminal.dm" +#include "code\modules\power\thermoelectric_generator.dm" #include "code\modules\power\tracker.dm" #include "code\modules\power\apc\apc_appearance.dm" #include "code\modules\power\apc\apc_attack.dm" @@ -5559,6 +5598,7 @@ #include "code\modules\research\designs\autolathe\engineering_designs.dm" #include "code\modules\research\designs\autolathe\materials.dm" #include "code\modules\research\designs\autolathe\medsci_designs.dm" +#include "code\modules\research\designs\autolathe\mining.dm" #include "code\modules\research\designs\autolathe\multi-department_designs.dm" #include "code\modules\research\designs\autolathe\security_designs.dm" #include "code\modules\research\designs\autolathe\service_designs.dm" @@ -5881,6 +5921,7 @@ #include "code\modules\transport\tram\tram_doors.dm" #include "code\modules\transport\tram\tram_floors.dm" #include "code\modules\transport\tram\tram_machinery.dm" +#include "code\modules\transport\tram\tram_power.dm" #include "code\modules\transport\tram\tram_remote.dm" #include "code\modules\transport\tram\tram_signals.dm" #include "code\modules\transport\tram\tram_structures.dm" @@ -6143,7 +6184,9 @@ #include "interface\fonts\tiny_unicode.dm" #include "interface\fonts\vcr_osd_mono.dm" #include "modular_skyrat\master_files\code\_globalvars\configuration.dm" +#include "modular_skyrat\master_files\code\_globalvars\regexes.dm" #include "modular_skyrat\master_files\code\_globalvars\religion.dm" +#include "modular_skyrat\master_files\code\_globalvars\text.dm" #include "modular_skyrat\master_files\code\_globalvars\lists\ambience.dm" #include "modular_skyrat\master_files\code\_globalvars\lists\chat.dm" #include "modular_skyrat\master_files\code\_onclick\cyborg.dm" @@ -6195,6 +6238,7 @@ #include "modular_skyrat\master_files\code\datums\traits\negative.dm" #include "modular_skyrat\master_files\code\datums\traits\neutral.dm" #include "modular_skyrat\master_files\code\datums\votes\_vote_datum.dm" +#include "modular_skyrat\master_files\code\datums\votes\map_vote.dm" #include "modular_skyrat\master_files\code\game\atoms.dm" #include "modular_skyrat\master_files\code\game\sound.dm" #include "modular_skyrat\master_files\code\game\effects\spawners\random\structure.dm" @@ -6426,6 +6470,7 @@ #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\dogs.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\poppy.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\friendly\syndicatefox.dm" +#include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\alien.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\bubblegum.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\grabbagmob.dm" #include "modular_skyrat\master_files\code\modules\mob\living\simple_animal\hostile\zombie.dm" @@ -6644,12 +6689,14 @@ #include "modular_skyrat\modules\better_vox\code\vox_clothing.dm" #include "modular_skyrat\modules\better_vox\code\vox_species.dm" #include "modular_skyrat\modules\better_vox\code\vox_sprite_accessories.dm" +#include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\area.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\choice_beacon.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\disk.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\fluff.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\fog_of_war.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\ghost_spawner.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\iv_drip.dm" +#include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\mapping_helpers.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\mine.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\mobs.dm" #include "modular_skyrat\modules\bitrunning\code\virtual_domains\ancient_milsim\mod.dm" @@ -6833,8 +6880,13 @@ #include "modular_skyrat\modules\colony_fabricator\code\looping_sounds.dm" #include "modular_skyrat\modules\colony_fabricator\code\repacking_element.dm" #include "modular_skyrat\modules\colony_fabricator\code\appliances\chem_machines.dm" +#include "modular_skyrat\modules\colony_fabricator\code\appliances\co2_cracker.dm" +#include "modular_skyrat\modules\colony_fabricator\code\appliances\foodricator.dm" +#include "modular_skyrat\modules\colony_fabricator\code\appliances\recycler.dm" #include "modular_skyrat\modules\colony_fabricator\code\appliances\wall_cell_charger.dm" +#include "modular_skyrat\modules\colony_fabricator\code\appliances\wind_turbine.dm" #include "modular_skyrat\modules\colony_fabricator\code\construction\doors.dm" +#include "modular_skyrat\modules\colony_fabricator\code\construction\manual_door.dm" #include "modular_skyrat\modules\colony_fabricator\code\construction\turfs.dm" #include "modular_skyrat\modules\colony_fabricator\code\construction\windows.dm" #include "modular_skyrat\modules\colony_fabricator\code\design_datums\appliances.dm" @@ -6848,7 +6900,13 @@ #include "modular_skyrat\modules\colony_fabricator\code\design_datums\fabricator_flag_additions\machine_boards.dm" #include "modular_skyrat\modules\colony_fabricator\code\design_datums\fabricator_flag_additions\stock_parts.dm" #include "modular_skyrat\modules\colony_fabricator\code\design_datums\fabricator_flag_additions\tools.dm" +#include "modular_skyrat\modules\colony_fabricator\code\design_datums\rations_printer_designs\ingredients.dm" +#include "modular_skyrat\modules\colony_fabricator\code\design_datums\rations_printer_designs\reagents.dm" +#include "modular_skyrat\modules\colony_fabricator\code\design_datums\rations_printer_designs\seeds.dm" +#include "modular_skyrat\modules\colony_fabricator\code\design_datums\rations_printer_designs\snacks.dm" +#include "modular_skyrat\modules\colony_fabricator\code\design_datums\rations_printer_designs\utensils.dm" #include "modular_skyrat\modules\colony_fabricator\code\machines\arc_furnace.dm" +#include "modular_skyrat\modules\colony_fabricator\code\machines\ore_silo.dm" #include "modular_skyrat\modules\colony_fabricator\code\machines\power_storage_unit.dm" #include "modular_skyrat\modules\colony_fabricator\code\machines\rtg.dm" #include "modular_skyrat\modules\colony_fabricator\code\machines\solar_panels.dm" @@ -6966,6 +7024,7 @@ #include "modular_skyrat\modules\customization\modules\clothing\masks\breath.dm" #include "modular_skyrat\modules\customization\modules\clothing\masks\gas_filter.dm" #include "modular_skyrat\modules\customization\modules\clothing\masks\gasmask.dm" +#include "modular_skyrat\modules\customization\modules\clothing\masks\masquerade_mask.dm" #include "modular_skyrat\modules\customization\modules\clothing\masks\paper.dm" #include "modular_skyrat\modules\customization\modules\clothing\neck\_neck.dm" #include "modular_skyrat\modules\customization\modules\clothing\neck\cloaks.dm" @@ -7015,6 +7074,7 @@ #include "modular_skyrat\modules\customization\modules\language\common.dm" #include "modular_skyrat\modules\customization\modules\language\gutter.dm" #include "modular_skyrat\modules\customization\modules\language\monkey.dm" +#include "modular_skyrat\modules\customization\modules\language\mothic.dm" #include "modular_skyrat\modules\customization\modules\language\mushroom.dm" #include "modular_skyrat\modules\customization\modules\language\nekomimetic.dm" #include "modular_skyrat\modules\customization\modules\language\panslavic.dm" @@ -7095,6 +7155,7 @@ #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\corrupted_stomach.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\corrupted_tongue.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\hemophage_actions.dm" +#include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\hemophage_moods.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\hemophage_organs.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\hemophage_species.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\hemophage\hemophage_status_effects.dm" @@ -7336,6 +7397,8 @@ #include "modular_skyrat\modules\lorecaster\code\config.dm" #include "modular_skyrat\modules\lorecaster\code\story_manager.dm" #include "modular_skyrat\modules\lorecaster\code\subsystem.dm" +#include "modular_skyrat\modules\lowpop\code\config.dm" +#include "modular_skyrat\modules\lowpop\code\lowpop_subsystem.dm" #include "modular_skyrat\modules\manufacturer_examine\code\gun_company_additions.dm" #include "modular_skyrat\modules\manufacturer_examine\code\manufacturer_element.dm" #include "modular_skyrat\modules\mapping\code\airless.dm" @@ -7371,7 +7434,6 @@ #include "modular_skyrat\modules\mapping\code\spaceship_items.dm" #include "modular_skyrat\modules\mapping\code\spaceship_turfs.dm" #include "modular_skyrat\modules\mapping\code\static_plaques.dm" -#include "modular_skyrat\modules\mapping\code\tarkon_atmos_control.dm" #include "modular_skyrat\modules\mapping\code\tools.dm" #include "modular_skyrat\modules\mapping\code\turf.dm" #include "modular_skyrat\modules\mapping\code\turf_decals.dm" @@ -7400,6 +7462,10 @@ #include "modular_skyrat\modules\marines\code\mod.dm" #include "modular_skyrat\modules\marines\code\modsuit_modules.dm" #include "modular_skyrat\modules\marines\code\smartgun.dm" +#include "modular_skyrat\modules\maturity-prompt\code\client.dm" +#include "modular_skyrat\modules\maturity-prompt\code\config_entries.dm" +#include "modular_skyrat\modules\maturity-prompt\code\maturity_prompt.dm" +#include "modular_skyrat\modules\maturity-prompt\code\maturity_subsystem.dm" #include "modular_skyrat\modules\medical\code\anesthetic_machine.dm" #include "modular_skyrat\modules\medical\code\carbon_examine.dm" #include "modular_skyrat\modules\medical\code\carbon_update_icons.dm" @@ -7449,6 +7515,7 @@ #include "modular_skyrat\modules\microfusion\code\projectiles.dm" #include "modular_skyrat\modules\Midroundtraitor\code\datum_traitor.dm" #include "modular_skyrat\modules\Midroundtraitor\code\event.dm" +#include "modular_skyrat\modules\mining\boulder.dm" #include "modular_skyrat\modules\mining_vendor_additions\code\order_mining.dm" #include "modular_skyrat\modules\modsuit_pai\code\mod_pai.dm" #include "modular_skyrat\modules\modular_ert\code\engineer\engineer.dm" @@ -7627,6 +7694,7 @@ #include "modular_skyrat\modules\modular_weapons\code\autolathe_designs.dm" #include "modular_skyrat\modules\modular_weapons\code\ballistic_master.dm" #include "modular_skyrat\modules\modular_weapons\code\conversion_kits.dm" +#include "modular_skyrat\modules\modular_weapons\code\ds2_gunset.dm" #include "modular_skyrat\modules\modular_weapons\code\energy.dm" #include "modular_skyrat\modules\modular_weapons\code\gunsets.dm" #include "modular_skyrat\modules\modular_weapons\code\melee.dm" @@ -7821,6 +7889,8 @@ #include "modular_skyrat\modules\pollution\code\turf_open.dm" #include "modular_skyrat\modules\poly_commands\parrot.dm" #include "modular_skyrat\modules\positronic_alert_console\code\positronic_alert_console.dm" +#include "modular_skyrat\modules\power\code\powerator.dm" +#include "modular_skyrat\modules\power\code\teg.dm" #include "modular_skyrat\modules\primitive_catgirls\code\clothing.dm" #include "modular_skyrat\modules\primitive_catgirls\code\clothing_vendor.dm" #include "modular_skyrat\modules\primitive_catgirls\code\language.dm" @@ -7847,7 +7917,6 @@ #include "modular_skyrat\modules\primitive_structures\code\windows.dm" #include "modular_skyrat\modules\primitive_structures\code\wooden_ladder.dm" #include "modular_skyrat\modules\prison_transport\code\outfits.dm" -#include "modular_skyrat\modules\projectiles\code\guns\misc\m6pdw.dm" #include "modular_skyrat\modules\protected_roles\code\_job.dm" #include "modular_skyrat\modules\protected_roles\code\antag_restricted_jobs.dm" #include "modular_skyrat\modules\QOL\code\_under.dm" @@ -7916,6 +7985,7 @@ #include "modular_skyrat\modules\shotgunrebalance\code\autolathe_design.dm" #include "modular_skyrat\modules\shotgunrebalance\code\shotgun.dm" #include "modular_skyrat\modules\SiliconQoL\code\_onclick.dm" +#include "modular_skyrat\modules\SiliconQoL\code\countdown.dm" #include "modular_skyrat\modules\SiliconQoL\code\robotic_factory.dm" #include "modular_skyrat\modules\skyrat-uplinks\code\categories\bundles.dm" #include "modular_skyrat\modules\skyrat-uplinks\code\categories\dangerous.dm" @@ -7980,8 +8050,22 @@ #include "modular_skyrat\modules\synths\code\surgery\robot_healing.dm" #include "modular_skyrat\modules\tableflip\code\flipped_table.dm" #include "modular_skyrat\modules\tagline\code\world.dm" +#include "modular_skyrat\modules\tarkon\code\clothing\head.dm" +#include "modular_skyrat\modules\tarkon\code\clothing\mod.dm" +#include "modular_skyrat\modules\tarkon\code\clothing\neck.dm" +#include "modular_skyrat\modules\tarkon\code\clothing\uniform.dm" +#include "modular_skyrat\modules\tarkon\code\guns\m6pdw.dm" +#include "modular_skyrat\modules\tarkon\code\guns\resonance_disruptor.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\atmos_control.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\card.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\fluff.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\radio.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\research.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\spawner.dm" +#include "modular_skyrat\modules\tarkon\code\misc-fluff\tools.dm" #include "modular_skyrat\modules\teshari\code\_clothing_defines.dm" #include "modular_skyrat\modules\teshari\code\_teshari.dm" +#include "modular_skyrat\modules\teshari\code\birdman_food.dm" #include "modular_skyrat\modules\teshari\code\language_holder.dm" #include "modular_skyrat\modules\teshari\code\schechi.dm" #include "modular_skyrat\modules\teshari\code\teshari_bodytype.dm" @@ -8062,7 +8146,6 @@ #include "modular_zubbers\code\_globalvars\lists\maintenance_loot_rare.dm" #include "modular_zubbers\code\_globalvars\lists\maintenance_loot_trash.dm" #include "modular_zubbers\code\_globalvars\lists\maintenance_loot_uncommon.dm" -#include "modular_zubbers\code\_globalvars\lists\text.dm" #include "modular_zubbers\code\_globalvars\lists\~maintenance_loot.dm" #include "modular_zubbers\code\controllers\subsystem\air.dm" #include "modular_zubbers\code\controllers\subsystem\sol_subsystem.dm" diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index 24ba4c47fbd..92dfe1320cb 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -17,7 +17,7 @@ plugins: - simple-import-sort settings: react: - version: '16.10' + version: '18.2' rules: ## Possible Errors ## ---------------------------------------- diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md index 76598fc4674..6084b64082f 100644 --- a/tgui/docs/component-reference.md +++ b/tgui/docs/component-reference.md @@ -358,9 +358,8 @@ and displays selected entry. - See inherited props: [Box](#box) - See inherited props: [Icon](#icon) - `options: string[] | DropdownEntry[]` - An array of strings which will be displayed in the - dropdown when open. See Dropdown.tsx for more adcanced usage with DropdownEntry + dropdown when open. See Dropdown.tsx for more advanced usage with DropdownEntry - `selected: any` - Currently selected entry -- `width: string` - Width of dropdown button and resulting menu; css width value - `over: boolean` - Dropdown renders over instead of below - `color: string` - Color of dropdown button - `noChevron: boolean` - Whether or not the arrow on the right hand side of the dropdown button is visible @@ -556,6 +555,8 @@ A basic text input, which allow users to enter text into a UI. - `onEnter: (e, value) => void` - Fires when the user hits enter. - `onEscape: (e) => void` - Fires when the user hits escape. - `onInput: (e, value) => void` - Fires when the user types into the input. +- `expensive: boolean` - Introduces a delay before updating the input. Useful for large filters, + where you don't want to update on every keystroke. ### `Knob` @@ -738,12 +739,10 @@ Popper lets you position elements so that they don't go out of the bounds of the **Props:** -- `popperContent: ReactNode` - The content that will be put inside the popper. -- `options?: { ... }` - An object of options to pass to `createPopper`. See [https://popper.js.org/docs/v2/constructors/#options] +- `content: ReactNode` - The content that will be put inside the popper. - `isOpen: boolean` - Whether or not the popper is open. -- `placement?: string` - The placement of the popper. See [https://popper.js.org/docs/v2/constructors/#placement] - `onClickOutside?: (e) => void` - A function that will be called when the user clicks outside of the popper. -- `additionalStyles: { ... }` - A map of CSS styles to add to the element that will contain the popper. +- `placement?: string` - The placement of the popper. See [https://popper.js.org/docs/v2/constructors/#placement] ### `ProgressBar` diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 18bc847b011..0dc93df67d0 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -1164,6 +1164,24 @@ $border-width-px: $border-width * 1px; flex-direction: column; } +.ooc_alert { + background: #4d4100; + border: 1px solid #cca300; + margin: 0.5em; + padding: 0.5em 0.5em 0.5em 0.2em; + color: #ffffff; + font-weight: bold; + display: flex; + flex-direction: column; +} + +.ooc_announcement_text { + color: #cca300; + padding: 0.5em 0 0 0.35em; + display: flex; + flex-direction: column; +} + @each $color-name, $color-value in $alert-stripe-colors { .chat_alert_#{$color-name} { color: #ffffff; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 82efa14117a..a3055867f40 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -1092,6 +1092,24 @@ $border-width-px: $border-width * 1px; flex-direction: column; } +.ooc_alert { + background: #bdc8ff; + border: 1px solid #002eb8; + margin: 0.5em; + padding: 0.5em 0.5em 0.5em 0.2em; + color: #00283a; + font-weight: bold; + display: flex; + flex-direction: column; +} + +.ooc_announcement_text { + color: #002eb8; + padding: 0.5em 0 0 0.35em; + display: flex; + flex-direction: column; +} + @each $color-name, $color-value in $alert-stripe-colors { .chat_alert_#{$color-name} { color: #ffffff; diff --git a/tgui/packages/tgui/components/BlockQuote.jsx b/tgui/packages/tgui/components/BlockQuote.tsx similarity index 71% rename from tgui/packages/tgui/components/BlockQuote.jsx rename to tgui/packages/tgui/components/BlockQuote.tsx index 22508d4b885..3c627d3fac2 100644 --- a/tgui/packages/tgui/components/BlockQuote.jsx +++ b/tgui/packages/tgui/components/BlockQuote.tsx @@ -6,9 +6,10 @@ import { classes } from 'common/react'; -import { Box } from './Box'; +import { Box, BoxProps } from './Box'; -export const BlockQuote = (props) => { +export function BlockQuote(props: BoxProps) { const { className, ...rest } = props; + return ; -}; +} diff --git a/tgui/packages/tgui/components/Box.tsx b/tgui/packages/tgui/components/Box.tsx index 6c3eaa1b885..3bf1082e29a 100644 --- a/tgui/packages/tgui/components/Box.tsx +++ b/tgui/packages/tgui/components/Box.tsx @@ -82,7 +82,7 @@ export const halfUnit = (value: unknown) => { const isColorCode = (str: unknown) => !isColorClass(str); const isColorClass = (str: unknown): boolean => { - return typeof str === 'string' && CSS_COLORS.includes(str); + return typeof str === 'string' && CSS_COLORS.includes(str as any); }; const mapRawPropTo = (attrName) => (style, value) => { diff --git a/tgui/packages/tgui/components/Collapsible.jsx b/tgui/packages/tgui/components/Collapsible.jsx deleted file mode 100644 index 12f8fe799b8..00000000000 --- a/tgui/packages/tgui/components/Collapsible.jsx +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { Component } from 'react'; - -import { Box } from './Box'; -import { Button } from './Button'; - -export class Collapsible extends Component { - constructor(props) { - super(props); - const { open } = props; - this.state = { - open: open || false, - }; - } - - render() { - const { props } = this; - const { open } = this.state; - const { children, color = 'default', title, buttons, ...rest } = props; - return ( - -
-
- -
- {buttons && ( -
{buttons}
- )} -
- {open && {children}} -
- ); - } -} diff --git a/tgui/packages/tgui/components/Collapsible.tsx b/tgui/packages/tgui/components/Collapsible.tsx new file mode 100644 index 00000000000..b470ed5ce6d --- /dev/null +++ b/tgui/packages/tgui/components/Collapsible.tsx @@ -0,0 +1,44 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { ReactNode, useState } from 'react'; + +import { Box, BoxProps } from './Box'; +import { Button } from './Button'; + +type Props = Partial<{ + buttons: ReactNode; + open: boolean; + title: ReactNode; +}> & + BoxProps; + +export function Collapsible(props: Props) { + const { children, color, title, buttons, ...rest } = props; + const [open, setOpen] = useState(props.open); + + return ( + +
+
+ +
+ {buttons && ( +
{buttons}
+ )} +
+ {open && {children}} +
+ ); +} diff --git a/tgui/packages/tgui/components/ColorBox.jsx b/tgui/packages/tgui/components/ColorBox.jsx deleted file mode 100644 index 672c86ab2cf..00000000000 --- a/tgui/packages/tgui/components/ColorBox.jsx +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { classes } from 'common/react'; - -import { computeBoxClassName, computeBoxProps } from './Box'; - -export const ColorBox = (props) => { - // prettier-ignore - const { - content, - children, - className, - color, - backgroundColor, - ...rest - } = props; - rest.color = content ? null : 'transparent'; - rest.backgroundColor = color || backgroundColor; - return ( -
- {content || '.'} -
- ); -}; diff --git a/tgui/packages/tgui/components/ColorBox.tsx b/tgui/packages/tgui/components/ColorBox.tsx new file mode 100644 index 00000000000..b04cdd9241a --- /dev/null +++ b/tgui/packages/tgui/components/ColorBox.tsx @@ -0,0 +1,30 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { classes } from 'common/react'; +import { ReactNode } from 'react'; + +import { BoxProps, computeBoxClassName, computeBoxProps } from './Box'; + +type Props = { + content?: ReactNode; +} & BoxProps; + +export function ColorBox(props: Props) { + const { content, children, className, ...rest } = props; + + rest.color = content ? null : 'default'; + rest.backgroundColor = props.color || 'default'; + + return ( +
+ {content || '.'} +
+ ); +} diff --git a/tgui/packages/tgui/components/Dimmer.jsx b/tgui/packages/tgui/components/Dimmer.tsx similarity index 62% rename from tgui/packages/tgui/components/Dimmer.jsx rename to tgui/packages/tgui/components/Dimmer.tsx index 5e92ea84fc1..d1ddb64c4e0 100644 --- a/tgui/packages/tgui/components/Dimmer.jsx +++ b/tgui/packages/tgui/components/Dimmer.tsx @@ -6,13 +6,14 @@ import { classes } from 'common/react'; -import { Box } from './Box'; +import { Box, BoxProps } from './Box'; -export const Dimmer = (props) => { +export function Dimmer(props: BoxProps) { const { className, children, ...rest } = props; + return ( - +
{children}
); -}; +} diff --git a/tgui/packages/tgui/components/Divider.jsx b/tgui/packages/tgui/components/Divider.tsx similarity index 66% rename from tgui/packages/tgui/components/Divider.jsx rename to tgui/packages/tgui/components/Divider.tsx index 8cbf9b77d7d..1582aeadfd4 100644 --- a/tgui/packages/tgui/components/Divider.jsx +++ b/tgui/packages/tgui/components/Divider.tsx @@ -6,8 +6,14 @@ import { classes } from 'common/react'; -export const Divider = (props) => { - const { vertical, hidden } = props; +type Props = Partial<{ + hidden: boolean; + vertical: boolean; +}>; + +export function Divider(props: Props) { + const { hidden, vertical } = props; + return (
{ ])} /> ); -}; +} diff --git a/tgui/packages/tgui/components/Dropdown.tsx b/tgui/packages/tgui/components/Dropdown.tsx index ba385db8e03..4fabfbf0bbf 100644 --- a/tgui/packages/tgui/components/Dropdown.tsx +++ b/tgui/packages/tgui/components/Dropdown.tsx @@ -1,7 +1,7 @@ import { classes } from 'common/react'; -import { ReactNode, useState } from 'react'; +import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'; -import { Box, BoxProps } from './Box'; +import { BoxProps, unit } from './Box'; import { Button } from './Button'; import { Icon } from './Icon'; import { Popper } from './Popper'; @@ -14,21 +14,37 @@ type DropdownEntry = { type DropdownOption = string | DropdownEntry; type Props = { + /** An array of strings which will be displayed in the + dropdown when open. See Dropdown.tsx for more advanced usage with DropdownEntry */ options: DropdownOption[]; - onSelected: (selected: any) => void; + /** Called when a value is picked from the list, `value` is the value that was picked */ + onSelected: (value: any) => void; } & Partial<{ + /** Whether to display previous / next buttons */ buttons: boolean; + /** Whether to clip the selected text */ clipSelectedText: boolean; + /** Color of dropdown button */ color: string; + /** Disables the dropdown */ disabled: boolean; + /** Text to always display in place of the selected text */ displayText: ReactNode; + /** Icon to display in dropdown button */ icon: string; + /** Angle of the icon */ iconRotation: number; + /** Whether or not the icon should spin */ iconSpin: boolean; + /** Width of the dropdown menu. Default: 15rem */ menuWidth: string; + /** Whether or not the arrow on the right hand side of the dropdown button is visible */ noChevron: boolean; + /** Called when dropdown button is clicked */ onClick: (event) => void; + /** Dropdown renders over instead of below */ over: boolean; + /** Currently selected entry */ selected: string | number; }> & BoxProps; @@ -60,49 +76,55 @@ export function Dropdown(props: Props) { const [open, setOpen] = useState(false); const adjustedOpen = over ? !open : open; - - /** Get the index of the selected option */ - function getSelectedIndex() { - return options.findIndex((option) => { - return getOptionValue(option) === selected; - }); - } + const innerRef = useRef(null); /** Update the selected value when clicking the left/right buttons */ - function updateSelected(direction: 'previous' | 'next') { - if (options.length < 1 || disabled) { - return; - } + const updateSelected = useCallback( + (direction: 'previous' | 'next') => { + if (options.length < 1 || disabled) { + return; + } + const startIndex = 0; + const endIndex = options.length - 1; - let selectedIndex = getSelectedIndex(); - const startIndex = 0; - const endIndex = options.length - 1; + let selectedIndex = options.findIndex( + (option) => getOptionValue(option) === selected, + ); - const hasSelected = selectedIndex >= 0; - if (!hasSelected) { - selectedIndex = direction === 'next' ? endIndex : startIndex; - } + if (selectedIndex < 0) { + selectedIndex = direction === 'next' ? endIndex : startIndex; + } - const newIndex = - direction === 'next' - ? selectedIndex === endIndex - ? startIndex - : selectedIndex + 1 - : selectedIndex === startIndex - ? endIndex - : selectedIndex - 1; + let newIndex = selectedIndex; + if (direction === 'next') { + newIndex = selectedIndex === endIndex ? startIndex : selectedIndex++; + } else { + newIndex = selectedIndex === startIndex ? endIndex : selectedIndex--; + } - onSelected?.(getOptionValue(options[newIndex])); - } + onSelected?.(getOptionValue(options[newIndex])); + }, + [disabled, onSelected, options, selected], + ); + + /** Allows the menu to be scrollable on open */ + useEffect(() => { + if (!open) return; + + innerRef.current?.focus(); + }, [open]); return ( setOpen(false)} placement={over ? 'top-start' : 'bottom-start'} - popperContent={ -
+ content={ +
{options.length === 0 && (
No options
)} @@ -116,8 +138,7 @@ export function Dropdown(props: Props) { 'Dropdown__menuentry', selected === value && 'selected', ])} - id="dropdown-item" - key={value} + key={index} onClick={() => { setOpen(false); onSelected?.(value); @@ -130,64 +151,70 @@ export function Dropdown(props: Props) {
} > - -
{ - if (disabled && !open) { - return; - } - setOpen(!open); - onClick?.(event); - }} - > - {icon && ( - - )} - +
+
{ + if (disabled && !open) { + return; + } + setOpen(!open); + onClick?.(event); }} > - {displayText || selected} - - {!noChevron && ( - - + {icon && ( + + )} + + {displayText || selected} + {!noChevron && ( + + + + )} +
+ {buttons && ( + <> +
- - {buttons && ( - <> -
); } diff --git a/tgui/packages/tgui/components/Input.tsx b/tgui/packages/tgui/components/Input.tsx index a8c9038022e..b4993914c5c 100644 --- a/tgui/packages/tgui/components/Input.tsx +++ b/tgui/packages/tgui/components/Input.tsx @@ -11,39 +11,81 @@ import { KeyboardEvent, SyntheticEvent, useEffect, useRef } from 'react'; import { Box, BoxProps } from './Box'; -type Props = Partial<{ +type ConditionalProps = + | { + /** + * Mark this if you want to debounce onInput. + * + * This is useful for expensive filters, large lists etc. + * + * Requires `onInput` to be set. + */ + expensive?: boolean; + /** + * Fires on each key press / value change. Used for searching. + * + * If it's a large list, consider using `expensive` prop. + */ + onInput: (event: SyntheticEvent, value: string) => void; + } + | { + /** This prop requires onInput to be set */ + expensive?: never; + onInput?: never; + }; + +type OptionalProps = Partial<{ + /** Automatically focuses the input on mount */ autoFocus: boolean; + /** Automatically selects the input value on focus */ autoSelect: boolean; + /** The class name of the input */ className: string; + /** Disables the input */ disabled: boolean; + /** Mark this if you want the input to be as wide as possible */ fluid: boolean; + /** The maximum length of the input value */ maxLength: number; + /** Mark this if you want to use a monospace font */ monospace: boolean; /** Fires when user is 'done typing': Clicked out, blur, enter key */ onChange: (event: SyntheticEvent, value: string) => void; /** Fires once the enter key is pressed */ - onEnter: (event: SyntheticEvent, value: string) => void; + onEnter?: (event: SyntheticEvent, value: string) => void; /** Fires once the escape key is pressed */ onEscape: (event: SyntheticEvent) => void; - /** Fires on each key press / value change. Used for searching */ - onInput: (event: SyntheticEvent, value: string) => void; + /** The placeholder text when everything is cleared */ placeholder: string; + /** Clears the input value on enter */ selfClear: boolean; + /** The state variable of the input. */ value: string | number; -}> & - BoxProps; +}>; -export const toInputValue = (value: string | number | undefined) => - typeof value !== 'number' && typeof value !== 'string' ? '' : String(value); +type Props = OptionalProps & ConditionalProps & BoxProps; -const inputDebounce = debounce((onInput: () => void) => onInput(), 200); +export function toInputValue(value: string | number | undefined) { + return typeof value !== 'number' && typeof value !== 'string' + ? '' + : String(value); +} -export const Input = (props: Props) => { +const inputDebounce = debounce((onInput: () => void) => onInput(), 250); + +/** + * ### Input + * A basic text input which allow users to enter text into a UI. + * > Input does not support custom font size and height due to the way + * > it's implemented in CSS. Eventually, this needs to be fixed. + */ +export function Input(props: Props) { const { autoFocus, autoSelect, className, disabled, + expensive, fluid, maxLength, monospace, @@ -59,7 +101,19 @@ export const Input = (props: Props) => { const inputRef = useRef(null); - const handleKeyDown = (event: KeyboardEvent) => { + function handleInput(event: SyntheticEvent) { + if (!onInput) return; + + const value = event.currentTarget?.value; + + if (expensive) { + inputDebounce(() => onInput(event, value)); + } else { + onInput(event, value); + } + } + + function handleKeyDown(event: KeyboardEvent) { if (event.key === KEY.Enter) { onEnter?.(event, event.currentTarget.value); if (selfClear) { @@ -78,7 +132,7 @@ export const Input = (props: Props) => { event.currentTarget.value = toInputValue(value); event.currentTarget.blur(); } - }; + } /** Focuses the input on mount */ useEffect(() => { @@ -123,13 +177,11 @@ export const Input = (props: Props) => { disabled={disabled} maxLength={maxLength} onBlur={(event) => onChange?.(event, event.target.value)} - onChange={(event) => - onInput && inputDebounce(() => onInput(event, event.target.value)) - } + onChange={handleInput} onKeyDown={handleKeyDown} placeholder={placeholder} ref={inputRef} />
); -}; +} diff --git a/tgui/packages/tgui/components/LabeledControls.jsx b/tgui/packages/tgui/components/LabeledControls.tsx similarity index 78% rename from tgui/packages/tgui/components/LabeledControls.jsx rename to tgui/packages/tgui/components/LabeledControls.tsx index f19bd4eb933..7b352633e6b 100644 --- a/tgui/packages/tgui/components/LabeledControls.jsx +++ b/tgui/packages/tgui/components/LabeledControls.tsx @@ -4,10 +4,11 @@ * @license MIT */ -import { Flex } from './Flex'; +import { Flex, FlexProps } from './Flex'; -export const LabeledControls = (props) => { +export function LabeledControls(props: FlexProps) { const { children, wrap, ...rest } = props; + return ( { {children} ); -}; +} -const LabeledControlsItem = (props) => { +type ItemProps = { + label: string; +} & FlexProps; + +function LabeledControlsItem(props: ItemProps) { const { label, children, mx = 1, ...rest } = props; + return ( { ); -}; +} LabeledControls.Item = LabeledControlsItem; diff --git a/tgui/packages/tgui/components/Modal.jsx b/tgui/packages/tgui/components/Modal.tsx similarity index 77% rename from tgui/packages/tgui/components/Modal.jsx rename to tgui/packages/tgui/components/Modal.tsx index da17c6e5c84..30803d0dbf2 100644 --- a/tgui/packages/tgui/components/Modal.jsx +++ b/tgui/packages/tgui/components/Modal.tsx @@ -6,11 +6,12 @@ import { classes } from 'common/react'; -import { computeBoxClassName, computeBoxProps } from './Box'; +import { BoxProps, computeBoxClassName, computeBoxProps } from './Box'; import { Dimmer } from './Dimmer'; -export const Modal = (props) => { +export function Modal(props: BoxProps) { const { className, children, ...rest } = props; + return (
{
); -}; +} diff --git a/tgui/packages/tgui/components/NoticeBox.jsx b/tgui/packages/tgui/components/NoticeBox.jsx deleted file mode 100644 index de36715cc2e..00000000000 --- a/tgui/packages/tgui/components/NoticeBox.jsx +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { classes } from 'common/react'; - -import { Box } from './Box'; - -export const NoticeBox = (props) => { - const { className, color, info, warning, success, danger, ...rest } = props; - return ( - - ); -}; diff --git a/tgui/packages/tgui/components/NoticeBox.tsx b/tgui/packages/tgui/components/NoticeBox.tsx new file mode 100644 index 00000000000..db4f821d6b6 --- /dev/null +++ b/tgui/packages/tgui/components/NoticeBox.tsx @@ -0,0 +1,48 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { classes } from 'common/react'; + +import { Box, BoxProps } from './Box'; + +type Props = ExclusiveProps & BoxProps; + +/** You MUST use only one or none */ +type NoticeType = 'info' | 'success' | 'danger'; + +type None = { + [K in NoticeType]?: undefined; +}; + +type ExclusiveProps = + | None + | (Omit & { + info: boolean; + }) + | (Omit & { + success: boolean; + }) + | (Omit & { + danger: boolean; + }); + +export function NoticeBox(props: Props) { + const { className, color, info, success, danger, ...rest } = props; + + return ( + + ); +} diff --git a/tgui/packages/tgui/components/Popper.tsx b/tgui/packages/tgui/components/Popper.tsx index 973673b81fe..dbc7c18f7b6 100644 --- a/tgui/packages/tgui/components/Popper.tsx +++ b/tgui/packages/tgui/components/Popper.tsx @@ -1,100 +1,95 @@ -import { createPopper, Placement } from '@popperjs/core'; -import { ArgumentsOf } from 'common/types'; +import { Placement } from '@popperjs/core'; import { PropsWithChildren, - useCallback, + ReactNode, useEffect, - useMemo, useRef, + useState, } from 'react'; -import { CSSProperties, JSXElementConstructor, ReactElement } from 'react'; -import { createPortal } from 'react-dom'; +import { usePopper } from 'react-popper'; -type Props = { +type RequiredProps = { + /** The content to display in the popper */ + content: ReactNode; + /** Whether the popper is open */ isOpen: boolean; - popperContent: ReactElement> | null; -} & Partial<{ - additionalStyles: CSSProperties; - autoFocus: boolean; +}; + +type OptionalProps = Partial<{ + /** Called when the user clicks outside the popper */ onClickOutside: () => void; - options: ArgumentsOf[2]; + /** Where to place the popper relative to the reference element */ placement: Placement; -}> & - PropsWithChildren; +}>; -export function Popper(props: Props) { - const { - additionalStyles, - autoFocus, - children, - isOpen, - placement, - popperContent, - options = {}, - onClickOutside, - } = props; +type Props = RequiredProps & OptionalProps; - const parentRef = useRef(null); +/** + * ## Popper + * Popper lets you position elements so that they don't go out of the bounds of the window. + * @url https://popper.js.org/react-popper/ for more information. + */ +export function Popper(props: PropsWithChildren) { + const { children, content, isOpen, onClickOutside, placement } = props; + + const [referenceElement, setReferenceElement] = + useState(null); + const [popperElement, setPopperElement] = useState( + null, + ); + + // One would imagine we could just use useref here, but it's against react-popper documentation and causes a positioning bug + // We still need them to call focus and clickoutside events :( const popperRef = useRef(null); + const parentRef = useRef(null); - const handleClickOutside = useCallback((event: MouseEvent) => { + const { styles, attributes } = usePopper(referenceElement, popperElement, { + placement, + }); + + /** Close the popper when the user clicks outside */ + function handleClickOutside(event: MouseEvent) { if ( - !parentRef.current?.contains(event.target as Node) && - !popperRef.current?.contains(event.target as Node) + !popperRef.current?.contains(event.target as Node) && + !parentRef.current?.contains(event.target as Node) ) { onClickOutside?.(); } - }, []); + } - /** Create the popper instance when the component mounts */ useEffect(() => { - if (!parentRef.current || !popperRef.current) return; - if (placement) options.placement = placement; - - const instance = createPopper( - parentRef.current, - popperRef.current, - options, - ); - - return () => { - instance.destroy(); - }; - }, [options]); - - /** Focus when opened, adds click outside listener */ - useEffect(() => { - if (!isOpen) return; - - if (autoFocus) { - const focusable = popperRef.current?.firstChild as HTMLElement | null; - focusable?.focus(); + if (isOpen) { + document.addEventListener('mousedown', handleClickOutside); + } else { + document.removeEventListener('mousedown', handleClickOutside); } - if (!onClickOutside) return; - - document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); - const contentStyle = useMemo(() => { - return { - ...additionalStyles, - position: 'absolute', - zIndex: 1000, - } as CSSProperties; - }, [additionalStyles]); - return ( <> -
{children}
- {createPortal( -
- {isOpen && popperContent} -
, - document.body, +
{ + setReferenceElement(node); + parentRef.current = node; + }} + > + {children} +
+ {isOpen && ( +
{ + setPopperElement(node); + popperRef.current = node; + }} + style={{ ...styles.popper, zIndex: 5 }} + {...attributes.popper} + > + {content} +
)} ); diff --git a/tgui/packages/tgui/components/ProgressBar.tsx b/tgui/packages/tgui/components/ProgressBar.tsx index 9cb442479ea..ce2f071ba08 100644 --- a/tgui/packages/tgui/components/ProgressBar.tsx +++ b/tgui/packages/tgui/components/ProgressBar.tsx @@ -53,7 +53,10 @@ export const ProgressBar = (props: Props) => { const fillStyles = { width: clamp01(scaledValue) * 100 + '%', }; - if (CSS_COLORS.includes(effectiveColor) || effectiveColor === 'default') { + if ( + CSS_COLORS.includes(effectiveColor as any) || + effectiveColor === 'default' + ) { // If the color is a color- class, just use that. outerClasses.push('ProgressBar--color--' + effectiveColor); } else { diff --git a/tgui/packages/tgui/components/Section.tsx b/tgui/packages/tgui/components/Section.tsx index 8c9b8639f5d..f84e779a6a7 100644 --- a/tgui/packages/tgui/components/Section.tsx +++ b/tgui/packages/tgui/components/Section.tsx @@ -5,55 +5,84 @@ */ import { canRender, classes } from 'common/react'; -import { forwardRef, ReactNode, RefObject, useEffect } from 'react'; +import { forwardRef, ReactNode, RefObject, useEffect, useRef } from 'react'; import { addScrollableNode, removeScrollableNode } from '../events'; import { BoxProps, computeBoxClassName, computeBoxProps } from './Box'; -export type SectionProps = Partial<{ +type Props = Partial<{ + /** Buttons to render aside the section title. */ buttons: ReactNode; + /** If true, fills all available vertical space. */ fill: boolean; + /** If true, removes all section padding. */ fitted: boolean; + /** Shows or hides the scrollbar. */ scrollable: boolean; + /** Shows or hides the horizontal scrollbar. */ scrollableHorizontal: boolean; + /** Title of the section. */ title: ReactNode; /** @member Callback function for the `scroll` event */ onScroll: ((this: GlobalEventHandlers, ev: Event) => any) | null; }> & BoxProps; +/** + * ## Section + * Section is a surface that displays content and actions on a single topic. + * + * They should be easy to scan for relevant and actionable information. + * Elements, like text and images, should be placed in them in a way that + * clearly indicates hierarchy. + * + * Sections can now be nested, and will automatically font size of the + * header according to their nesting level. Previously this was done via `level` + * prop, but now it is automatically calculated. + * + * Section can also be titled to clearly define its purpose. + * + * ```tsx + *
Here you can order supply crates.
+ * ``` + * + * If you want to have a button on the right side of an section title + * (for example, to perform some sort of action), there is a way to do that: + * + * ```tsx + *
Send shuttle}> + * Here you can order supply crates. + *
+ * ``` + */ export const Section = forwardRef( - (props: SectionProps, ref: RefObject) => { + (props: Props, forwardedRef: RefObject) => { const { - className, - title, buttons, + children, + className, fill, fitted, + onScroll, scrollable, scrollableHorizontal, - children, - onScroll, + title, ...rest } = props; + const contentRef = useRef(null); + const hasTitle = canRender(title) || canRender(buttons); + /** We want to be able to scroll on hover, but using focus will steal it from inputs */ useEffect(() => { - if (!ref?.current) return; + if (!contentRef.current) return; + if (!scrollable && !scrollableHorizontal) return; + + addScrollableNode(contentRef.current); - if (scrollable || scrollableHorizontal) { - addScrollableNode(ref.current); - if (onScroll && ref.current) { - ref.current.onscroll = onScroll; - } - } return () => { - if (!ref?.current) return; - - if (scrollable || scrollableHorizontal) { - removeScrollableNode(ref.current); - } + removeScrollableNode(contentRef.current!); }; }, []); @@ -69,7 +98,7 @@ export const Section = forwardRef( computeBoxClassName(rest), ])} {...computeBoxProps(rest)} - ref={ref} + ref={forwardedRef} > {hasTitle && (
@@ -78,7 +107,11 @@ export const Section = forwardRef(
)}
-
+
{children}
diff --git a/tgui/packages/tgui/components/Tooltip.tsx b/tgui/packages/tgui/components/Tooltip.tsx index e824ccf734f..f3936f32c66 100644 --- a/tgui/packages/tgui/components/Tooltip.tsx +++ b/tgui/packages/tgui/components/Tooltip.tsx @@ -1,3 +1,5 @@ +/* eslint-disable react/no-deprecated */ +// TODO: Rewrite as an FC, remove this lint disable import { createPopper, Placement, VirtualElement } from '@popperjs/core'; import { Component, ReactNode } from 'react'; import { findDOMNode, render } from 'react-dom'; diff --git a/tgui/packages/tgui/components/VirtualList.tsx b/tgui/packages/tgui/components/VirtualList.tsx new file mode 100644 index 00000000000..263d343bb2d --- /dev/null +++ b/tgui/packages/tgui/components/VirtualList.tsx @@ -0,0 +1,69 @@ +import { + PropsWithChildren, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; + +/** + * A vertical list that renders items to fill space up to the extents of the + * current window, and then defers rendering of other items until they come + * into view. + */ +export const VirtualList = (props: PropsWithChildren) => { + const { children } = props; + const containerRef = useRef(null as HTMLDivElement | null); + const [visibleElements, setVisibleElements] = useState(1); + const [padding, setPadding] = useState(0); + + const adjustExtents = useCallback(() => { + const { current } = containerRef; + + if ( + !children || + !Array.isArray(children) || + !current || + visibleElements >= children.length + ) { + return; + } + + const unusedArea = + document.body.offsetHeight - current.getBoundingClientRect().bottom; + + const averageItemHeight = Math.ceil(current.offsetHeight / visibleElements); + + if (unusedArea > 0) { + const newVisibleElements = Math.min( + children.length, + visibleElements + + Math.max(1, Math.ceil(unusedArea / averageItemHeight)), + ); + + setVisibleElements(newVisibleElements); + + setPadding((children.length - newVisibleElements) * averageItemHeight); + } + }, [containerRef, visibleElements, setVisibleElements, setPadding]); + + useEffect(() => { + adjustExtents(); + + const interval = setInterval(adjustExtents, 100); + + return () => clearInterval(interval); + }, [adjustExtents]); + + return ( +
+
+ {Array.isArray(children) ? children.slice(0, visibleElements) : null} +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/components/index.ts b/tgui/packages/tgui/components/index.ts index 556b2933e5a..1a5f477d256 100644 --- a/tgui/packages/tgui/components/index.ts +++ b/tgui/packages/tgui/components/index.ts @@ -48,3 +48,4 @@ export { TextArea } from './TextArea'; export { TimeDisplay } from './TimeDisplay'; export { Tooltip } from './Tooltip'; export { TrackOutsideClicks } from './TrackOutsideClicks'; +export { VirtualList } from './VirtualList'; diff --git a/tgui/packages/tgui/constants.ts b/tgui/packages/tgui/constants.ts index cb822306211..84b49f5947f 100644 --- a/tgui/packages/tgui/constants.ts +++ b/tgui/packages/tgui/constants.ts @@ -50,25 +50,28 @@ export const COLORS = { // Colors defined in CSS export const CSS_COLORS = [ - 'black', - 'white', - 'red', - 'orange', - 'yellow', - 'olive', - 'green', - 'teal', - 'blue', - 'violet', - 'purple', - 'pink', - 'brown', - 'grey', - 'good', 'average', 'bad', + 'black', + 'blue', + 'brown', + 'good', + 'green', + 'grey', 'label', -]; + 'olive', + 'orange', + 'pink', + 'purple', + 'red', + 'teal', + 'transparent', + 'violet', + 'white', + 'yellow', +] as const; + +export type CssColor = (typeof CSS_COLORS)[number]; /* IF YOU CHANGE THIS KEEP IT IN SYNC WITH CHAT CSS */ export const RADIO_CHANNELS = [ diff --git a/tgui/packages/tgui/interfaces/AccountingConsole.tsx b/tgui/packages/tgui/interfaces/AccountingConsole.tsx index 1e8465c93be..f737234fc6a 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole.tsx @@ -80,7 +80,6 @@ const UsersScreen = (props) => {
{PlayerAccounts.map((account) => ( diff --git a/tgui/packages/tgui/interfaces/Achievements.jsx b/tgui/packages/tgui/interfaces/Achievements.jsx index b20df1025cf..a9b6b914b9e 100644 --- a/tgui/packages/tgui/interfaces/Achievements.jsx +++ b/tgui/packages/tgui/interfaces/Achievements.jsx @@ -1,16 +1,13 @@ import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Box, Flex, Icon, Table, Tabs, Tooltip } from '../components'; import { Window } from '../layouts'; export const Achievements = (props) => { const { data } = useBackend(); const { categories } = data; - const [selectedCategory, setSelectedCategory] = useLocalState( - 'category', - categories[0], - ); + const [selectedCategory, setSelectedCategory] = useState(categories[0]); const achievements = data.achievements.filter( (x) => x.category === selectedCategory, ); diff --git a/tgui/packages/tgui/interfaces/AdminFax.jsx b/tgui/packages/tgui/interfaces/AdminFax.jsx index 70f752c42e5..81c5aa3618f 100644 --- a/tgui/packages/tgui/interfaces/AdminFax.jsx +++ b/tgui/packages/tgui/interfaces/AdminFax.jsx @@ -1,4 +1,6 @@ -import { useBackend, useLocalState } from '../backend'; +import { useState } from 'react'; + +import { useBackend } from '../backend'; import { Box, Button, @@ -26,15 +28,15 @@ export const AdminFax = (props) => { export const FaxMainPanel = (props) => { const { act, data } = useBackend(); - const [fax, setFax] = useLocalState('fax', ''); - const [saved, setSaved] = useLocalState('saved', false); - const [paperName, setPaperName] = useLocalState('paperName', ''); - const [fromWho, setFromWho] = useLocalState('fromWho', ''); - const [rawText, setRawText] = useLocalState('rawText', ''); - const [stamp, setStamp] = useLocalState('stampType', ''); - const [stampCoordX, setStampCoordX] = useLocalState('stampCoordX', 0); - const [stampCoordY, setStampCoordY] = useLocalState('stampCoordY', 0); - const [stampAngle, setStampAngle] = useLocalState('stampAngle', 0); + const [fax, setFax] = useState(''); + const [saved, setSaved] = useState(false); + const [paperName, setPaperName] = useState(''); + const [fromWho, setFromWho] = useState(''); + const [rawText, setRawText] = useState(''); + const [stamp, setStamp] = useState(''); + const [stampCoordX, setStampCoordX] = useState(0); + const [stampCoordY, setStampCoordY] = useState(0); + const [stampAngle, setStampAngle] = useState(0); if (stamp && data.stamps[0] !== 'None') { data.stamps.unshift('None'); } diff --git a/tgui/packages/tgui/interfaces/AirAlarm.tsx b/tgui/packages/tgui/interfaces/AirAlarm.tsx index c42f88d8d83..64876c659be 100644 --- a/tgui/packages/tgui/interfaces/AirAlarm.tsx +++ b/tgui/packages/tgui/interfaces/AirAlarm.tsx @@ -10,6 +10,7 @@ import { NumberInput, Section, Table, + VirtualList, } from '../components'; import { Window } from '../layouts'; import { @@ -262,11 +263,11 @@ const AirAlarmControlVents = (props) => { return Nothing to show; } return ( - <> + {vents.map((vent) => ( ))} - + ); }; @@ -280,11 +281,11 @@ const AirAlarmControlScrubbers = (props) => { return Nothing to show; } return ( - <> + {scrubbers.map((scrubber) => ( ))} - + ); }; diff --git a/tgui/packages/tgui/interfaces/AirlockButtonController.tsx b/tgui/packages/tgui/interfaces/AirlockButtonController.tsx new file mode 100644 index 00000000000..98a3f7c9113 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AirlockButtonController.tsx @@ -0,0 +1,95 @@ +import { BooleanLike } from 'common/react'; + +import { useBackend } from '../backend'; +import { Button, NoticeBox, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + interior_door: string; + exterior_door: string; + interior_door_closed: BooleanLike; + exterior_door_closed: BooleanLike; + busy: BooleanLike; +}; + +export const AirlockButtonController = (props) => { + const { data } = useBackend(); + const { interior_door, exterior_door } = data; + return ( + + +
+ {!interior_door && !exterior_door ? ( + No doors detected + ) : ( + + {interior_door && ( + + + + )} + {exterior_door && ( + + + + )} + + )} +
+
+
+ ); +}; + +const RetrieveButton = (props) => { + const { act, data } = useBackend(); + const { + interior_door, + exterior_door, + interior_door_closed, + exterior_door_closed, + busy, + } = data; + const { airlockType } = props; + const our_door_closed = + airlockType === interior_door ? interior_door_closed : exterior_door_closed; + const opposite_door_closed = + airlockType === interior_door ? exterior_door_closed : interior_door_closed; + const opposite_door = + airlockType === interior_door ? exterior_door : interior_door; + + return ( + + ); +}; diff --git a/tgui/packages/tgui/interfaces/AlertModal.tsx b/tgui/packages/tgui/interfaces/AlertModal.tsx index 9caa6835cf9..d5b931dc08c 100644 --- a/tgui/packages/tgui/interfaces/AlertModal.tsx +++ b/tgui/packages/tgui/interfaces/AlertModal.tsx @@ -1,3 +1,5 @@ +import { useState } from 'react'; + import { KEY_ENTER, KEY_ESCAPE, @@ -6,7 +8,7 @@ import { KEY_SPACE, KEY_TAB, } from '../../common/keycodes'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Autofocus, Box, Button, Flex, Section, Stack } from '../components'; import { Window } from '../layouts'; import { Loader } from './common/Loader'; @@ -34,7 +36,7 @@ export const AlertModal = (props) => { timeout, title, } = data; - const [selected, setSelected] = useLocalState('selected', 0); + const [selected, setSelected] = useState(0); // Dynamically sets window dimensions const windowHeight = 115 + diff --git a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx index d2786748357..ebdea394748 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx @@ -3,6 +3,7 @@ import { useState } from 'react'; import { useBackend } from '../backend'; import { BlockQuote, Box, Button, Section, Stack, Tabs } from '../components'; +import { CssColor } from '../constants'; import { Window } from '../layouts'; import { Rules } from './AntagInfoRules'; // SKYRAT EDIT ADDITION import { @@ -43,7 +44,7 @@ type Knowledge = { cost: number; disabled: boolean; hereticPath: string; - color: string; + color: CssColor; }; type KnowledgeInfo = { diff --git a/tgui/packages/tgui/interfaces/AntagInfoNightmare.tsx b/tgui/packages/tgui/interfaces/AntagInfoNightmare.tsx index 9cd852db704..e3935e8e64e 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoNightmare.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoNightmare.tsx @@ -12,7 +12,7 @@ const noticestyle = { export const AntagInfoNightmare = (props) => { return ( - + @@ -64,7 +64,8 @@ export const AntagInfoNightmare = (props) => { Your twisted appendage. It will consume the light of what it - touches, be it victim or object. + touches, be it victim or object. After 15 seconds of being in + jaunt, stabbing a foe will stun them or do extra damage.
diff --git a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx index 049a70313b8..3aea989ac27 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx @@ -37,6 +37,7 @@ type Info = { has_uplink: BooleanLike; uplink_intro: string; uplink_unlock_info: string; + given_uplink: BooleanLike; objectives: Objective[]; }; @@ -233,7 +234,7 @@ const CodewordsSection = (props) => { // SKYRAT EDIT: change height from 580 to 650 export const AntagInfoTraitor = (props) => { const { data } = useBackend(); - const { theme } = data; + const { theme, given_uplink } = data; return ( @@ -248,9 +249,11 @@ export const AntagInfoTraitor = (props) => { - - - + {!!given_uplink && ( + + + + )} diff --git a/tgui/packages/tgui/interfaces/ApcControl.jsx b/tgui/packages/tgui/interfaces/ApcControl.jsx index 01e0126aaab..acf46f9f0b8 100644 --- a/tgui/packages/tgui/interfaces/ApcControl.jsx +++ b/tgui/packages/tgui/interfaces/ApcControl.jsx @@ -1,5 +1,6 @@ import { map, sortBy } from 'common/collections'; import { flow } from 'common/fp'; +import { useState } from 'react'; import { useBackend, useLocalState } from '../backend'; import { @@ -47,7 +48,7 @@ const ApcLoggedOut = (props) => { const ApcLoggedIn = (props) => { const { act, data } = useBackend(); const { restoring } = data; - const [tabIndex, setTabIndex] = useLocalState('tab-index', 1); + const [tabIndex, setTabIndex] = useState(1); return ( diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx index 974b85895e9..adad4f8748e 100644 --- a/tgui/packages/tgui/interfaces/CameraConsole.tsx +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -115,10 +115,12 @@ const CameraSelector = (props) => { setSearchText(value)} + value={searchText} /> diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher.jsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher.jsx deleted file mode 100644 index 417a716ea24..00000000000 --- a/tgui/packages/tgui/interfaces/CentcomPodLauncher.jsx +++ /dev/null @@ -1,1202 +0,0 @@ -import { toFixed } from 'common/math'; -import { classes } from 'common/react'; -import { storage } from 'common/storage'; -import { multiline } from 'common/string'; -import { createUuid } from 'common/uuid'; -import { Component, Fragment } from 'react'; - -import { useBackend, useLocalState } from '../backend'; -import { - Box, - Button, - ByondUi, - Divider, - Input, - Knob, - LabeledControls, - NumberInput, - Section, - Stack, -} from '../components'; -import { Window } from '../layouts'; - -const pod_grey = { - color: 'grey', -}; - -const useCompact = () => { - const [compact, setCompact] = useLocalState('compact', false); - const toggleCompact = () => setCompact(!compact); - return [compact, toggleCompact]; -}; - -export const CentcomPodLauncher = (props) => { - const [compact] = useCompact(); - return ( - - - - ); -}; - -const CentcomPodLauncherContent = (props) => { - const [compact] = useCompact(); - return ( - - - - - - - - - - - - - - - - -
- -
-
-
-
- {!compact && ( - - - - )} - - - - - - - - - {!compact && ( - - - - )} - - - - - -
-
-
-
- ); -}; - -const TABPAGES = [ - { - title: 'View Pod', - component: () => TabPod, - }, - { - title: 'View Bay', - component: () => TabBay, - }, - { - title: 'View Dropoff Location', - component: () => TabDrop, - }, -]; - -const REVERSE_OPTIONS = [ - { - title: 'Mobs', - icon: 'user', - }, - { - title: 'Unanchored\nObjects', - key: 'Unanchored', - icon: 'cube', - }, - { - title: 'Anchored\nObjects', - key: 'Anchored', - icon: 'anchor', - }, - { - title: 'Under-Floor', - key: 'Underfloor', - icon: 'eye-slash', - }, - { - title: 'Wall-Mounted', - key: 'Wallmounted', - icon: 'link', - }, - { - title: 'Floors', - icon: 'border-all', - }, - { - title: 'Walls', - icon: 'square', - }, - { - title: 'Mechs', - key: 'Mecha', - icon: 'truck', - }, -]; - -const DELAYS = [ - { - title: 'Pre', - tooltip: 'Time until pod gets to station', - }, - { - title: 'Fall', - tooltip: 'Duration of pods\nfalling animation', - }, - { - title: 'Open', - tooltip: 'Time it takes pod to open after landing', - }, - { - title: 'Exit', - tooltip: 'Time for pod to\nleave after opening', - }, -]; - -const REV_DELAYS = [ - { - title: 'Pre', - tooltip: 'Time until pod appears above dropoff point', - }, - { - title: 'Fall', - tooltip: 'Duration of pods\nfalling animation', - }, - { - title: 'Open', - tooltip: 'Time it takes pod to open after landing', - }, - { - title: 'Exit', - tooltip: 'Time for pod to\nleave after opening', - }, -]; - -const SOUNDS = [ - { - title: 'Fall', - act: 'fallingSound', - tooltip: 'Plays while pod falls, timed\nto end when pod lands', - }, - { - title: 'Land', - act: 'landingSound', - tooltip: 'Plays after pod lands', - }, - { - title: 'Open', - act: 'openingSound', - tooltip: 'Plays when pod opens', - }, - { - title: 'Exit', - act: 'leavingSound', - tooltip: 'Plays when pod leaves', - }, -]; - -const STYLES = [ - { title: 'Standard' }, - { title: 'Advanced' }, - { title: 'Nanotrasen' }, - { title: 'Syndicate' }, - { title: 'Deathsquad' }, - { title: 'Cultist' }, - { title: 'Missile' }, - { title: 'Syndie Missile' }, - { title: 'Supply Box' }, - { title: 'Clown Pod' }, - { title: 'Fruit' }, - { title: 'Invisible' }, - { title: 'Gondola' }, - { title: 'Seethrough' }, -]; - -const BAYS = [ - { title: '1' }, - { title: '2' }, - { title: '3' }, - { title: '4' }, - { title: 'ERT' }, -]; - -const EFFECTS_LOAD = [ - { - title: 'Launch All Turfs', - icon: 'globe', - choiceNumber: 0, - selected: 'launchChoice', - act: 'launchAll', - }, - { - title: 'Launch Turf Ordered', - icon: 'sort-amount-down-alt', - choiceNumber: 1, - selected: 'launchChoice', - act: 'launchOrdered', - }, - { - title: 'Pick Random Turf', - icon: 'dice', - choiceNumber: 2, - selected: 'launchChoice', - act: 'launchRandomTurf', - }, - { - divider: 1, - }, - { - title: 'Launch Whole Turf', - icon: 'expand', - choiceNumber: 0, - selected: 'launchRandomItem', - act: 'launchWholeTurf', - }, - { - title: 'Pick Random Item', - icon: 'dice', - choiceNumber: 1, - selected: 'launchRandomItem', - act: 'launchRandomItem', - }, - { - divider: 1, - }, - { - title: 'Clone', - icon: 'clone', - soloSelected: 'launchClone', - act: 'launchClone', - }, -]; - -const EFFECTS_NORMAL = [ - { - title: 'Specific Target', - icon: 'user-check', - soloSelected: 'effectTarget', - act: 'effectTarget', - }, - { - title: 'Pod Stays', - icon: 'hand-paper', - choiceNumber: 0, - selected: 'effectBluespace', - act: 'effectBluespace', - }, - { - title: 'Stealth', - icon: 'user-ninja', - soloSelected: 'effectStealth', - act: 'effectStealth', - }, - { - title: 'Quiet', - icon: 'volume-mute', - soloSelected: 'effectQuiet', - act: 'effectQuiet', - }, - { - title: 'Missile Mode', - icon: 'rocket', - soloSelected: 'effectMissile', - act: 'effectMissile', - }, - { - title: 'Burst Launch', - icon: 'certificate', - soloSelected: 'effectBurst', - act: 'effectBurst', - }, - { - title: 'Any Descent Angle', - icon: 'ruler-combined', - soloSelected: 'effectCircle', - act: 'effectCircle', - }, - { - title: 'No Ghost Alert\n(If you dont want to\nentertain bored ghosts)', - icon: 'ghost', - choiceNumber: 0, - selected: 'effectAnnounce', - act: 'effectAnnounce', - }, -]; - -const EFFECTS_HARM = [ - { - title: 'Explosion Custom', - icon: 'bomb', - choiceNumber: 1, - selected: 'explosionChoice', - act: 'explosionCustom', - }, - { - title: 'Adminbus Explosion\nWhat are they gonna do, ban you?', - icon: 'bomb', - choiceNumber: 2, - selected: 'explosionChoice', - act: 'explosionBus', - }, - { - divider: 1, - }, - { - title: 'Custom Damage', - icon: 'skull', - choiceNumber: 1, - selected: 'damageChoice', - act: 'damageCustom', - }, - { - title: 'Gib', - icon: 'skull-crossbones', - choiceNumber: 2, - selected: 'damageChoice', - act: 'damageGib', - }, - { - divider: 1, - }, - { - title: 'Projectile Cloud', - details: true, - icon: 'cloud-meatball', - soloSelected: 'effectShrapnel', - act: 'effectShrapnel', - }, - { - title: 'Stun', - icon: 'sun', - soloSelected: 'effectStun', - act: 'effectStun', - }, - { - title: 'Delimb', - icon: 'socks', - soloSelected: 'effectLimb', - act: 'effectLimb', - }, - { - title: 'Yeet Organs', - icon: 'book-dead', - soloSelected: 'effectOrgans', - act: 'effectOrgans', - }, -]; - -const EFFECTS_ALL = [ - { - list: EFFECTS_LOAD, - label: 'Load From', - alt_label: 'Load', - tooltipPosition: 'right', - }, - { - list: EFFECTS_NORMAL, - label: 'Normal Effects', - tooltipPosition: 'bottom', - }, - { - list: EFFECTS_HARM, - label: 'Harmful Effects', - tooltipPosition: 'bottom', - }, -]; - -const ViewTabHolder = (props) => { - const { act, data } = useBackend(); - const [tabPageIndex, setTabPageIndex] = useLocalState('tabPageIndex', 1); - const { mapRef } = data; - const TabPageComponent = TABPAGES[tabPageIndex].component(); - return ( -
- {!!data.customDropoff && data.effectReverse === 1 && ( -
- ); -}; - -const TabPod = (props) => { - return ( - - Note: You can right click on this -
- blueprint pod and edit vars directly -
- ); -}; - -const TabBay = (props) => { - const { act, data } = useBackend(); - return ( - <> - - ))} - - ); -}; - -const Bays = (props) => { - const { act, data } = useBackend(); - const [compact] = useCompact(); - return ( -
-
- ); -}; - -const Timing = (props) => { - const { act, data } = useBackend(); - return ( -
-
- ); -}; - -const DelayHelper = (props) => { - const { act, data } = useBackend(); - const { delay_list, reverse = false } = props; - return ( - - {delay_list.map((delay, i) => ( - - toFixed(value, 2)} - maxValue={10} - color={ - (reverse ? data.rev_delays[i + 1] : data.delays[i + 1]) / 10 > 10 - ? 'orange' - : 'default' - } - onDrag={(e, value) => { - act('editTiming', { - timer: '' + (i + 1), - value: Math.max(value, 0), - reverse: reverse, - }); - }} - /> - - ))} - - ); -}; - -const Sounds = (props) => { - const { act, data } = useBackend(); - return ( -
act('soundVolume')} - /> - } - > - {SOUNDS.map((sound, i) => ( -
- ); -}; diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/DelayHelper.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/DelayHelper.tsx new file mode 100644 index 00000000000..eb55c5ab94a --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/DelayHelper.tsx @@ -0,0 +1,51 @@ +import { toFixed } from 'common/math'; + +import { useBackend } from '../../backend'; +import { Knob, LabeledControls } from '../../components'; +import { PodDelay, PodLauncherData } from './types'; + +type Props = { + delay_list: PodDelay[]; + reverse?: boolean; +}; + +export function DelayHelper(props: Props) { + const { act, data } = useBackend(); + const { custom_rev_delay, delays, rev_delays } = data; + const { delay_list, reverse = false } = props; + + return ( + + {delay_list.map((delay, i) => ( + + 10 + ? 'orange' + : 'default' + } + format={(value) => toFixed(value, 2)} + inline + maxValue={10} + minValue={0} + onDrag={(e, value) => { + act('editTiming', { + reverse: reverse, + timer: '' + (i + 1), + value: Math.max(value, 0), + }); + }} + size={custom_rev_delay ? 0.75 : 1} + step={0.02} + unclamped + unit="s" + value={(reverse ? rev_delays[i + 1] : delays[i + 1]) / 10} + /> + + ))} + + ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodBays.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodBays.tsx new file mode 100644 index 00000000000..264df99a3c5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodBays.tsx @@ -0,0 +1,55 @@ +import { multiline } from 'common/string'; + +import { useBackend } from '../../backend'; +import { Button, Section } from '../../components'; +import { BAYS } from './constants'; +import { PodLauncherData } from './types'; + +export function PodBays(props) { + const { act, data } = useBackend(); + const { bayNumber } = data; + + return ( +
+ + ))} +
+ ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodLaunch.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodLaunch.tsx new file mode 100644 index 00000000000..1ec92e927a6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodLaunch.tsx @@ -0,0 +1,30 @@ +import { multiline } from 'common/string'; + +import { useBackend } from '../../backend'; +import { Box, Button } from '../../components'; +import { useCompact } from './hooks'; +import { PodLauncherData } from './types'; + +export function PodLaunch(props) { + const { act, data } = useBackend(); + const { giveLauncher } = data; + + const [compact] = useCompact(); + + return ( + + ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodSounds.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodSounds.tsx new file mode 100644 index 00000000000..cd16fa1cd48 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodSounds.tsx @@ -0,0 +1,42 @@ +import { multiline } from 'common/string'; + +import { useBackend } from '../../backend'; +import { Button, Section } from '../../components'; +import { SOUNDS } from './constants'; +import { PodLauncherData } from './types'; + +export function PodSounds(props) { + const { act, data } = useBackend(); + const { defaultSoundVolume, soundVolume } = data; + + return ( +
act('soundVolume')} + selected={soundVolume !== defaultSoundVolume} + tooltip={ + multiline` + Sound Volume:` + soundVolume + } + /> + } + fill + title="Sounds" + > + {SOUNDS.map((sound, i) => ( + + ))} +
+ ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodStatusPage.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodStatusPage.tsx new file mode 100644 index 00000000000..500061e437a --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/PodStatusPage.tsx @@ -0,0 +1,138 @@ +import { Fragment } from 'react'; + +import { useBackend } from '../../backend'; +import { Box, Button, Section, Stack } from '../../components'; +import { EFFECTS_ALL, POD_GREY } from './constants'; +import { useCompact } from './hooks'; +import { PodEffect, PodLauncherData } from './types'; + +export function PodStatusPage(props) { + const [compact] = useCompact(); + + return ( +
+ + {EFFECTS_ALL.map((effectType, typeIdx) => ( + + + + {!compact && (effectType.alt_label || effectType.label)}: + + + {effectType.list.map((effect, effectIdx) => ( + 1} + index={effectIdx} + key={effectIdx} + /> + ))} + + + {typeIdx < EFFECTS_ALL.length && } + {typeIdx === EFFECTS_ALL.length - 1 && } + + ))} + +
+ ); +} + +type EffectDisplayProps = { + effect: PodEffect; + hasMargin: boolean; + index: number; +}; + +function EffectDisplay(props: EffectDisplayProps) { + const { effect, hasMargin, index } = props; + const { act, data } = useBackend(); + const { effectShrapnel, payload, shrapnelMagnitude, shrapnelType } = data; + + if (effect.divider || !('icon' in effect)) { + return ( + + | + + ); + } + + return ( + + ); +} + +function Extras(props) { + const { act } = useBackend(); + const [compact, setCompact] = useCompact(); + + return ( + + + Extras: + + + + ))} + +
+
+ NOTE: Custom sounds from outside the base game files will not save! :( +
+ + ); +} + +type PresetButtonsProps = { + deletePreset: (id: number) => void; + editing: boolean; + loadPreset: (id: number) => void; + presetIndex: number; + setEditing: (status: boolean) => void; +}; + +function PresetButtons(props: PresetButtonsProps) { + const { data } = useBackend(); + const { editing, deletePreset, loadPreset, presetIndex, setEditing } = props; + + return ( + <> + {!editing && ( + + + } + fill + scrollable + title="Style" + > + {STYLES.map((page, i) => ( + + ))} + + ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/Tabs.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/Tabs.tsx new file mode 100644 index 00000000000..3856895c267 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/Tabs.tsx @@ -0,0 +1,53 @@ +import { useBackend } from '../../backend'; +import { Box, Button } from '../../components'; +import { PodLauncherData } from './types'; + +export function TabPod(props) { + return ( + + Note: You can right click on this +
+ blueprint pod and edit vars directly +
+ ); +} + +export function TabBay(props) { + const { act, data } = useBackend(); + const { oldArea } = data; + + return ( + <> + + + + ); +} + +export function TabDrop(props) { + const { act, data } = useBackend(); + const { oldArea } = data; + + return ( + <> + + + + ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/Timing.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/Timing.tsx new file mode 100644 index 00000000000..448def1bee0 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/Timing.tsx @@ -0,0 +1,53 @@ +import { multiline } from 'common/string'; + +import { useBackend } from '../../backend'; +import { Button, Divider, Section } from '../../components'; +import { DELAYS, REV_DELAYS } from './constants'; +import { DelayHelper } from './DelayHelper'; +import { PodLauncherData } from './types'; + +export function Timing(props) { + const { act, data } = useBackend(); + const { custom_rev_delay, effectReverse } = data; + + return ( +
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/ViewTabHolder.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/ViewTabHolder.tsx new file mode 100644 index 00000000000..d513cea1f56 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/ViewTabHolder.tsx @@ -0,0 +1,100 @@ +import { useBackend } from '../../backend'; +import { Button, ByondUi, Section, Stack } from '../../components'; +import { POD_GREY, TABPAGES } from './constants'; +import { useTab } from './hooks'; +import { PodLauncherData } from './types'; + +export function ViewTabHolder(props) { + const { act, data } = useBackend(); + const { mapRef, customDropoff, effectReverse, renderLighting } = data; + + const [tab, setTab] = useTab(); + + const TabPageComponent = TABPAGES[tab].component; + + return ( +
+ {!!customDropoff && !!effectReverse && ( +
+ ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts b/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts new file mode 100644 index 00000000000..f8960231655 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/constants.ts @@ -0,0 +1,346 @@ +import { Placement } from '@popperjs/core'; + +import { TabBay, TabDrop, TabPod } from './Tabs'; +import { PodDelay, PodEffect } from './types'; + +export const POD_GREY = { + color: 'grey', +} as const; + +export const TABPAGES = [ + { + title: 'View Pod', + component: TabPod, + }, + { + title: 'View Bay', + component: TabBay, + }, + { + title: 'View Dropoff Location', + component: TabDrop, + }, +] as const; + +type Option = { + title: string; + key?: string; + icon?: string; +}; + +export const REVERSE_OPTIONS: Option[] = [ + { + title: 'Mobs', + icon: 'user', + }, + { + title: 'Unanchored\nObjects', + key: 'Unanchored', + icon: 'cube', + }, + { + title: 'Anchored\nObjects', + key: 'Anchored', + icon: 'anchor', + }, + { + title: 'Under-Floor', + key: 'Underfloor', + icon: 'eye-slash', + }, + { + title: 'Wall-Mounted', + key: 'Wallmounted', + icon: 'link', + }, + { + title: 'Floors', + icon: 'border-all', + }, + { + title: 'Walls', + icon: 'square', + }, + { + title: 'Mechs', + key: 'Mecha', + icon: 'truck', + }, +]; + +export const DELAYS: PodDelay[] = [ + { + title: 'Pre', + tooltip: 'Time until pod gets to station', + }, + { + title: 'Fall', + tooltip: 'Duration of pods\nfalling animation', + }, + { + title: 'Open', + tooltip: 'Time it takes pod to open after landing', + }, + { + title: 'Exit', + tooltip: 'Time for pod to\nleave after opening', + }, +]; + +export const REV_DELAYS: PodDelay[] = [ + { + title: 'Pre', + tooltip: 'Time until pod appears above dropoff point', + }, + { + title: 'Fall', + tooltip: 'Duration of pods\nfalling animation', + }, + { + title: 'Open', + tooltip: 'Time it takes pod to open after landing', + }, + { + title: 'Exit', + tooltip: 'Time for pod to\nleave after opening', + }, +]; + +export const SOUNDS = [ + { + title: 'Fall', + act: 'fallingSound', + tooltip: 'Plays while pod falls, timed\nto end when pod lands', + }, + { + title: 'Land', + act: 'landingSound', + tooltip: 'Plays after pod lands', + }, + { + title: 'Open', + act: 'openingSound', + tooltip: 'Plays when pod opens', + }, + { + title: 'Exit', + act: 'leavingSound', + tooltip: 'Plays when pod leaves', + }, +]; + +export const STYLES = [ + { title: 'Standard' }, + { title: 'Advanced' }, + { title: 'Nanotrasen' }, + { title: 'Syndicate' }, + { title: 'Deathsquad' }, + { title: 'Cultist' }, + { title: 'Missile' }, + { title: 'Syndie Missile' }, + { title: 'Supply Box' }, + { title: 'Clown Pod' }, + { title: 'Fruit' }, + { title: 'Invisible' }, + { title: 'Gondola' }, + { title: 'Seethrough' }, +] as const; + +export const BAYS = [ + { title: '1' }, + { title: '2' }, + { title: '3' }, + { title: '4' }, + { title: 'ERT' }, +] as const; + +export const EFFECTS_LOAD: PodEffect[] = [ + { + act: 'launchAll', + choiceNumber: 0, + icon: 'globe', + selected: 'launchChoice', + title: 'Launch All Turfs', + }, + { + act: 'launchOrdered', + choiceNumber: 1, + icon: 'sort-amount-down-alt', + selected: 'launchChoice', + title: 'Launch Turf Ordered', + }, + { + act: 'launchRandomTurf', + choiceNumber: 2, + icon: 'dice', + selected: 'launchChoice', + title: 'Pick Random Turf', + }, + { + divider: true, + }, + { + act: 'launchWholeTurf', + choiceNumber: 0, + icon: 'expand', + selected: 'launchRandomItem', + title: 'Launch Whole Turf', + }, + { + act: 'launchRandomItem', + choiceNumber: 1, + icon: 'dice', + selected: 'launchRandomItem', + title: 'Pick Random Item', + }, + { + divider: true, + }, + { + act: 'launchClone', + icon: 'clone', + soloSelected: 'launchClone', + title: 'Clone', + }, +]; + +export const EFFECTS_NORMAL: PodEffect[] = [ + { + act: 'effectTarget', + icon: 'user-check', + soloSelected: 'effectTarget', + title: 'Specific Target', + }, + { + act: 'effectBluespace', + choiceNumber: 0, + icon: 'hand-paper', + selected: 'effectBluespace', + title: 'Pod Stays', + }, + { + act: 'effectStealth', + icon: 'user-ninja', + soloSelected: 'effectStealth', + title: 'Stealth', + }, + { + act: 'effectQuiet', + icon: 'volume-mute', + soloSelected: 'effectQuiet', + title: 'Quiet', + }, + { + act: 'effectMissile', + icon: 'rocket', + soloSelected: 'effectMissile', + title: 'Missile Mode', + }, + { + act: 'effectBurst', + icon: 'certificate', + soloSelected: 'effectBurst', + title: 'Burst Launch', + }, + { + act: 'effectCircle', + icon: 'ruler-combined', + soloSelected: 'effectCircle', + title: 'Any Descent Angle', + }, + { + act: 'effectAnnounce', + choiceNumber: 0, + icon: 'ghost', + selected: 'effectAnnounce', + title: 'No Ghost Alert\n(If you dont want to\nentertain bored ghosts)', + }, +]; + +export const EFFECTS_HARM: PodEffect[] = [ + { + act: 'explosionCustom', + choiceNumber: 1, + icon: 'bomb', + selected: 'explosionChoice', + title: 'Explosion Custom', + }, + { + act: 'explosionBus', + choiceNumber: 2, + icon: 'bomb', + selected: 'explosionChoice', + title: 'Adminbus Explosion\nWhat are they gonna do, ban you?', + }, + { + divider: true, + }, + { + act: 'damageCustom', + choiceNumber: 1, + icon: 'skull', + selected: 'damageChoice', + title: 'Custom Damage', + }, + { + act: 'damageGib', + choiceNumber: 2, + icon: 'skull-crossbones', + selected: 'damageChoice', + title: 'Gib', + }, + { + divider: true, + }, + { + act: 'effectShrapnel', + details: true, + icon: 'cloud-meatball', + soloSelected: 'effectShrapnel', + title: 'Projectile Cloud', + }, + { + act: 'effectStun', + icon: 'sun', + soloSelected: 'effectStun', + title: 'Stun', + }, + { + act: 'effectLimb', + icon: 'socks', + soloSelected: 'effectLimb', + title: 'Delimb', + }, + { + act: 'effectOrgans', + icon: 'book-dead', + soloSelected: 'effectOrgans', + title: 'Yeet Organs', + }, +]; + +type Effect = { + list: typeof EFFECTS_LOAD | typeof EFFECTS_NORMAL | typeof EFFECTS_HARM; + label: string; + alt_label?: string; + tooltipPosition: Placement; +}; + +export const EFFECTS_ALL: Effect[] = [ + { + list: EFFECTS_LOAD, + label: 'Load From', + alt_label: 'Load', + tooltipPosition: 'right', + }, + { + list: EFFECTS_NORMAL, + label: 'Normal Effects', + tooltipPosition: 'bottom', + }, + { + list: EFFECTS_HARM, + label: 'Harmful Effects', + tooltipPosition: 'bottom', + }, +]; diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/hooks.ts b/tgui/packages/tgui/interfaces/CentcomPodLauncher/hooks.ts new file mode 100644 index 00000000000..c85f07eeab1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/hooks.ts @@ -0,0 +1,9 @@ +import { useLocalState } from '../../backend'; + +export function useCompact() { + return useLocalState('compact', false); +} + +export function useTab() { + return useLocalState('tab', 1); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/index.tsx b/tgui/packages/tgui/interfaces/CentcomPodLauncher/index.tsx new file mode 100644 index 00000000000..04dccfe0862 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/index.tsx @@ -0,0 +1,74 @@ +import { Section, Stack } from '../../components'; +import { Window } from '../../layouts'; +import { useCompact } from './hooks'; +import { PodBays } from './PodBays'; +import { PodLaunch } from './PodLaunch'; +import { PodSounds } from './PodSounds'; +import { PodStatusPage } from './PodStatusPage'; +import { PresetsPage } from './PresetsPage'; +import { ReverseMenu } from './ReverseMenu'; +import { StylePage } from './StylePage'; +import { Timing } from './Timing'; +import { ViewTabHolder } from './ViewTabHolder'; + +export function CentcomPodLauncher(props) { + const [compact] = useCompact(); + + return ( + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ {!compact && ( + + + + )} + + + + + + + + + {!compact && ( + + + + )} + + + + + +
+
+
+
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher/types.ts b/tgui/packages/tgui/interfaces/CentcomPodLauncher/types.ts new file mode 100644 index 00000000000..a3c6f35da83 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher/types.ts @@ -0,0 +1,69 @@ +import { Placement } from '@popperjs/core'; +import { BooleanLike } from 'common/react'; + +export type PodLauncherData = { + bayNumber: string; + custom_rev_delay: number; + customDropoff: BooleanLike; + damageChoice: number; + defaultSoundVolume: number; + delays: Record; + effectAnnounce: BooleanLike; + effectBluespace: BooleanLike; + effectBurst: BooleanLike; + effectCircle: BooleanLike; + effectLimb: BooleanLike; + effectMissile: BooleanLike; + effectName: number; + effectOrgans: BooleanLike; + effectQuiet: BooleanLike; + effectReverse: BooleanLike; + effectShrapnel: BooleanLike; + effectStealth: BooleanLike; + effectStun: BooleanLike; + effectTarget: string | null; + explosionChoice: number; + fallingSound: BooleanLike; + giveLauncher: BooleanLike; + landingSound: string | null; + launchChoice: number; + launchClone: BooleanLike; + launchRandomItem: BooleanLike; + leavingSound: string | null; + mapRef: string; + numObjects: number; + oldArea: string | null; + openingSound: string | null; + payload: BooleanLike; + picking_dropoff_turf: BooleanLike; + podDesc: string; + podName: string; + renderLighting: BooleanLike; + rev_delays: Record; + reverse_option_list: Record; + shrapnelMagnitude: number; + shrapnelType: string; + soundVolume: number; + styleChoice: number; +}; + +export type PodDelay = { + title: string; + tooltip: string; +}; + +export type PodEffect = + | { + act: string; + choiceNumber?: number; + content?: string; + details?: boolean; + divider?: never; + icon: string; + payload?: Record; + selected?: string; + soloSelected?: string; + title: string; + tooltipPosition?: Placement; + } + | { divider: boolean }; diff --git a/tgui/packages/tgui/interfaces/CheckboxInput.tsx b/tgui/packages/tgui/interfaces/CheckboxInput.tsx index 0d29afd3dfa..ab98a8a1f02 100644 --- a/tgui/packages/tgui/interfaces/CheckboxInput.tsx +++ b/tgui/packages/tgui/interfaces/CheckboxInput.tsx @@ -1,6 +1,7 @@ import { createSearch, decodeHtmlEntities } from 'common/string'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Button, Icon, @@ -37,12 +38,9 @@ export const CheckboxInput = (props) => { title, } = data; - const [selections, setSelections] = useLocalState('selections', []); + const [selections, setSelections] = useState([]); - const [searchQuery, setSearchQuery] = useLocalState( - 'searchQuery', - '', - ); + const [searchQuery, setSearchQuery] = useState(''); const search = createSearch(searchQuery, (item: string) => item); const toDisplay = items.filter(search); diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.tsx b/tgui/packages/tgui/interfaces/ChemDispenser.tsx index e114d5f5b1d..cb1eedf551f 100644 --- a/tgui/packages/tgui/interfaces/ChemDispenser.tsx +++ b/tgui/packages/tgui/interfaces/ChemDispenser.tsx @@ -22,6 +22,10 @@ type DispensableReagent = { pHCol: string; }; +type TransferableBeaker = Beaker & { + transferAmounts: number[]; +}; + type Data = { showpH: BooleanLike; amount: number; @@ -31,7 +35,7 @@ type Data = { recipes: string[]; recordingRecipe: string[]; recipeReagents: string[]; - beaker: Beaker; + beaker: TransferableBeaker; }; export const ChemDispenser = (props) => { diff --git a/tgui/packages/tgui/interfaces/ChemFilter.tsx b/tgui/packages/tgui/interfaces/ChemFilter.tsx index 4a6dfd5bc9e..7615ec7de7b 100644 --- a/tgui/packages/tgui/interfaces/ChemFilter.tsx +++ b/tgui/packages/tgui/interfaces/ChemFilter.tsx @@ -2,6 +2,7 @@ import { Fragment } from 'react'; import { useBackend } from '../backend'; import { Button, Section, Stack } from '../components'; +import { CssColor } from '../constants'; import { Window } from '../layouts'; type Data = { @@ -12,7 +13,7 @@ type Data = { type Props = { title: string; list: string[]; - buttonColor: string; + buttonColor: CssColor; }; export const ChemFilterPane = (props: Props) => { diff --git a/tgui/packages/tgui/interfaces/ChemHeater.tsx b/tgui/packages/tgui/interfaces/ChemHeater.tsx index c522686b411..d9d61c92592 100644 --- a/tgui/packages/tgui/interfaces/ChemHeater.tsx +++ b/tgui/packages/tgui/interfaces/ChemHeater.tsx @@ -17,7 +17,7 @@ import { COLORS } from '../constants'; import { Window } from '../layouts'; import { Beaker, BeakerSectionDisplay } from './common/BeakerDisplay'; -type ActiveReaction = { +export type ActiveReaction = { name: string; danger: BooleanLike; overheat: BooleanLike; @@ -42,6 +42,144 @@ type Data = { dispenseVolume: number; }; +type ReactionDisplayProps = { + beaker: Beaker; + isFlashing: number; + activeReactions: ActiveReaction[]; + highQualityDisplay: BooleanLike; + highDangerDisplay: BooleanLike; +}; + +export const ReactionDisplay = (props: ReactionDisplayProps) => { + const { + beaker, + isFlashing, + activeReactions, + highQualityDisplay, + highDangerDisplay, + } = props; + + return ( +
+ + 'pH: ' + round(value, 3)} + /> + + + ''} + ranges={{ + red: [-0.22, 1.5], + orange: [1.5, 3], + yellow: [3, 4.5], + olive: [4.5, 5], + good: [5, 6], + green: [6, 8.5], + teal: [8.5, 9.5], + blue: [9.5, 11], + purple: [11, 12.5], + violet: [12.5, 14], + }} + /> + + + } + > + {(activeReactions.length === 0 && ( + No active reactions. + )) || ( + + + + Reaction + + + {!highQualityDisplay ? 'Status' : 'Reaction quality'} + + + Target + + + {activeReactions.map((reaction) => ( + + + {reaction.name} + + + {!highQualityDisplay ? ( + + ) : ( + ''} + ml={5} + ranges={{ + red: [0, reaction.minPure], + orange: [reaction.minPure, reaction.inverse], + yellow: [reaction.inverse, 0.8], + green: [0.8, 1], + }} + /> + )} + + + {highDangerDisplay ? ( + <> + {!!reaction.overheat && ( + + )} + + {reaction.targetVol}u + + + ) : ( + + {reaction.targetVol}u + + )} + + + ))} + +
+ )} +
+ ); +}; + export const ChemHeater = (props) => { const { act, data } = useBackend(); const { @@ -112,7 +250,7 @@ export const ChemHeater = (props) => { unit="K" step={10} stepPixelSize={3} - value={round(targetTemp, 1)} + value={round(targetTemp, 0.1)} minValue={0} maxValue={1000} onDrag={(e, value) => @@ -208,125 +346,13 @@ export const ChemHeater = (props) => { {!!isBeakerLoaded && ( -
- - 'pH: ' + round(value, 3)} - /> - - - ''} - ranges={{ - red: [-0.22, 1.5], - orange: [1.5, 3], - yellow: [3, 4.5], - olive: [4.5, 5], - good: [5, 6], - green: [6, 8.5], - teal: [8.5, 9.5], - blue: [9.5, 11], - purple: [11, 12.5], - violet: [12.5, 14], - }} - /> - - - } - > - {(activeReactions.length === 0 && ( - No active reactions. - )) || ( - - - - Reaction - - - {upgradeLevel < 4 ? 'Status' : 'Reaction quality'} - - - Target - - - {activeReactions.map((reaction) => ( - - - {reaction.name} - - - {(upgradeLevel < 4 && ( - - )) || ( - ''} - ml={5} - ranges={{ - red: [0, reaction.minPure], - orange: [reaction.minPure, reaction.inverse], - yellow: [reaction.inverse, 0.8], - green: [0.8, 1], - }} - /> - )} - - - {(upgradeLevel > 2 && ( - <> - {!!reaction.overheat && ( - - )} - - {reaction.targetVol}u - - - )) || ( - - {reaction.targetVol}u - - )} - - - ))} - -
- )} -
+ = 4} + highDangerDisplay={upgradeLevel >= 2} + /> )}
diff --git a/tgui/packages/tgui/interfaces/ChemPress.tsx b/tgui/packages/tgui/interfaces/ChemPress.tsx index 8a6be52a516..f3881061696 100644 --- a/tgui/packages/tgui/interfaces/ChemPress.tsx +++ b/tgui/packages/tgui/interfaces/ChemPress.tsx @@ -1,6 +1,7 @@ import { capitalizeAll } from 'common/string'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Box, Button, @@ -42,10 +43,7 @@ export const ChemPress = (props) => { packaging_types, packaging_type, } = data; - const [categoryName, setCategoryName] = useLocalState( - 'categoryName', - packaging_category, - ); + const [categoryName, setCategoryName] = useState(packaging_category); const shownCategory = packaging_types.find((category) => category.cat_name === categoryName) || packaging_types[0]; diff --git a/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx b/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx index 05695d3c0f0..dc90a691359 100644 --- a/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx +++ b/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx @@ -1,6 +1,7 @@ import { round, toFixed } from 'common/math'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { AnimatedNumber, Box, @@ -23,10 +24,7 @@ type ReactingData = MixingData & { export const ChemReactionChamber = (props) => { const { act, data } = useBackend(); - const [reagentQuantity, setReagentQuantity] = useLocalState( - 'reagentQuantity', - 1, - ); + const [reagentQuantity, setReagentQuantity] = useState(1); const { emptying, diff --git a/tgui/packages/tgui/interfaces/ChemRecipeDebug.jsx b/tgui/packages/tgui/interfaces/ChemRecipeDebug.jsx deleted file mode 100644 index ed47c6f95b8..00000000000 --- a/tgui/packages/tgui/interfaces/ChemRecipeDebug.jsx +++ /dev/null @@ -1,326 +0,0 @@ -import { round } from 'common/math'; - -import { useBackend } from '../backend'; -import { - AnimatedNumber, - Box, - Button, - Flex, - LabeledList, - NumberInput, - ProgressBar, - RoundGauge, - Section, - Table, -} from '../components'; -import { Window } from '../layouts'; -import { BeakerContents } from './common/BeakerContents'; - -export const ChemRecipeDebug = (props) => { - const { act, data } = useBackend(); - const { - targetTemp, - isActive, - isFlashing, - currentTemp, - currentpH, - forcepH, - forceTemp, - targetVol, - targatpH, - processing, - processAll, - index, - endIndex, - beakerSpawn, - minTemp, - editRecipeName, - editRecipeCold, - editRecipe = [], - chamberContents = [], - activeReactions = [], - queuedReactions = [], - } = data; - return ( - - -
-
-
- - -
-
- - 'pH: ' + round(value, 3)} - /> - - - ''} - ranges={{ - red: [-0.22, 1.5], - orange: [1.5, 3], - yellow: [3, 4.5], - olive: [4.5, 5], - good: [5, 6], - green: [6, 8.5], - teal: [8.5, 9.5], - blue: [9.5, 11], - purple: [11, 12.5], - violet: [12.5, 14], - }} - /> - - - } - > - {(activeReactions.length === 0 && ( - No active reactions. - )) || ( - - - - Reaction - - - {'Reaction quality'} - - - Target - - - {activeReactions && - activeReactions.map((reaction) => ( - - - {reaction.name} - - - ''} - ml={5} - ranges={{ - red: [0, reaction.minPure], - orange: [reaction.minPure, reaction.inverse], - yellow: [reaction.inverse, 0.8], - green: [0.8, 1], - }} - /> - - - - {reaction.targetVol}u - - - - ))} - -
- )} -
-
{isActive ? 'Reacting' : 'Waiting'}} - > - {(chamberContents.length && ( - - )) || Nothing} -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx b/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx new file mode 100644 index 00000000000..c108966bbb7 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx @@ -0,0 +1,437 @@ +import { BooleanLike } from 'common/react'; +import { useState } from 'react'; + +import { useBackend } from '../backend'; +import { + Box, + Button, + Dropdown, + LabeledList, + NumberInput, + Section, + Stack, + Tabs, +} from '../components'; +import { Window } from '../layouts'; +import { ActiveReaction, ReactionDisplay } from './ChemHeater'; +import { Beaker, BeakerSectionDisplay } from './common/BeakerDisplay'; + +const TEMP_MODES = [ + 'Reaction Temp', + 'Forced Temp', + 'Minimum Temp', + 'Optimal Temp', + 'Overheat Temp', +]; +const REACTION_MODES = ['Next Reaction', 'Previous Reaction', 'Pick Reaction']; +const REACTION_VARS = [ + 'Required Temp', + 'Optimal Temp', + 'Overheat Temp', + 'Optimal Min Ph', + 'Optimal Max Ph', + 'Ph Range', + 'Temp Exp Factor', + 'Ph Exp Factor', + 'Thermic Constant', + 'H Ion Release', + 'Rate Up Limit', + 'Purity Min', +]; + +type BeakerDebug = Beaker & { + currentTemp: number; + purity: number; +}; + +type Reaction = { + name: string; + editVar: string; + editValue: number; +}; + +type Data = { + forced_temp: number; + temp_mode: number; + forced_ph: number; + use_forced_ph: BooleanLike; + forced_purity: number; + use_forced_purity: number; + volume_multiplier: number; + isReacting: BooleanLike; + current_reaction_name: string; + current_reaction_mode: number; + beaker: BeakerDebug; + isFlashing: number; + activeReactions: ActiveReaction[]; + editReaction: Reaction; +}; + +export const ChemRecipeDebug = (props) => { + const { act, data } = useBackend(); + const [controlState, setControlState] = useState('Environment'); + const { + forced_temp, + temp_mode, + forced_ph, + use_forced_ph, + forced_purity, + use_forced_purity, + volume_multiplier, + isReacting, + current_reaction_name, + current_reaction_mode, + beaker, + isFlashing, + activeReactions, + editReaction, + } = data; + return ( + + +
+ + setControlState('Environment')} + > + Environment + + setControlState('Reactions')} + > + Reactions + + setControlState('Editing')} + > + Edit Reactions + + + {controlState === 'Environment' && ( +
+ + + + + + act('forced_temp', { + target: value, + }) + } + /> + + + + + + + Temp Mode: + + } + > + + act('temp_mode', { + target: value, + }) + } + /> + + + + + + + + PH:}> + + act('forced_ph', { + target: value, + }) + } + /> + + + + + + + act('toggle_forced_ph')} + > + {use_forced_ph ? 'Disable' : 'Enable'} + + + + + + + + + Purity:}> + + act('forced_purity', { + target: value, + }) + } + /> + + + + + + + act('toggle_forced_purity')} + > + {use_forced_purity ? 'Disable' : 'Enable'} + + + + + + + + + + + act('volume_multiplier', { + target: value, + }) + } + /> + + + + +
+ )} + {controlState === 'Reactions' && ( +
+ + + + + + + + + + + + {current_reaction_name} + + + + + + + Direction: + + } + > + + act('reaction_mode', { + target: value, + }) + } + /> + + + + + + Process:}> + + + + + +
+ )} + {controlState === 'Editing' && ( +
+ + + + + + + + + + + + Param: + + } + > + + act('edit_var', { target: value }) + } + disabled={editReaction === null} + /> + + + + + + Value:}> + + act('edit_value', { + target: value, + }) + } + /> + + + + + +
+ )} +
+ {beaker && ( +
+ + + {beaker.currentTemp} + + + {beaker.purity} + + +
+ )} + {beaker && ( + + )} + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ClockworkSlab.jsx b/tgui/packages/tgui/interfaces/ClockworkSlab.jsx index 63649326f59..6e9eef57d87 100644 --- a/tgui/packages/tgui/interfaces/ClockworkSlab.jsx +++ b/tgui/packages/tgui/interfaces/ClockworkSlab.jsx @@ -1,8 +1,7 @@ // THIS IS A SKYRAT UI FILE import { Fragment } from 'react'; -import { useState } from 'react'; -import { useBackend } from '../backend'; +import { useBackend, useLocalState } from '../backend'; import { Box, Button, @@ -34,7 +33,10 @@ const convertPower = (power_in) => { }; export const ClockworkSlab = (props) => { - const [selectedTab, setSelectedTab] = useState('Servitude'); + const [selectedTab, setSelectedTab] = useLocalState( + 'selectedTab', + 'Servitude', + ); return ( @@ -334,19 +336,16 @@ const ClockworkOverviewStat = (props) => { }; const ClockworkButtonSelection = (props) => { - const [selectedTab, setSelectedTab] = useState({}); + const [selectedTab, setSelectedTab] = useLocalState('selectedTab', {}); const tabs = ['Servitude', 'Preservation', 'Structures']; return ( {tabs.map((tab) => ( - ))} diff --git a/tgui/packages/tgui/interfaces/ColorBlindTester.tsx b/tgui/packages/tgui/interfaces/ColorBlindTester.tsx index e329f2bcfcb..3f33edcedc7 100644 --- a/tgui/packages/tgui/interfaces/ColorBlindTester.tsx +++ b/tgui/packages/tgui/interfaces/ColorBlindTester.tsx @@ -34,7 +34,7 @@ export const ColorBlindTester = (props) => { return ( - + {UI_WARNINGS.map((warning, index) => ( {warning} ))} diff --git a/tgui/packages/tgui/interfaces/CommandReport.tsx b/tgui/packages/tgui/interfaces/CommandReport.tsx index 816cbd86df5..dfe8cf9ff3d 100644 --- a/tgui/packages/tgui/interfaces/CommandReport.tsx +++ b/tgui/packages/tgui/interfaces/CommandReport.tsx @@ -1,4 +1,6 @@ -import { useBackend, useLocalState } from '../backend'; +import { useState } from 'react'; + +import { useBackend } from '../backend'; import { Box, Button, @@ -152,10 +154,7 @@ const AnnouncementSound = (props) => { const ReportText = (props) => { const { act, data } = useBackend(); const { announce_contents, print_report, command_report_content } = data; - const [commandReport, setCommandReport] = useLocalState( - 'textArea', - command_report_content, - ); + const [commandReport, setCommandReport] = useState(command_report_content); return (
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx b/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx index e578c468e2a..b6dc5ac272f 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx @@ -1,5 +1,6 @@ import { sortBy } from 'common/collections'; import { capitalize } from 'common/string'; +import { useState } from 'react'; import { useBackend, useLocalState } from '../backend'; import { @@ -85,7 +86,7 @@ const MessageModal = (props) => { width="80vw" backgroundColor="black" textColor="white" - onChange={(_, value) => { + onInput={(_, value) => { setInput(value.substring(0, maxMessageLength)); }} value={input} @@ -267,27 +268,15 @@ const PageMain = (props) => { shuttleRecallable, } = data; - const [callingShuttle, setCallingShuttle] = useLocalState( - 'calling_shuttle', - false, - ); - const [messagingAssociates, setMessagingAssociates] = useLocalState( - 'messaging_associates', - false, - ); - const [messagingSector, setMessagingSector] = useLocalState( - 'messaing_sector', - null, - ); - const [requestingNukeCodes, setRequestingNukeCodes] = useLocalState( - 'requesting_nuke_codes', - false, - ); + const [callingShuttle, setCallingShuttle] = useState(false); + const [messagingAssociates, setMessagingAssociates] = useState(false); + const [messagingSector, setMessagingSector] = useState(null); + const [requestingNukeCodes, setRequestingNukeCodes] = useState(false); const [ [showAlertLevelConfirm, confirmingAlertLevelTick], setShowAlertLevelConfirm, - ] = useLocalState('showConfirmPrompt', [null, null]); + ] = useState([null, null]); return ( diff --git a/tgui/packages/tgui/interfaces/Cryo.jsx b/tgui/packages/tgui/interfaces/Cryo.jsx deleted file mode 100644 index de547e93fba..00000000000 --- a/tgui/packages/tgui/interfaces/Cryo.jsx +++ /dev/null @@ -1,128 +0,0 @@ -import { useBackend } from '../backend'; -import { - AnimatedNumber, - Button, - LabeledList, - ProgressBar, - Section, -} from '../components'; -import { Window } from '../layouts'; -import { BeakerContents } from './common/BeakerContents'; - -const damageTypes = [ - { - label: 'Brute', - type: 'bruteLoss', - }, - { - label: 'Respiratory', - type: 'oxyLoss', - }, - { - label: 'Toxin', - type: 'toxLoss', - }, - { - label: 'Burn', - type: 'fireLoss', - }, -]; - -export const Cryo = () => { - return ( - - - - - - ); -}; - -const CryoContent = (props) => { - const { act, data } = useBackend(); - return ( - <> -
- - - {data.occupant.name || 'No Occupant'} - - {!!data.hasOccupant && ( - <> - - {data.occupant.stat} - - - - {' K'} - - - 0 ? 'good' : 'average'} - > - - - - {damageTypes.map((damageType) => ( - - - - - - ))} - - )} - -
-
- - - - - - K - - -
-
act('ejectbeaker')} - content="Eject" - /> - } - > - -
- - ); -}; diff --git a/tgui/packages/tgui/interfaces/Cryo.tsx b/tgui/packages/tgui/interfaces/Cryo.tsx new file mode 100644 index 00000000000..2999f4c04d8 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Cryo.tsx @@ -0,0 +1,150 @@ +import { round } from 'common/math'; +import { BooleanLike } from 'common/react'; + +import { useBackend } from '../backend'; +import { + AnimatedNumber, + Button, + LabeledList, + ProgressBar, + Section, +} from '../components'; +import { Window } from '../layouts'; +import { Beaker, BeakerSectionDisplay } from './common/BeakerDisplay'; + +const damageTypes = [ + { + label: 'Brute', + type: 'bruteLoss', + }, + { + label: 'Respiratory', + type: 'oxyLoss', + }, + { + label: 'Toxin', + type: 'toxLoss', + }, + { + label: 'Burn', + type: 'fireLoss', + }, +] as const; + +const stat_to_color = { + Dead: 'bad', + Conscious: 'bad', + Unconscious: 'good', +} as const; + +type Occupant = { + name: string; + stat: string; + bodyTemperature: number; + health: number; + maxHealth: number; + bruteLoss: number; + oxyLoss: number; + toxLoss: number; + fireLoss: number; +}; + +type Data = { + isOperating: BooleanLike; + isOpen: BooleanLike; + autoEject: BooleanLike; + occupant: Occupant; + T0C: number; + cellTemperature: number; + beaker: Beaker; +}; + +export const Cryo = () => { + const { act, data } = useBackend(); + const { occupant, isOperating, isOpen } = data; + + return ( + + +
+ + + {occupant?.name || 'No Occupant'} + + {!!occupant && ( + <> + + {occupant.stat} + + + + {' K'} + + + 0 ? 'good' : 'average'} + > + + + + {damageTypes.map((damageType) => ( + + + + + + ))} + + )} + +
+
+ + + + + + K + + + + + + +
+ +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/EmotePanel.tsx b/tgui/packages/tgui/interfaces/EmotePanel.tsx index 186cdb79ba5..5c2169091c4 100644 --- a/tgui/packages/tgui/interfaces/EmotePanel.tsx +++ b/tgui/packages/tgui/interfaces/EmotePanel.tsx @@ -1,6 +1,8 @@ +import { useState } from 'react'; + import { BooleanLike } from '../../common/react'; import { capitalizeFirst } from '../../common/string'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Box, Button, Flex, Icon, Section } from '../components'; import { Window } from '../layouts'; import { SearchBar } from './common/SearchBar'; @@ -23,47 +25,23 @@ export const EmotePanelContent = (props) => { const { act, data } = useBackend(); const { emotes } = data; - const [filterVisible, toggleVisualFilter] = useLocalState( - 'filterVisible', - false, - ); + const [filterVisible, toggleVisualFilter] = useState(false); - const [filterAudible, toggleAudibleFilter] = useLocalState( - 'filterAudible', - false, - ); + const [filterAudible, toggleAudibleFilter] = useState(false); - const [filterSound, toggleSoundFilter] = useLocalState( - 'filterSound', - false, - ); + const [filterSound, toggleSoundFilter] = useState(false); - const [filterHands, toggleHandsFilter] = useLocalState( - 'filterHands', - false, - ); + const [filterHands, toggleHandsFilter] = useState(false); - const [filterUseParams, toggleUseParamsFilter] = useLocalState( - 'filterUseParams', - false, - ); + const [filterUseParams, toggleUseParamsFilter] = useState(false); - const [useParams, toggleUseParams] = useLocalState( - 'useParams', - false, - ); + const [useParams, toggleUseParams] = useState(false); - const [searchText, setSearchText] = useLocalState('search_text', ''); + const [searchText, setSearchText] = useState(''); - const [showNames, toggleShowNames] = useLocalState( - 'showNames', - true, - ); + const [showNames, toggleShowNames] = useState(true); - const [showIcons, toggleShowIcons] = useLocalState( - 'showIcons', - false, - ); + const [showIcons, toggleShowIcons] = useState(false); return (
diff --git a/tgui/packages/tgui/interfaces/ExoscannerConsole.tsx b/tgui/packages/tgui/interfaces/ExoscannerConsole.tsx index 4b97f52732f..f825964de3b 100644 --- a/tgui/packages/tgui/interfaces/ExoscannerConsole.tsx +++ b/tgui/packages/tgui/interfaces/ExoscannerConsole.tsx @@ -225,9 +225,7 @@ export const ExoscannerConsole = (props) => {
{scan_conditions && scan_conditions.map((condition) => ( - - {condition} - + {condition} ))}
diff --git a/tgui/packages/tgui/interfaces/Experimentator.tsx b/tgui/packages/tgui/interfaces/Experimentator.tsx new file mode 100644 index 00000000000..d2fd0b23b26 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Experimentator.tsx @@ -0,0 +1,246 @@ +import { BooleanLike } from 'common/react'; +import { toTitleCase } from 'common/string'; + +import { useBackend } from '../backend'; +import { + Button, + Icon, + Image, + LabeledList, + NoticeBox, + Section, + Stack, +} from '../components'; +import { Window } from '../layouts'; + +type Data = { + hasItem: BooleanLike; + isOnCooldown: BooleanLike; + isServerConnected: BooleanLike; + loadedItem: Item; +}; + +type Item = { + name: string; + icon: string; + isRelic: BooleanLike; + associatedNodes: Node[]; +}; + +type Node = { + name: string; + isUnlocked: BooleanLike; +}; + +export const Experimentator = (props: any) => { + const { act, data } = useBackend(); + const { hasItem, isOnCooldown, isServerConnected, loadedItem } = data; + + return ( + + + {isServerConnected ? ( + hasItem && loadedItem ? ( + act('eject')} + onExperiment={(id) => act('experiment', { id: id })} + /> + ) : ( + + No item present in experimentation chamber. Please insert one. + + ) + ) : ( + + Not connected to a server. Please sync one using a multitool. + + )} + + + ); +}; + +enum Experiment { + Poke = 'Poke', + Irradiate = 'Irradiate', + Gas = 'Gas', + Heat = 'Heat', + Cold = 'Freeze', + Obliterate = 'Obliterate', +} + +const EXPERIMENT2ICON = { + Poke: 'hand', + Irradiate: 'radiation', + Gas: 'cloud', + Heat: 'fire', + Cold: 'snowflake', + Obliterate: 'trash', +}; + +type ExperimentScreenProps = { + item: Item; + isOnCooldown: BooleanLike; + onEject: () => void; + onExperiment: (id: number) => void; +}; + +const ExperimentScreen = (props: ExperimentScreenProps) => { + const { item, isOnCooldown, onEject, onExperiment } = props; + const { name, icon, isRelic, associatedNodes } = item; + + return ( + + + + + + + + + + + + + + + + ); +}; + +type ItemPreviewProps = { + name: string; + icon: string; + onEject: () => void; +}; + +const ItemPreview = (props: ItemPreviewProps) => { + const { name, icon, onEject } = props; + + return ( + + + + + + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Fabrication/DesignBrowser.tsx b/tgui/packages/tgui/interfaces/Fabrication/DesignBrowser.tsx index b56c4a3d7b3..821f3713a2d 100644 --- a/tgui/packages/tgui/interfaces/Fabrication/DesignBrowser.tsx +++ b/tgui/packages/tgui/interfaces/Fabrication/DesignBrowser.tsx @@ -3,7 +3,7 @@ import { classes } from 'common/react'; import { ReactNode } from 'react'; import { useSharedState } from '../../backend'; -import { Dimmer, Icon, Section, Stack } from '../../components'; +import { Dimmer, Icon, Section, Stack, VirtualList } from '../../components'; import { SearchBar } from '../common/SearchBar'; import { Design, MaterialMap } from './Types'; @@ -271,23 +271,25 @@ export const DesignBrowser = (
{searchText.length > 0 ? ( - sortBy((design: T) => design.name)( - Object.values(root.descendants), - ) - .filter((design) => - design.name - .toLowerCase() - .includes(searchText.toLowerCase()), - ) - .map((design) => - buildRecipeElement( - design, - availableMaterials || {}, - onPrintDesign || NOOP, - ), + + {sortBy((design: T) => design.name)( + Object.values(root.descendants), ) + .filter((design) => + design.name + .toLowerCase() + .includes(searchText.toLowerCase()), + ) + .map((design) => + buildRecipeElement( + design, + availableMaterials || {}, + onPrintDesign || NOOP, + ), + )} + ) : selectedCategory === ALL_CATEGORY ? ( - <> + {sortBy((design: T) => design.name)( Object.values(root.descendants), ).map((design) => @@ -297,7 +299,7 @@ export const DesignBrowser = ( onPrintDesign || NOOP, ), )} - + ) : ( root.subcategories[selectedCategory] && ( ( depth ??= 0; const body = ( - <> + {sortBy((design: T) => design.name)(category.children).map((design) => buildRecipeElement( design, @@ -479,7 +481,7 @@ const CategoryView = ( key={category.title} /> ))} - + ); if (depth === 0 || category.children.length === 0) { diff --git a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx index 3979815126d..2936d93df3f 100644 --- a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx +++ b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx @@ -1,8 +1,8 @@ import { sortBy } from 'common/collections'; import { classes } from 'common/react'; +import { useState } from 'react'; -import { useLocalState } from '../../backend'; -import { AnimatedNumber, Button, Flex, Stack } from '../../components'; +import { AnimatedNumber, Button, Flex } from '../../components'; import { formatSiUnit } from '../../format'; import { MaterialIcon } from './MaterialIcon'; import { Material } from './Types'; @@ -57,7 +57,7 @@ export const MaterialAccessBar = (props: MaterialAccessBarProps) => { {sortBy((m: Material) => MATERIAL_RARITY[m.name])(availableMaterials).map( (material) => ( - + { const { material, onEjectRequested, SHEET_MATERIAL_AMOUNT } = props; - const [hovering, setHovering] = useLocalState( - `MaterialCounter__${material.name}`, - false, - ); + const [hovering, setHovering] = useState(false); const sheets = material.amount / SHEET_MATERIAL_AMOUNT; @@ -98,7 +95,7 @@ const MaterialCounter = (props: MaterialCounterProps) => { sheets < 1 && 'MaterialDock--disabled', ])} > - + { )} - + ); }; diff --git a/tgui/packages/tgui/interfaces/FishCatalog.tsx b/tgui/packages/tgui/interfaces/FishCatalog.tsx index 2a3db324b3c..01efc5e3531 100644 --- a/tgui/packages/tgui/interfaces/FishCatalog.tsx +++ b/tgui/packages/tgui/interfaces/FishCatalog.tsx @@ -2,8 +2,9 @@ import { sortBy } from 'common/collections'; import { flow } from 'common/fp'; import { classes } from 'common/react'; import { capitalize } from 'common/string'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Box, Button, LabeledList, Section, Stack } from '../components'; import { Window } from '../layouts'; @@ -40,10 +41,7 @@ export const FishCatalog = (props) => { const fish_by_name = flow([sortBy((fish: FishInfo) => fish.name)])( fish_info || [], ); - const [currentFish, setCurrentFish] = useLocalState( - 'currentFish', - null, - ); + const [currentFish, setCurrentFish] = useState(null); return ( diff --git a/tgui/packages/tgui/interfaces/FishingCalculator.tsx b/tgui/packages/tgui/interfaces/FishingCalculator.tsx index fc13246eb2f..7daf82fa60e 100644 --- a/tgui/packages/tgui/interfaces/FishingCalculator.tsx +++ b/tgui/packages/tgui/interfaces/FishingCalculator.tsx @@ -1,6 +1,7 @@ import { round } from 'common/math'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Button, Dropdown, Input, Stack, Table } from '../components'; import { TableCell, TableRow } from '../components/Table'; import { Window } from '../layouts'; @@ -23,14 +24,11 @@ type FishingCalculatorData = { export const FishingCalculator = (props) => { const { act, data } = useBackend(); - const [bait, setBait] = useLocalState( - 'bait', - '/obj/item/food/bait/worm', - ); - const [spot, setSpot] = useLocalState('spot', data.spot_types[0]); - const [rod, setRod] = useLocalState('rod', data.rod_types[0]); - const [hook, setHook] = useLocalState('hook', data.hook_types[0]); - const [line, setLine] = useLocalState('line', data.line_types[0]); + const [bait, setBait] = useState('/obj/item/food/bait/worm'); + const [spot, setSpot] = useState(data.spot_types[0]); + const [rod, setRod] = useState(data.rod_types[0]); + const [hook, setHook] = useState(data.hook_types[0]); + const [line, setLine] = useState(data.line_types[0]); const weight_sum = data.info?.reduce((s, w) => s + w.weight, 0) || 1; diff --git a/tgui/packages/tgui/interfaces/FishingRod.tsx b/tgui/packages/tgui/interfaces/FishingRod.tsx index a17108cd030..cd1b87051c6 100644 --- a/tgui/packages/tgui/interfaces/FishingRod.tsx +++ b/tgui/packages/tgui/interfaces/FishingRod.tsx @@ -64,7 +64,7 @@ export const FishingRod = (props) => { } = data; return ( - +
{ + const { act, data } = useBackend(); + const { has_case, has_implant, case_information } = data; + const textHtml = { + __html: sanitizeText(case_information), + }; + return ( + + + + + Implant Mini-Computer + + + + + + + + + {!has_case && + 'No implant case detected. Please insert one to see its contents.'} + {!!has_case && + !has_implant && + 'Implant case does not have an implant. Please insert one to continue.'} + {!!has_case && !!has_implant && ( + + )} + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/InfuserBook.tsx b/tgui/packages/tgui/interfaces/InfuserBook.tsx index dba6626cf64..2fee65c5917 100644 --- a/tgui/packages/tgui/interfaces/InfuserBook.tsx +++ b/tgui/packages/tgui/interfaces/InfuserBook.tsx @@ -1,7 +1,8 @@ import { paginate, range } from 'common/collections'; import { multiline } from 'common/string'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { BlockQuote, Box, Button, Section, Stack, Tabs } from '../components'; import { Window } from '../layouts'; @@ -73,13 +74,10 @@ export const InfuserBook = (props) => { const { data, act } = useBackend(); const { entries } = data; - const [bookPosition, setBookPosition] = useLocalState( - 'bookPosition', - { - chapter: 0, - pageInChapter: 0, - }, - ); + const [bookPosition, setBookPosition] = useState({ + chapter: 0, + pageInChapter: 0, + }); const { chapter, pageInChapter } = bookPosition; const paginatedEntries = paginateEntries(entries); diff --git a/tgui/packages/tgui/interfaces/Jukebox.jsx b/tgui/packages/tgui/interfaces/Jukebox.jsx index 43d41d30358..37b2e4a3760 100644 --- a/tgui/packages/tgui/interfaces/Jukebox.jsx +++ b/tgui/packages/tgui/interfaces/Jukebox.jsx @@ -64,7 +64,7 @@ export const Jukebox = (props) => { value={volume} unit="%" minValue={0} - maxValue={100} // Bubberstation change: 100 is the max (but not really!!!!). + maxValue={100} step={1} stepPixelSize={1} disabled={active} diff --git a/tgui/packages/tgui/interfaces/LibraryAdmin.tsx b/tgui/packages/tgui/interfaces/LibraryAdmin.tsx index dca8732454c..f805a46c7fb 100644 --- a/tgui/packages/tgui/interfaces/LibraryAdmin.tsx +++ b/tgui/packages/tgui/interfaces/LibraryAdmin.tsx @@ -1,6 +1,7 @@ import { map, sortBy } from 'common/collections'; import { flow } from 'common/fp'; import { capitalize } from 'common/string'; +import { useState } from 'react'; import { useBackend, useLocalState } from '../backend'; import { @@ -337,7 +338,7 @@ const ModifyPage = (props) => { const { can_db_request, view_raw, history } = data; const [modifyMethod, setModifyMethod] = useLocalState('ModifyMethod', ''); const [modifyTarget, setModifyTarget] = useLocalState('ModifyTarget', 0); - const [reason, setReason] = useLocalState('Reason', 'null'); + const [reason, setReason] = useState('null'); const entries = history[modifyTarget.toString()] ? history[modifyTarget.toString()].sort((a, b) => b.id - a.id) @@ -345,7 +346,7 @@ const ModifyPage = (props) => { return ( - + Heads Up! We do not allow you to fully delete books in game
What you're doing here is a "don't show this to diff --git a/tgui/packages/tgui/interfaces/LibraryConsole.jsx b/tgui/packages/tgui/interfaces/LibraryConsole.jsx index fbcf5666861..5587b5fd5c1 100644 --- a/tgui/packages/tgui/interfaces/LibraryConsole.jsx +++ b/tgui/packages/tgui/interfaces/LibraryConsole.jsx @@ -1,6 +1,7 @@ import { map, sortBy } from 'common/collections'; import { flow } from 'common/fp'; import { classes } from 'common/react'; +import { useState } from 'react'; import { useBackend, useLocalState } from '../backend'; import { @@ -270,15 +271,9 @@ const CheckoutModal = (props) => { ])(data.inventory); const [checkoutBook, setCheckoutBook] = useLocalState('CheckoutBook', false); - const [bookName, setBookName] = useLocalState( - 'CheckoutBookName', - 'Insert Book name...', - ); - const [checkoutee, setCheckoutee] = useLocalState('Checkoutee', 'Recipient'); - const [checkoutPeriod, setCheckoutPeriod] = useLocalState( - 'CheckoutPeriod', - 5, - ); + const [bookName, setBookName] = useState('Insert Book name...'); + const [checkoutee, setCheckoutee] = useState('Recipient'); + const [checkoutPeriod, setCheckoutPeriod] = useState(5); return ( @@ -420,6 +415,7 @@ export const SearchAndDisplay = (props) => { @@ -644,7 +640,7 @@ const UploadModal = (props) => { const { upload_categories, default_category, can_db_request } = data; const [uploadToDB, setUploadToDB] = useLocalState('UploadDB', false); - const [uploadCategory, setUploadCategory] = useLocalState('ModalUpload', ''); + const [uploadCategory, setUploadCategory] = useState(''); const display_category = uploadCategory || default_category; return ( @@ -696,10 +692,7 @@ const UploadModal = (props) => { export const Print = (props) => { const { act, data } = useBackend(); const { deity, religion, bible_name, bible_sprite, posters } = data; - const [selectedPoster, setSelectedPoster] = useLocalState( - 'selected_poster', - posters[0], - ); + const [selectedPoster, setSelectedPoster] = useState(posters[0]); return ( diff --git a/tgui/packages/tgui/interfaces/LightController.tsx b/tgui/packages/tgui/interfaces/LightController.tsx index af1d71681a6..810b644f90f 100644 --- a/tgui/packages/tgui/interfaces/LightController.tsx +++ b/tgui/packages/tgui/interfaces/LightController.tsx @@ -1,6 +1,8 @@ +import { useState } from 'react'; + import { round } from '../../common/math'; import { BooleanLike, classes } from '../../common/react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Box, Button, Knob, Section, Slider, Stack, Tabs } from '../components'; import { Window } from '../layouts'; @@ -50,14 +52,8 @@ export const LightController = (props) => { default_category, category_ids, } = data; - const [currentTemplate, setCurrentTemplate] = useLocalState( - 'currentTemplate', - default_id, - ); - const [currentCategory, setCurrentCategory] = useLocalState( - 'currentCategory', - default_category, - ); + const [currentTemplate, setCurrentTemplate] = useState(default_id); + const [currentCategory, setCurrentCategory] = useState(default_category); const category_keys = category_ids ? Object.keys(category_ids) : []; diff --git a/tgui/packages/tgui/interfaces/LightSpawn.tsx b/tgui/packages/tgui/interfaces/LightSpawn.tsx index 08efda02934..68e3430d817 100644 --- a/tgui/packages/tgui/interfaces/LightSpawn.tsx +++ b/tgui/packages/tgui/interfaces/LightSpawn.tsx @@ -1,3 +1,5 @@ +import { useState } from 'react'; + import { classes } from '../../common/react'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Knob, Section, Slider, Stack, Tabs } from '../components'; @@ -40,14 +42,8 @@ type Data = { export const LightSpawn = (props) => { const { act, data } = useBackend(); const { templates = [], default_id, default_category, category_ids } = data; - const [currentTemplate, setCurrentTemplate] = useLocalState( - 'currentTemplate', - default_id, - ); - const [currentCategory, setCurrentCategory] = useLocalState( - 'currentCategory', - default_category, - ); + const [currentTemplate, setCurrentTemplate] = useState(default_id); + const [currentCategory, setCurrentCategory] = useState(default_category); const category_keys = category_ids ? Object.keys(category_ids) : []; diff --git a/tgui/packages/tgui/interfaces/LingMMITalk.tsx b/tgui/packages/tgui/interfaces/LingMMITalk.tsx index 3cbd0d3af7f..9f4effb2e66 100644 --- a/tgui/packages/tgui/interfaces/LingMMITalk.tsx +++ b/tgui/packages/tgui/interfaces/LingMMITalk.tsx @@ -1,4 +1,6 @@ -import { useBackend, useLocalState } from '../backend'; +import { useState } from 'react'; + +import { useBackend } from '../backend'; import { Button, ByondUi, Stack, TextArea } from '../components'; import { Window } from '../layouts'; @@ -8,7 +10,7 @@ type Data = { export const LingMMITalk = (props) => { const { data, act } = useBackend(); - const [mmiMessage, setmmiMessage] = useLocalState('textArea', ''); + const [mmiMessage, setmmiMessage] = useState(''); return ( diff --git a/tgui/packages/tgui/interfaces/ListInputModal.tsx b/tgui/packages/tgui/interfaces/ListInputModal.tsx index e45e5736507..07273452d0c 100644 --- a/tgui/packages/tgui/interfaces/ListInputModal.tsx +++ b/tgui/packages/tgui/interfaces/ListInputModal.tsx @@ -1,3 +1,5 @@ +import { useState } from 'react'; + import { KEY_A, KEY_DOWN, @@ -6,7 +8,7 @@ import { KEY_UP, KEY_Z, } from '../../common/keycodes'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Autofocus, Button, Input, Section, Stack } from '../components'; import { Window } from '../layouts'; import { InputButtons } from './common/InputButtons'; @@ -31,18 +33,9 @@ export const ListInputModal = (props) => { timeout, title, } = data; - const [selected, setSelected] = useLocalState( - 'selected', - items.indexOf(init_value), - ); - const [searchBarVisible, setSearchBarVisible] = useLocalState( - 'searchBarVisible', - items.length > 9, - ); - const [searchQuery, setSearchQuery] = useLocalState( - 'searchQuery', - '', - ); + const [selected, setSelected] = useState(items.indexOf(init_value)); + const [searchBarVisible, setSearchBarVisible] = useState(items.length > 9); + const [searchQuery, setSearchQuery] = useState(''); // User presses up or down on keyboard // Simulates clicking an item const onArrowKey = (key: number) => { diff --git a/tgui/packages/tgui/interfaces/LogViewer.tsx b/tgui/packages/tgui/interfaces/LogViewer.tsx index 65f1a4f9619..ffdd18a730f 100644 --- a/tgui/packages/tgui/interfaces/LogViewer.tsx +++ b/tgui/packages/tgui/interfaces/LogViewer.tsx @@ -227,11 +227,7 @@ const CategoryViewer = (props: CategoryViewerProps) => { return ( - +

{entry.message}

diff --git a/tgui/packages/tgui/interfaces/MafiaPanel.tsx b/tgui/packages/tgui/interfaces/MafiaPanel.tsx index 99c795d6364..d00a498062c 100644 --- a/tgui/packages/tgui/interfaces/MafiaPanel.tsx +++ b/tgui/packages/tgui/interfaces/MafiaPanel.tsx @@ -1,8 +1,9 @@ import { BooleanLike, classes } from 'common/react'; import { decodeHtmlEntities } from 'common/string'; import { multiline } from 'common/string'; +import { useState } from 'react'; -import { useBackend, useLocalState } from '../backend'; +import { useBackend } from '../backend'; import { Box, Button, @@ -68,7 +69,7 @@ type MafiaData = { export const MafiaPanelData = (props) => { const { act, data } = useBackend(); const { phase, roleinfo, admin_controls, messages, player_voted_up } = data; - const [mafia_tab, setMafiaMode] = useLocalState('mafia_tab', 'Role list'); + const [mafia_tab, setMafiaMode] = useState('Role list'); if (phase === 'No Game') { return ( @@ -180,7 +181,7 @@ export const MafiaPanel = (props) => { const MafiaChat = (props) => { const { act, data } = useBackend(); const { messages } = data; - const [message_to_send, setMessagingBox] = useLocalState('Chat', ''); + const [message_to_send, setMessagingBox] = useState(''); return ( {!!messages && ( @@ -364,7 +365,7 @@ const MafiaListOfRoles = (props) => { const MafiaNotesTab = (props) => { const { act, data } = useBackend(); const { user_notes } = data; - const [note_message, setNotesMessage] = useLocalState('Notes', user_notes); + const [note_message, setNotesMessage] = useState(user_notes); return (